kubectl 补丁:是否可以在单个补丁执行中将多个值添加到数组
kubectl patch: Is it possible to add multiple values to an array within a sinlge patch execution
我尝试使用 kubectl patch
将另外两个值添加到 kubernetes 部署的 args 列表中。我已经查看了官方记录的 (https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/) 变体,但未能一次添加多个值。
假设这个简单的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
name: test
template:
metadata:
labels:
name: test
name: test
spec:
containers:
- image: alpine
name: test
command:
- echo
args:
- my
- text
我现在想将附加值附加到 args
部分。这一次适用于单个值:
添加一个附加值
kubectl patch deployments.apps test --type=json -p='[{"op": "add", "path": "/spec/t
emplate/spec/containers/0/args/-", "value": "additional" }]'
这有效并给我留下了以下内容:
...
args:
- my
- text
- additional
但是运行带有值数组的补丁给我一个错误:
# running:
k patch deployments.apps test --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": ["additional","text"] }]'
# results in:
The request is invalid: patch: Invalid value: "...": v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Args: []string: ReadString: expects " or n, but found [, error found in #10 byte of ...|itional",["additiona|..., bigger context ...|{"containers":[{"args":["my","text","additional",["additional","text"]],"command":["echo"],"image":"|...
有谁知道在单个补丁命令中向数组添加多个值而不覆盖整个 args 数组的方法吗?感谢您的帮助。
您可以使用kubectl edit
命令编辑资源。
用法示例:
kubectl edit deploy <deployment_name>
更多信息,请参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#edit。
编辑:有一种讨厌的编程方式。您可以将 yaml 通过管道传输到 python,更改您想要更改的值并应用新的 yaml。在你的情况下,它会是这样的,
kubectl get deploy <deploy_name> -o yaml | python -c 'import sys,yaml; yml = yaml.safe_load(sys.stdin); yml["spec"]["template"]["spec"]["containers"][0]["args"].extend(["newValue1", "newValue2"]); print(yaml.dump(yml));' | kubectl apply -f -
显然,只有在没有更简单的方法时,您才想这样做。
下面使用了一个补丁,但不是很干:
kubectl patch deployment <deployment-name> -n <namespace> --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-1"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-2"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-3"}]'
我一直在为 cert-manager 做类似的事情以允许完全自动化的 TLS:
kubectl patch deployment cert-manager -n cert-manager --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-name=letsencrypt-prod"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-kind=ClusterIssuer"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-group=cert-manager.io"}]'
我发现的最简单的方法是使用 jq
来编辑 json,而不是:
kubectl patch deployment <deployment-name> -n <namespace> --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-1"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-2"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-3"}]'
您可以使用:
kubectl get deployment <deployment-name> -n <namespace> -o json \
| jq '.spec.template.spec.containers[0].args += ["arg-1", "arg-2", "arg-3"]' \
| kubectl apply -f -
这有一个优点:它甚至允许注入诸如修补权限之类的对象。示例 (taken from the requirements for upgrading coredns to 1.8.3):
kubectl get clusterrole system:coredns -n kube-system -o json \
| jq '.rules += [{"apiGroups":["discovery.k8s.io"],"resources":["endpointslices"],"verbs":["list","watch"]}]' \
| kubectl apply -f -
另一个优点:申请前测试非常容易,只需删除 kubectl apply -f -
部分:
kubectl get clusterrole system:coredns -n kube-system -o json \
| jq '.rules += [{"apiGroups":["discovery.k8s.io"],"resources":["endpointslices"],"verbs":["list","watch"]}]' \
我尝试使用 kubectl patch
将另外两个值添加到 kubernetes 部署的 args 列表中。我已经查看了官方记录的 (https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/) 变体,但未能一次添加多个值。
假设这个简单的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
name: test
template:
metadata:
labels:
name: test
name: test
spec:
containers:
- image: alpine
name: test
command:
- echo
args:
- my
- text
我现在想将附加值附加到 args
部分。这一次适用于单个值:
添加一个附加值
kubectl patch deployments.apps test --type=json -p='[{"op": "add", "path": "/spec/t
emplate/spec/containers/0/args/-", "value": "additional" }]'
这有效并给我留下了以下内容:
...
args:
- my
- text
- additional
但是运行带有值数组的补丁给我一个错误:
# running:
k patch deployments.apps test --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": ["additional","text"] }]'
# results in:
The request is invalid: patch: Invalid value: "...": v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Args: []string: ReadString: expects " or n, but found [, error found in #10 byte of ...|itional",["additiona|..., bigger context ...|{"containers":[{"args":["my","text","additional",["additional","text"]],"command":["echo"],"image":"|...
有谁知道在单个补丁命令中向数组添加多个值而不覆盖整个 args 数组的方法吗?感谢您的帮助。
您可以使用kubectl edit
命令编辑资源。
用法示例:
kubectl edit deploy <deployment_name>
更多信息,请参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#edit。
编辑:有一种讨厌的编程方式。您可以将 yaml 通过管道传输到 python,更改您想要更改的值并应用新的 yaml。在你的情况下,它会是这样的,
kubectl get deploy <deploy_name> -o yaml | python -c 'import sys,yaml; yml = yaml.safe_load(sys.stdin); yml["spec"]["template"]["spec"]["containers"][0]["args"].extend(["newValue1", "newValue2"]); print(yaml.dump(yml));' | kubectl apply -f -
显然,只有在没有更简单的方法时,您才想这样做。
下面使用了一个补丁,但不是很干:
kubectl patch deployment <deployment-name> -n <namespace> --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-1"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-2"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-3"}]'
我一直在为 cert-manager 做类似的事情以允许完全自动化的 TLS:
kubectl patch deployment cert-manager -n cert-manager --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-name=letsencrypt-prod"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-kind=ClusterIssuer"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--default-issuer-group=cert-manager.io"}]'
我发现的最简单的方法是使用 jq
来编辑 json,而不是:
kubectl patch deployment <deployment-name> -n <namespace> --type "json" -p '[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-1"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-2"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"arg-3"}]'
您可以使用:
kubectl get deployment <deployment-name> -n <namespace> -o json \
| jq '.spec.template.spec.containers[0].args += ["arg-1", "arg-2", "arg-3"]' \
| kubectl apply -f -
这有一个优点:它甚至允许注入诸如修补权限之类的对象。示例 (taken from the requirements for upgrading coredns to 1.8.3):
kubectl get clusterrole system:coredns -n kube-system -o json \
| jq '.rules += [{"apiGroups":["discovery.k8s.io"],"resources":["endpointslices"],"verbs":["list","watch"]}]' \
| kubectl apply -f -
另一个优点:申请前测试非常容易,只需删除 kubectl apply -f -
部分:
kubectl get clusterrole system:coredns -n kube-system -o json \
| jq '.rules += [{"apiGroups":["discovery.k8s.io"],"resources":["endpointslices"],"verbs":["list","watch"]}]' \