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

u0sqgete  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(98)

我有一个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客户端有一个等效的方法?

vc9ivgsu

vc9ivgsu1#

我希望有一个更优雅的方法,但直到我了解它,我设法添加一个标签到一个Pod使用Patch。这是我的演示代码(再次它有一些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)
        }
    }
}

字符串

x3naxklr

x3naxklr2#

我尝试使用client-go向一个节点添加一个新的标签,基于OP's code snippet,我使用的最短路径如下。

labelPatch := fmt.Sprintf(`[{"op":"add","path":"/metadata/labels/%s","value":"%s" }]`, labelkey, labelValue)
_, err = kc.CoreV1().Nodes().Patch(node.Name, types.JSONPatchType, []byte(labelPatch))

字符串
注意:add/metadata/labels覆盖所有现有标签,因此我选择/metadata/labels/${LABEL_KEY}的路径以仅添加新标签

相关问题