【发布时间】:2021-11-30 19:35:06
【问题描述】:
我有一个在 Kubernetes 中运行的部署,并希望在应用更新之前更新“args”,以便在它重新启动时,它使用与初始启动时不同的入口点 arg,其中还包括一些数据引导。
我知道您可以运行 kubectl set image 来更新部署或副本集正在运行的映像,但我如何在不删除和重新创建资源的情况下更新 args?
【问题讨论】:
标签: docker kubernetes
我有一个在 Kubernetes 中运行的部署,并希望在应用更新之前更新“args”,以便在它重新启动时,它使用与初始启动时不同的入口点 arg,其中还包括一些数据引导。
我知道您可以运行 kubectl set image 来更新部署或副本集正在运行的映像,但我如何在不删除和重新创建资源的情况下更新 args?
【问题讨论】:
标签: docker kubernetes
您可以使用@mr.franco 在答案中指出的kubectl patch。我正在使用它来修补 args 的 kubernetes-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"
]
【讨论】:
您可以简单地执行 kubectl edit deployment/<deployment-name> (see docs),修改容器规范的 args 字段,然后从您的 $EDITOR 保存并退出。
这将“就地”更新部署规范,并使用新参数删除并重新启动您的 pod。从本质上讲,这与删除和重新启动您的 pod 没有什么不同。
【讨论】:
kubectl replace -f deployment.yaml 之后简单地做一个 kubectl replace -f deployment.yaml 吗?那对你有用吗?如果您想编写脚本,您可以使用 helm 或 jinja2(可用的 cli 工具)对 deployment.yaml 进行模板化。
您可以将kubectl patch 用于该用例。
作为参考,您可以查看that答案。
【讨论】:
如果你只想追加到现有的参数列表(而不是完全替换它),你也可以使用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"}]'
【讨论】: