What's the shortest way to add a label to a Pod using the Kubernetes go-client

后端 未结 2 451
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-27 05:18

I have a demo golang program to list Pods without a particular label. I want to modify it so it also can add a label to each pod.

(I\'m using the AWS hosted Kubernetes s

相关标签:
2条回答
  • 2021-01-27 05:42

    I'm hoping there is a more elegant way, but until I learn about it, I managed to add a label to a Pod using Patch. Here is my demo code (again it has some EKS boilerplate stuff you may be able to ignore):

    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)
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-27 05:53

    I was trying to add a new label to a node using client-go, based on OP's code snippet, the shortest path that I used is as follow.

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

    Note: add to /metadata/labels will overwrite all existing labels, so I choose the path to /metadata/labels/${LABEL_KEY} to only add the new label

    0 讨论(0)
提交回复
热议问题