【问题标题】:Kubernetes API : add label to podKubernetes API:为 pod 添加标签
【发布时间】:2019-11-11 00:30:00
【问题描述】:

通过命令,我可以添加如下标签

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
}

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    将 content-type 设置为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 为我工作
    • 在上面的示例中,我这样做是为了添加简单的标签,例如:“hello=world”。但是,您可以使用这种方法添加一个标签,例如:“domain.com/hello=world”吗? "path":"/metadata/labels/domain.com/hello" 似乎不起作用,我尝试转义 "domain.com/hello" 中的 "/" 的各种方法也不起作用。
    • 你试过合并补丁吗?在github.com/kubernetes/kubernetes/blob/master/docs/devel/…中搜索合并
    • @DavidMcKinley,如果您需要引用名称中带有~/ 的密钥,则必须分别将它们替换为~0~1。所以对于你的例子"path":"/metadata/labels/domain.com~1hello"
    猜你喜欢
    • 2020-11-19
    • 2020-09-11
    • 2019-02-22
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多