![](/img/trans.png)
[英]Google Cloud Kubernetes Persistent Volume Claim error in deployment Yaml
[英]Google cloud Kubernetes deployment error: Field is immutable
在解決了這個主題的問題后, 不能使用谷歌雲 Kubernetes 替換(yaml 文件都在那里,不要再次復制粘貼它們)我遇到了一個新問題。 制作一個新主題,因為前一個主題有正確答案。
步驟#2:運行:kubectl apply -f deployment.yaml
步驟 #2:警告:kubectl apply 應該用於由 kubectl create --save-config 或 kubectl apply 創建的資源
步驟#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 kubectl version
的Output
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
部署.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
從 apps/v1 開始,Deployment 的 label 選擇器在創建后是不可變的。
摘自 Kubernetes 的文檔:
注意:在 API 版本 apps/v1 中,Deployment 的 label 選擇器在創建后是不可變的。
因此,您可以先刪除此部署,然后再應用它。
MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
,因為它與您之前的部署不同。
嘗試使用kubectl get deployment -o yaml
查看現有部署。 我懷疑現有的 yaml 有不同的matchLables
節。
具體來說,您的文件具有:
matchLabels:
app: myproject
我的猜測是kubectl get deployment -o yaml
的 output 雖然有一些不同,比如:
matchLabels:
app: old-project-name
或者
matchLabels:
app: myproject
version: alpha
新部署無法更改matchLabels
節,因為它是不可變的。 新部署中的該節必須與舊部署相匹配。 如果要更改它,則需要使用kubectl delete deployment myproject
刪除舊部署。
注意:如果您在生產環境中這樣做,您的應用程序將有一段時間不可用。 (關於如何在生產中執行此操作的更長時間的討論在這里沒有用處。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.