Kubernetes API:向Pod添加标签

20

使用命令,我可以添加标签如下

kubectl label pod POD_NAME KEY1=VALUE1

我该如何从Kubernetes API中实现这个操作?

我猜可以通过PATCH /api/v1/namespaces/{namespace}/pods/{name}完成。

这里是pod.json。

{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "labels": {
            "key1": "value1"
        }
    }
}

我尝试了以下命令

KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)
curl --request PATCH --insecure \
      --header "Authorization: Bearer $KUBE_TOKEN"  \
      --data "$(cat pod.json)" \
      https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$POD_NAMESPACE/pods/$POD_NAME

它返回

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "the server responded with the status code 415 but did not return more information",
  "details": {},
  "code": 415
}
2个回答

15

将内容类型设置为application/json-patch+json并在http://jsonpatch.org格式中指定补丁。

$ cat > patch.json <<EOF
[ 
 { 
 "op": "add", "path": "/metadata/labels/hello", "value": "world" 
 } 
]
EOF
$ curl --request PATCH --data "$(cat patch.json)" -H "Content-Type:application/json-patch+json" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/$POD_NAMESPACE/pods/$POD_NAME  

Content-Type: application/merge-patch+json 对我有效。 - Mr.Wang from Next Door
1
我已经尝试添加简单的标签,例如在上面的例子中添加“hello=world”。但是,您能否使用此方法添加类似于“domain.com/hello=world”的标签?“path”:“/ metadata / labels / domain.com / hello”似乎不起作用,我尝试了各种方法来转义“domain.com/hello”中的“/”,但都没有成功。 - David McKinley
你尝试过合并补丁吗?在 https://github.com/kubernetes/kubernetes/blob/master/docs/devel/api-conventions.md 中搜索“merge”。 - Eric Tune
1
@DavidMcKinley,如果您需要引用名称中带有~/的键,则必须分别将它们替换为~0~1。因此,对于您的示例"path":"/metadata/labels/domain.com~1hello" - Merlijn Sebrechts

0
为了正确使用JSON Patch,您必须将内容类型设置为RFC6902中定义的application/json-patch+json。对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接