[英]What's the shortest way to add a label to a Pod using the Kubernetes go-client
I have a demo golang program to list Pods without a particular label.我有一个演示 golang 程序来列出没有特定标签的 Pod。 I want to modify it so it also can add a label to each pod.我想修改它,以便它还可以为每个 pod 添加一个标签。
(I'm using the AWS hosted Kubernetes service, EKS so there's some boilerplate code specific to EKS ) (我使用的是 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")
}
}
I know kubectl can be used to add labels, eg我知道 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
I was hoping there would be an equivalent method via the go-client?我希望通过 go-client 有一个等效的方法?
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
.我希望有一种更优雅的方式,但在我了解它之前,我设法使用Patch
将标签添加到 Pod。 Here is my demo code (again it has some EKS boilerplate stuff you may be able to ignore):这是我的演示代码(同样有一些 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)
}
}
}
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.我试图根据OP 的代码片段使用 client-go 向节点添加新标签,我使用的最短路径如下。
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注意: add
到/metadata/labels
将覆盖所有现有标签,因此我选择/metadata/labels/${LABEL_KEY}
的路径仅添加新标签
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.