解决了本主题Can't use Google Cloud Kubernetes substitutions的问题后(所有Yaml文件都在这里,不再再次复制粘贴),我遇到了一个新问题。提出新主题,因为前一个主题的答案正确。
步骤2:运行:kubectl apply -f deployment.yaml
步骤#2:警告: kubectl apply应该在任何一个kubectl创建的资源上使用 创建--save-config或kubectl应用
步骤2:部署 “ myproject”无效:spec.selector:无效值: v1.LabelSelector {MatchLabels:map [string] string {“ app”:“ myproject”, “ run”:“ myproject”}, MatchExpressions:[] v1.LabelSelectorRequirement(nil)}:字段为 不可变的
我已经检查过类似的问题,但是找不到任何相关的内容。
此外,是否有可能该错误与升级App Engine-> Docker-> Kubernetes有关?我在每个步骤上创建了有效的配置。也许有些东西现在已经被创造出来并且不可变了?在这种情况下我该怎么办?
还有一个注意事项,也许很重要,它说“ kubectl apply应该用于由kubectl create --save-config或kubectl apply创建的资源上”(您可以在上面看到),但要执行
>
kubectl create deployment myproject --image=gcr.io/myproject/myproject
给我这个
服务器错误(AlreadyExists):Deployments.apps“ myproject”已存在
这实际上是预期的,但与此同时,上面的警告引起了争议(至少在我的预期中)
有什么主意吗?
kubectl version
的输出
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.7", GitCommit:"8fca2ec50a6133511b771a11559e24191b1aa2b4", GitTreeState:"clean", BuildDate:"2019-09-18T14:47:22Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"13+", GitVersion:"v1.13.11-gke.14", GitCommit:"56d89863d1033f9668ddd6e1c1aea81cd846ef88", GitTreeState:"clean", BuildDate:"2019-11-07T19:12:22Z", GoVersion:"go1.12.11b4", Compiler:"gc", Platform:"linux/amd64"}
当前的YAML文件:
steps:
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args: [
'-c',
'docker pull gcr.io/$PROJECT_ID/myproject:latest || exit 0'
]
- name: 'gcr.io/cloud-builders/docker'
args: [
'build',
'-t',
'gcr.io/$PROJECT_ID/myproject:$BRANCH_NAME-$COMMIT_SHA',
'-t',
'gcr.io/$PROJECT_ID/myproject:latest',
'.'
]
- name: 'gcr.io/cloud-builders/kubectl'
args: [ 'apply', '-f', 'deployment.yaml' ]
env:
- 'CLOUDSDK_COMPUTE_ZONE=<region>'
- 'CLOUDSDK_CONTAINER_CLUSTER=myproject'
- name: 'gcr.io/cloud-builders/kubectl'
args: [
'set',
'image',
'deployment',
'myproject',
'myproject=gcr.io/$PROJECT_ID/myproject:$BRANCH_NAME-$COMMIT_SHA'
]
env:
- 'CLOUDSDK_COMPUTE_ZONE=<region>'
- 'CLOUDSDK_CONTAINER_CLUSTER=myproject'
- 'DB_PORT=5432'
- 'DB_SCHEMA=public'
- 'TYPEORM_CONNECTION=postgres'
- 'FE=myproject'
- 'V=1'
- 'CLEAR_DB=true'
- 'BUCKET_NAME=myproject'
- 'BUCKET_TYPE=google'
- 'KMS_KEY_NAME=storagekey'
timeout: 1600s
images:
- 'gcr.io/$PROJECT_ID/myproject:$BRANCH_NAME-$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/myproject:latest
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myproject
spec:
replicas: 1
selector:
matchLabels:
app: myproject
template:
metadata:
labels:
app: myproject
spec:
containers:
- name: myproject
image: gcr.io/myproject/github.com/weekendman/{{repo name here}}:latest
ports:
- containerPort: 80
答案 0 :(得分:2)
从apps / v1开始,部署的标签选择器在创建后是不变的。
Kubernetes的document的摘录:
注意:在API版本apps / v1中,展开的标签选择器为 创建后就不会改变。
因此,您可以先删除此部署,然后再应用。
答案 1 :(得分:2)
MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
是因为它与以前的部署不同。
尝试使用kubectl get deployment -o yaml
查看现有部署。我怀疑现有的Yaml具有不同的matchLables
节。
具体来说,您的文件具有:
matchLabels:
app: myproject
我的猜测是kubectl get deployment -o yaml
的输出,但有一些不同,例如:
matchLabels:
app: old-project-name
或
matchLabels:
app: myproject
version: alpha
新部署无法更改matchLabels
节,这是因为它是不可变的。新部署中的该节必须与旧版本匹配。如果要更改它,则需要使用kubectl delete deployment myproject
删除旧的部署。
注意:如果您在生产环境中这样做,则您的应用将在一段时间内不可用。 (关于如何在生产中执行此操作的更长的讨论在这里没有用。)