场是不可变的k8s

时间:2019-05-22 20:01:42

标签: 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

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

3 个答案:

答案 0 :(得分:12)

出于其他原因,我收到了消息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当前是一个数组,我试图用单个字符串替换它。我的解决方法是删除部署并重新部署。

答案 1 :(得分:0)

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

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

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

解决此问题的方法是转到run the command in a 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 specs所示)

希望有帮助。

答案 2 :(得分:0)

因此,此问题已解决。我必须将环境变量的值包装在yaml文件中,并用引号引起来。这样就解决了问题。

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