kubernetes 字段不可变k8s

omjgkv6w  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(4)|浏览(212)

我尝试在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

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

lnxxn5zx

lnxxn5zx1#

我收到the job spec is invalid ... the field is immutable的消息是出于另一个原因,我想在这里简单地分享一下。
我尝试应用这个yaml文件:

apiVersion: extensions/v1beta1
kind: Deployment
spec:
  selector:
    matchLabels:
      app: application-name
...

字符串
结果发现这个yaml将替换同一Deployment的以前版本。当我运行kubectl get deployment application-name -o yaml时,我看到了这个:

apiVersion: extensions/v1beta1
kind: Deployment
spec:
  selector:
    matchLabels:
      app: application-name
      track: stable
...


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

pbpqsu0x

pbpqsu0x2#

当我尝试使用以下命令在集群中运行作业时,得到了field is immutable error

$ kubectl apply -f config.yml

字符串
其中config.yml定义如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-job-name
spec:
  # (...)


它第一次起作用了,但其他修改了参数的都没有。原来已完成的作业没有自动删除,它仍然出现在作业列表中:

$ kubectl get jobs | grep my-job-name
my-job-name                                              1/1           4m29s      22h


所以,你必须删除旧的如下:

$ kubectl delete job my-job-name


现在,您可以使用kubectl apply -f config.yml发送同名的新作业。
正如@CloudWatcher在他的评论中所说,这显然会影响不同的资源类型。对他来说,这是一个需要删除的秘密。

nwlls2ji

nwlls2ji3#

如果你在Pod定义中使用args,它意味着是一个具有单字符串项的数组。(它不会在shell中运行该命令)例如:

args:
        - /cloud_sql_proxy
        - -instances
        - ...

字符串
或者是

args:  [ "/cloud_sql_proxy", "-instances", "..." ]


解决这个问题的方法是在shell中运行命令:

command: [ "/bin/sh" ]
args: 
        - -c
        - |
          /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


数组上的引号(“)是为了可读性,它们也可以是无引号或单引号(')(如YAML规范中所示)
希望对你有帮助。

1l5u6lss

1l5u6lss4#

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

- name: DATABASE_URL:
  value: "${DATABASE_URL}"

字符串

相关问题