我尝试在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中,我看到命令被括在引号中,然后它返回上述错误。
4条答案
按热度按时间lnxxn5zx1#
我收到
the job spec is invalid ... the field is immutable
的消息是出于另一个原因,我想在这里简单地分享一下。我尝试应用这个yaml文件:
字符串
结果发现这个yaml将替换同一Deployment的以前版本。当我运行
kubectl get deployment application-name -o yaml
时,我看到了这个:型
显然,
spec.selector.matchLabels
当前是一个数组,我试图用一个字符串替换它。我的修复方法是删除部署并重新部署它。pbpqsu0x2#
当我尝试使用以下命令在集群中运行作业时,得到了
field is immutable error
:字符串
其中
config.yml
定义如下:型
它第一次起作用了,但其他修改了参数的都没有。原来已完成的作业没有自动删除,它仍然出现在作业列表中:
型
所以,你必须删除旧的如下:
型
现在,您可以使用
kubectl apply -f config.yml
发送同名的新作业。正如@CloudWatcher在他的评论中所说,这显然会影响不同的资源类型。对他来说,这是一个需要删除的秘密。
nwlls2ji3#
如果你在Pod定义中使用args,它意味着是一个具有单字符串项的数组。(它不会在shell中运行该命令)例如:
字符串
或者是
型
解决这个问题的方法是在shell中运行命令:
型
数组上的引号(“)是为了可读性,它们也可以是无引号或单引号(')(如YAML规范中所示)
希望对你有帮助。
1l5u6lss4#
所以这个问题解决了。我必须将yaml文件中的环境变量的值用引号括起来。这解决了问题。
字符串