创建补丁以添加 kubernetes 注释
Create a patch to add a kubernetes annotation
我想写一个 mutating webhook 来为所有没有明确提供的入口对象添加默认入口 class。
根据 examples,我发现我需要为 return.
的 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"}]
这样的东西因为包含斜杠而不起作用。
长话短说:使用适当的补丁简单添加入口 class 的正确方法是什么?
PS:是的,我知道 kubectl annotate
,但不幸的是,这对我的 webhook 没有帮助。
将 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
对我来说更容易的是 annotate
而不是 patch
:
kubectl annotate ingress mying kubernetes.io/ingress.class=value
如果您想在应用更改之前对其进行测试,请添加 --dry-run -o yaml
标记。
仅使用:
[{"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"}
]
我想写一个 mutating webhook 来为所有没有明确提供的入口对象添加默认入口 class。
根据 examples,我发现我需要为 return.
的 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"}]
这样的东西因为包含斜杠而不起作用。
长话短说:使用适当的补丁简单添加入口 class 的正确方法是什么?
PS:是的,我知道 kubectl annotate
,但不幸的是,这对我的 webhook 没有帮助。
将 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
对我来说更容易的是 annotate
而不是 patch
:
kubectl annotate ingress mying kubernetes.io/ingress.class=value
如果您想在应用更改之前对其进行测试,请添加 --dry-run -o yaml
标记。
仅使用:
[{"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"}
]