kubectl补丁:是否可以在单次补丁执行中向数组添加多个值

时间:2020-06-25 15:21:48

标签: json kubernetes patch

我尝试使用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":"|...

有人知道一种在单个patch命令中向数组添加多变量值而又不覆盖整个args数组的方法吗?感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

下面使用一个补丁,但不是很干:

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"}]'

答案 1 :(得分:2)

您可以使用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 -

很明显,只有在没有更简单的方法时,您才想这样做。