【问题标题】:Cannot update Kubernetes pod from yaml generated from kubectl get pod pod_name -o yaml无法从 kubectl get pod pod_name -o yaml 生成的 yaml 更新 Kubernetes pod
【发布时间】:2020-12-15 17:55:02
【问题描述】:

我的 kubernetes 中有一个 pod,需要更新才能拥有 securityContext。因此使用 -

生成了一个 yaml 文件
kubectl get pod pod_name -o yaml > mypod.yaml

更新所需的securityContext并执行命令后-

kubectl apply -f mypod.yaml

在 pod 中没有观察到任何变化。

新创建的 yaml 文件可以完美运行。 新的 yaml 文件 -

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: default
spec:
  securityContext:
    runAsUser: 1010
  containers:
  - command:
    - sleep
    - "4800"
    image: ubuntu
    name: myubuntuimage

【问题讨论】:

  • Pod 创建后的大部分参数都无法编辑。使用更高级别的对象,例如 Deployment,它将轮换具有旧配置的 Pod,以支持具有新配置的新 Pod。

标签: kubernetes kubernetes-pod


【解决方案1】:

不可变字段

在 Kubernetes 中,您可以找到有关 Immutable fields 的信息。

API 中的很多字段都倾向于immutable,创建后无法更改。例如,对于 pod 中的许多字段都是如此。目前没有办法以声明方式指定字段是不可变的,必须依赖于核心类型的内置验证,或者必须为 CRD 构建验证 webhook。

为什么?

Kubernetes 中有一些资源在设计上具有immutable fields,即在创建对象后,这些字段不能再被改变。例如。一个 pod 的规范在创建后几乎是不可更改的。要更改 pod,必须将其删除、重新创建和重新调度。

编辑现有 pod 配置

如果你想通过security context 使用kubectl apply 应用新配置,你会得到如下错误:

The Pod "mypod" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)

如果您使用kubectl patch,输出将是相同的 kubectl patch pod mypod -p '{"spec":{"securityContext":{"runAsUser":1010}}}'

另外kubectl edit也不会改变这个具体配置

$ kubectl edit pod
Edit cancelled, no changes made.

解决方案

如果您只需要一个pod,您必须删除它并使用请求的配置创建一个新的。

更好的解决方案是使用能够确保满足自己的一些要求的资源,例如Deployment。更改当前配置后,deployment 将创建新的 Replicaset,这将创建具有新配置的新 pod。

通过更新DeploymentPodTemplateSpec。一个新的ReplicaSet 被创建,Deployment 管理以可控的速率将 Pod 从旧的ReplicaSet 移动到新的。每个新的ReplicaSet 都会更新部署的修订版。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 2018-12-30
    • 2018-12-07
    • 2022-01-21
    • 1970-01-01
    • 2020-12-15
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多