kubectl apply 是否足够安全以更新所有 pods 而不管它们是如何创建的?
Is kubectl apply safe enough to update all pods no matter how they were created?
一个pod可以通过Deployment或者ReplicaSet或者DaemonSet来创建,如果我正在更新一个pod的容器规格,我可以简单地修改创建该pod的yaml文件吗?这样做了会不会出错?
小问题:
kubectl apply -f xxx.yml
是所有 pod 更新的灵丹妙药吗?
...if I am updating a pod's container specs, is it OK for me to simply modify the yaml file that created the pod?
事实上,pod 规范是控制器规范的一部分(例如部署、daemonset),要更新容器规范,您自然会从控制器规范开始。此外,运行 pod 在很大程度上是不可变的,除非您进行替换,否则您可以直接更改的内容不多——这正是控制器已经在做的事情。
您不应直接对 pods 进行更改,而应更新用于创建 pods.
的部署的 spec.template.spec
部分
原因是部署是管理副本集的控制器,因此 pods 是为您的应用程序创建的。这意味着如果您直接将更改应用到 pods 清单,并且发生了类似 pod rescheduling/restart 的事情,则对 pod 所做的更改将丢失,因为 replicaset 将根据自己的规范重新创建 pod,并且不是最后一个 运行 pod 的规范。
您可以安全地使用 kubectl apply
将更改应用于现有资源,但如果您不确定,您始终可以从 kubernetes 中提取部署的当前状态并将输出通过管道传输到 yaml 文件中以创建一个备份:
kubectl get deploy/<name> --namespace <namespace> -o yaml > deploy.yaml
另一种选择是使用 kubernetes 的内部回滚机制来恢复部署的先前修订。有关详细信息,请参阅 https://learnk8s.io/kubernetes-rollbacks。
一个pod可以通过Deployment或者ReplicaSet或者DaemonSet来创建,如果我正在更新一个pod的容器规格,我可以简单地修改创建该pod的yaml文件吗?这样做了会不会出错?
小问题:
kubectl apply -f xxx.yml
是所有 pod 更新的灵丹妙药吗?
...if I am updating a pod's container specs, is it OK for me to simply modify the yaml file that created the pod?
事实上,pod 规范是控制器规范的一部分(例如部署、daemonset),要更新容器规范,您自然会从控制器规范开始。此外,运行 pod 在很大程度上是不可变的,除非您进行替换,否则您可以直接更改的内容不多——这正是控制器已经在做的事情。
您不应直接对 pods 进行更改,而应更新用于创建 pods.
的部署的spec.template.spec
部分
原因是部署是管理副本集的控制器,因此 pods 是为您的应用程序创建的。这意味着如果您直接将更改应用到 pods 清单,并且发生了类似 pod rescheduling/restart 的事情,则对 pod 所做的更改将丢失,因为 replicaset 将根据自己的规范重新创建 pod,并且不是最后一个 运行 pod 的规范。
您可以安全地使用 kubectl apply
将更改应用于现有资源,但如果您不确定,您始终可以从 kubernetes 中提取部署的当前状态并将输出通过管道传输到 yaml 文件中以创建一个备份:
kubectl get deploy/<name> --namespace <namespace> -o yaml > deploy.yaml
另一种选择是使用 kubernetes 的内部回滚机制来恢复部署的先前修订。有关详细信息,请参阅 https://learnk8s.io/kubernetes-rollbacks。