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

jon*_*nny 3 json patch kubernetes

我尝试使用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
Run Code Online (Sandbox Code Playgroud)

我现在想向该args部分附加其他值。这一次只适用于一个值:

添加单个附加值

kubectl patch deployments.apps test --type=json -p='[{"op": "add", "path": "/spec/t
emplate/spec/containers/0/args/-", "value": "additional" }]'
Run Code Online (Sandbox Code Playgroud)

这有效,并给我留下了以下内容:

...
        args:
        - my
        - text
        - additional
Run Code Online (Sandbox Code Playgroud)

但是使用一组值运行补丁会给我一个错误:

# 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":"|...
Run Code Online (Sandbox Code Playgroud)

有没有人知道在不覆盖整个 args 数组的情况下在单个补丁命令中向数组添加多个值的方法?谢谢你的帮助。

Mag*_*Max 10

我发现的最简单的方法是使用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"}]'
Run Code Online (Sandbox Code Playgroud)

您可以使用:

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 -
Run Code Online (Sandbox Code Playgroud)

这有一个优点:它甚至允许注入诸如修补权限之类的对象。示例(取自将 coredns 升级到 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 -
Run Code Online (Sandbox Code Playgroud)

另一个优点:在应用之前非常容易测试,只需移除该kubectl apply -f -部件即可:

kubectl get clusterrole system:coredns -n kube-system -o json \
  | jq '.rules += [{"apiGroups":["discovery.k8s.io"],"resources":["endpointslices"],"verbs":["list","watch"]}]' \
Run Code Online (Sandbox Code Playgroud)


Guy*_*uyC 9

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

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"}]'
Run Code Online (Sandbox Code Playgroud)

我一直在为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"}]'
Run Code Online (Sandbox Code Playgroud)