字段是不可变的 k8s

Dav*_*ien 12 bash kubernetes

我正在尝试将应用程序部署到 kubernetes 上的 GCP,但是,部署失败并显示错误the job spec is invalid ... the field is immutable

在迁移作业中,我有一段 bash 格式如下:

args:
        - |
          /cloud_sql_proxy -instances=xxxxxxxxxxx:europe-west1:xxxxxxxxxxx=tcp:5432 -credential_file=/secrets/cloudsql/credentials.json -log_debug_stdout=true &
          CHILD_PID=$!
          (while true; do echo "waiting for termination file"; if [[ -f "/tmp/pod/main-terminated" ]]; then kill ; echo "Killed  as the main container terminated."; fi; sleep 1; done) &
          wait 
          if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; echo "Job completed. Exiting..."; fi
Run Code Online (Sandbox Code Playgroud)

但是当文件被执行时,在 GCP 上的 yaml 中,我看到该命令已用引号括起来,然后它返回上述错误。

小智 16

我因为the job spec is invalid ... the field is immutable不同的原因收到这条消息,想在这里简单分享一下。

我试图应用这个 yaml 文件:

apiVersion: extensions/v1beta1
kind: Deployment
spec:
  selector:
    matchLabels:
      app: application-name
...
Run Code Online (Sandbox Code Playgroud)

事实证明,这个 yaml 将替换同一部署的先前版本。当我跑步时,kubectl get deployment application-name -o yaml我看到了这个:

apiVersion: extensions/v1beta1
kind: Deployment
spec:
  selector:
    matchLabels:
      app: application-name
      track: stable
...
Run Code Online (Sandbox Code Playgroud)

显然,spec.selector.matchLabels当前是一个数组,我试图用一个字符串替换它。我的修复是删除部署并重新部署它。

  • 这并不是说它是一个数组,而是您[无法通过修补来更改部署的选择器](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#label-selector-updates),您有删除并重新创建它。我的猜测是,即使您正在修补 extensions/v1beta1 部署,它实际上是底层的 app/v1 部署(存储版本迁移),其中引入了不变性。 (2认同)

Dom*_*iak 10

field is immutable error当我尝试使用以下命令在集群中运行作业时,出现了以下情况:

$ kubectl apply -f config.yml
Run Code Online (Sandbox Code Playgroud)

其中config.yml定义如下:

$ kubectl apply -f config.yml
Run Code Online (Sandbox Code Playgroud)

第一次可以用,但其他修改参数后就不行了。结果发现已完成的作业没有自动删除,它仍然出现在作业列表中:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-job-name
spec:
  # (...)
Run Code Online (Sandbox Code Playgroud)

因此,您必须按如下方式删除旧的:

$ kubectl delete job my-job-name
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 发送同名的新作业kubectl apply -f config.yml

编辑正如@CloudWatcher 在他的评论中所说,这显然会影响不同的资源类型。对他来说,这是一个需要删除的秘密。

  • 这显然会影响不同的资源类型。就我而言,这是一个需要删除的秘密。 (2认同)

Dav*_*ien 0

于是这个问题就解决了。我必须将 yaml 文件中的环境变量值用引号引起来。这解决了问题。

- name: DATABASE_URL:
  value: "${DATABASE_URL}"
Run Code Online (Sandbox Code Playgroud)