【问题标题】:How do I update the args for a Kubernetes deployment如何更新 Kubernetes 部署的参数
【发布时间】:2021-11-30 19:35:06
【问题描述】:

我有一个在 Kubernetes 中运行的部署,并希望在应用更新之前更新“args”,以便在它重新启动时,它使用与初始启动时不同的入口点 arg,其中还包括一些数据引导。

我知道您可以运行 kubectl set image 来更新部署或副本集正在运行的映像,但我如何在不删除和重新创建资源的情况下更新 args?

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    您可以使用@mr.franco 在答案中指出的kubectl patch。我正在使用它来修补 argskubernetes-dashboard 部署而不修改他们的官方安装清单。

    这是一个完整示例,说明如何在现有 Deployment 上替换(就 JSON 补丁而言)容器 args

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml
    
    kubectl get deployment kubernetes-dashboard --namespace kubernetes-dashboard -o=json | jq '.spec.template.spec.containers[0].args'
    
    [
      "--auto-generate-certificates",
      "--namespace=kubernetes-dashboard"
    ]
    
    kubectl patch deployment \
      kubernetes-dashboard \
      --namespace kubernetes-dashboard \
      --type='json' \
      -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [
      "--auto-generate-certificates",
      "--enable-insecure-login",
      "--enable-skip-login",
      "--namespace=kubernetes-dashboard"
    ]}]'
    
    kubectl get deployment kubernetes-dashboard --namespace kubernetes-dashboard -o=json | jq '.spec.template.spec.containers[0].args'
    
    [
      "--auto-generate-certificates",
      "--enable-insecure-login",
      "--enable-skip-login",
      "--namespace=kubernetes-dashboard"
    ]
    

    【讨论】:

      【解决方案2】:

      您可以简单地执行 kubectl edit deployment/<deployment-name> (see docs),修改容器规范的 args 字段,然后从您的 $EDITOR 保存并退出。

      这将“就地”更新部署规范,并使用新参数删除并重新启动您的 pod。从本质上讲,这与删除和重新启动您的 pod 没有什么不同。

      【讨论】:

      • 这适用于手动管理集群,但我希望编写脚本,以便“重新启动”脚本将 arg 更新为新值,将部署扩展到 0,然后备份到 1。
      • 在这种情况下,您可以在使用规范中所需的 arg 生成一个新的 kubectl replace -f deployment.yaml 之后简单地做一个 kubectl replace -f deployment.yaml 吗?那对你有用吗?如果您想编写脚本,您可以使用 helm 或 jinja2(可用的 cli 工具)对 deployment.yaml 进行模板化。
      【解决方案3】:

      您可以将kubectl patch 用于该用例。

      作为参考,您可以查看that答案。

      【讨论】:

      • 如果你能写出命令就好了;这不仅仅是“检查答案”,因为该答案不会更新 args 字段。
      【解决方案4】:

      如果你只想追加到现有的参数列表(而不是完全替换它),你也可以使用add jsonpatch 操作。例如,我需要将--enable-ssl-passthrough 添加到我正在运行的 nginx 控制器中,以便 ArgoCD 正常工作:

      kubectl -n ingress-nginx patch deployment ingress-nginx-controller \
      --type=json \
      -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--enable-ssl-passthrough"}]'
      

      【讨论】:

        猜你喜欢
        • 2017-01-08
        • 2020-08-27
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 2017-06-03
        • 2020-04-06
        相关资源
        最近更新 更多