【问题标题】:Create a patch to add a kubernetes annotation创建补丁以添加 Kubernetes 注释
【发布时间】:2020-04-30 21:58:23
【问题描述】:

我想写一个mutating webhook 为所有没有明确提供的入口对象添加一个默认入口类。

根据examples,我发现我需要为 webhook 提供适当的 json 补丁才能返回。

我首先使用 kubectl 尝试了我的补丁:

$ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations/key", "value":"value"}]'
The  "" is invalid

当还没有注释元素时,这似乎不起作用。

$ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations", "value":{"key":"value"}}]'
ingress.extensions/kafka-monitoring-topics-ui patched

创建完整的注释元素可以正常工作,但在我的情况下,我需要一个包含斜杠的 kubernetes.io/ingress.class 键。

kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations", "value":{"kubernetes.io/ingress.class":"value"}}]'
ingress.extensions/kafka-monitoring-topics-ui patched

这在创建注释对象时可以正常工作。但是,如果已经有一些注释,而我只想添加一个,那么添加一个似乎是不可能的。

简单地使用[{"op": "add", "path": "/metadata/annotations", "value":{"kubernetes.io/ingress.class":"value"}}] 会删除所有现有的注释,而'[{"op": "add", "path": "/metadata/annotations/kubernetes.io/ingress.class", "value": "value"}] 之类的东西由于包含斜线而不起作用。

长话短说:使用适当的补丁简单地添加入口类的正确方法是什么?

PS:是的,我知道 kubectl annotate,但不幸的是,这对我的 webhook 没有帮助。

【问题讨论】:

    标签: go kubernetes webhooks patch


    【解决方案1】:

    对我来说更容易的是annotate而不是patch

    kubectl annotate ingress mying kubernetes.io/ingress.class=value
    

    如果您想在应用更改之前对其进行测试,请添加 --dry-run -o yaml 标志。

    【讨论】:

    • kubectl annotate 是一个不错的实用工具。但请注意,OP 明确提到他们知道这一点,并且不适用于他们的用例
    • 是的,但这与这里的其他一些人有关
    【解决方案2】:

    kubernetes.io/ingress.class 中的正斜杠(/)替换为~1

    你的命令应该是这样的,

    $ kubectl patch ingress mying --type='json' -p='[{"op": "add", "path": "/metadata/annotations/kubernetes.io~1ingress.class", "value":"nginx"}]'
    

    参考: RFC 6901 https://www.rfc-editor.org/rfc/rfc6901#section-3

    【讨论】:

    • 哦,太好了。非常感谢!我还不知道 JSON 指针。以这种方式添加类可能仅在注释对象已经存在时才有效。 - 看来我必须分别处理这两种情况。
    【解决方案3】:

    仅使用:

    [{"op": "add", "path": "/metadata/annotations/kubernetes.io~1ingress.class", "value":"nginx"}]
    

    当创建的 pod 没有注解时不起作用,例如来自kubectl run --generator=run-pod/v1 --attach test-deploy --image=busybox ls

    要检测这一点,您需要一个单独的解析步骤到带有指针注释的元数据中,以便它可以被检测为 nil,或者总是在它为空时发送一个空注释:

    type Metadata struct {
        Annotations  *map[string]string
    }
    
    type ObjectWithMeta struct {
        Metadata Metadata
    }
    

    然后发送:

    [
      {"op":"add","path":"/metadata/annotations","value":{}},
      {"op":"add","path":"/metadata/annotations/foo","value": "bar"}
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多