go - 使用 "/"字符修补 kubernetes 标签

标签 go kubernetes label patch kubernetes-go-client

我有 following code这工作正常。它添加了标签 example: yes在 kubernetes 对象中:

package main

import (
    "fmt"
    "encoding/json"
    "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{})

    for i, pod := range pods.Items {

        payload := []patchStringValue{{
            Op:    "replace",
            Path:  "/metadata/labels/example",
            Value: "yes",
        }}
        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)
        }
    }
}
问题是我需要添加标签example/test , 包含字符 / ,我认为这是我问题的根源。使用有效负载执行前面的代码时:
        payload := []patchStringValue{{
            Op:    "replace",
            Path:  "/metadata/labels/test/example",
            Value: "yes",
        }}
我收到错误:"the server rejected our request due to an error in our request" .
我知道另一种方法是使用 Update而不是 Patch .但是是否有使用 Patch 解决此问题的任何方法? ?

最佳答案

根据 JSON pointer notation spec使用哪个JSON补丁,需要使用~1编码 / .所以你的有效载荷将变成如下:

        payload := []patchStringValue{{
            Op:    "replace",
            Path:  "/metadata/labels/test~1example",
            Value: "yes",
        }}
# kubectl patch deploy mydeployment --type='json' -p='[{"op": "replace", "path": "/metadata/labels/example~1test", "value":"yes"}]'
deployment.apps/mydeployment patched


# kubectl get deploy mydeployment -o=jsonpath='{@.metadata.labels}'
map[example/test:yes]

关于go - 使用 "/"字符修补 kubernetes 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65887327/

相关文章:

swift - 如何快速点击标签?

html - 如果我添加 css : top,包装器会向右移动

python /tkinter : Events: call a function by mouse on widget

go - 将 base64 字符串转换为 int 以在 Go 中使用加密

amazon-web-services - 在没有负载均衡器的情况下向公共(public) Internet 公开 K8s TCP 服务端点

kubernetes - OpenEBS是否支持Jiva Volumes的ReadOnlyMany选项?

kubernetes - 如何向 kubernetes ManagedCertificate 添加新的子域?

json - 如何从 URL 解析 JSON

go - 为什么 go build 会因为 regexp.MustCompile 解析错误而成功?

javascript - 将图像作为正文附加到 golang 服务器的 POST 请求中