创建补丁以添加kubernetes批注

时间:2019-04-08 12:39:29

标签: go kubernetes webhooks patch

我想写一个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没有帮助。

3 个答案:

答案 0 :(得分:10)

对我来说,更容易使用annotate而不是patch

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

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

答案 1 :(得分:4)

/中的正斜杠(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://tools.ietf.org/html/rfc6901#section-3

答案 2 :(得分:0)

仅使用:

[{"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"}
]