gpt4 book ai didi

go - 使用 Kubernetes go-client 向 Pod 添加标签的最短方法是什么

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:38 26 4
gpt4 key购买 nike

我有一个演示 golang 程序来列出没有特定标签的 Pod。我想修改它,以便它也可以为每个 pod 添加标签。

(我正在使用 AWS 托管的 Kubernetes 服务 EKS,所以有一些特定于 EKS 的样板代码)

package main

import (
"fmt"
eksauth "github.com/chankh/eksutil/pkg/auth"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func main() {
cfg := &eksauth.ClusterConfig{ClusterName: "my_cluster_name"}

clientset, _ := eksauth.NewAuthClient(cfg)
api := clientset.CoreV1()

// Get all pods from all namespaces without the "sent_alert_emailed" label.
pods, _ := api.Pods("").List(metav1.ListOptions{LabelSelector: "!sent_alert_emailed"})

for i, pod := range pods.Items {
fmt.Println(fmt.Sprintf("[%2d] %s, Phase: %s, Created: %s, HostIP: %s", i, pod.GetName(), string(pod.Status.Phase), pod.GetCreationTimestamp(), string(pod.Status.HostIP)))

// Here I want to add a label to this pod
// e.g. something like:
// pod.addLabel("sent_alert_emailed=true")
}
}

我知道 kubectl 可以用来添加标签,例如

kubectl label pod my-pod new-label=awesome                 # Add a Label
kubectl label pod my-pod new-label=awesomer --overwrite # Change a existing label

我希望通过 go-client 有一个等效的方法?

最佳答案

我希望有更优雅的方法,但在我了解它之前,我设法使用 Patch 将标签添加到 Pod。这是我的演示代码(同样它有一些您可以忽略的 EKS 样板文件):

package main

import (
"fmt"
"encoding/json"
"time"
"k8s.io/apimachinery/pkg/types"

eksauth "github.com/chankh/eksutil/pkg/auth"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type patchStringValue struct {
Op string `json:"op"`
Path string `json:"path"`
Value string `json:"value"`
}

func main() {
var updateErr error

cfg := &eksauth.ClusterConfig{ClusterName: "my cluster name"}
clientset, _ := eksauth.NewAuthClient(cfg)
api := clientset.CoreV1()

// Get all pods from all namespaces without the "sent_alert_emailed" label.
pods, _ := api.Pods("").List(metav1.ListOptions{LabelSelector: "!sent_alert_emailed"})

for i, pod := range pods.Items {
fmt.Println(fmt.Sprintf("[%2d] %s, Phase: %s, Created: %s, HostIP: %s", i, pod.GetName(), string(pod.Status.Phase), pod.GetCreationTimestamp(), string(pod.Status.HostIP)))

payload := []patchStringValue{{
Op: "replace",
Path: "/metadata/labels/sent_alert_emailed",
Value: time.Now().Format("2006-01-02_15.04.05"),
}}
payloadBytes, _ := json.Marshal(payload)

_, updateErr = api.Pods(pod.GetNamespace()).Patch(pod.GetName(), types.JSONPatchType, payloadBytes)
if updateErr == nil {
fmt.Println(fmt.Sprintf("Pod %s labelled successfully.", pod.GetName()))
} else {
fmt.Println(updateErr)
}
}
}

关于go - 使用 Kubernetes go-client 向 Pod 添加标签的最短方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com