簡體   English   中英

谷歌雲 Kubernetes 部署錯誤:字段不可變

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM