谷歌云Kubernetes部署错误:字段不可变

Wee*_*Man 3 google-cloud-platform kubernetes

解决此主题中的问题后无法使用 Google Cloud Kubernetes 替换(yaml 文件都在那里,不要再次复制粘贴它们)我遇到了一个新问题。制作一个新主题,因为前一个主题有正确答案。

第 2 步:运行:kubectl apply -f deployment.yaml
第 2 步:警告:应该在由 kubectl create --save-config 或 kubectl apply 创建的资源上使用 kubectl apply
第 2 步:部署“myproject”无效: spec.selector: 无效值: v1.LabelSelector{MatchLabels:map[string]string{"app":"myproject", "run":"myproject"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field是不可变的

我检查过类似的问题,但没有找到任何相关的东西。

此外,此错误是否可能与升级 App Engine -> Docker -> Kubernetes 有关?我在每一步都创建了有效的配置。也许现在有些东西是被创造出来的,是不可变的?在这种情况下我该怎么办?

还有一点要注意,也许这很重要,它说“应该在由 kubectl create --save-config 或 kubectl apply 创建的资源上使用 kubectl apply”(您可以在上面看到),但是执行

kubectl create deployment myproject --image=gcr.io/myproject/myproject
Run Code Online (Sandbox Code Playgroud)

给我这个

服务器错误(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"}
Run Code Online (Sandbox Code Playgroud)



当前的 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
Run Code Online (Sandbox Code Playgroud)

部署.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
Run Code Online (Sandbox Code Playgroud)

Kun*_* Li 9

从 apps/v1 开始,部署的标签选择器在创建后是不可变的。

摘自 Kubernetes 的文档

注意:在 API 版本 apps/v1 中,Deployment 的标签选择器在创建后是不可变的。

因此,您可以先删除此部署,然后再应用它。


小智 6

MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable,因为它是从以前的部署不同。

尝试使用kubectl get deployment -o yaml. 我怀疑现有的 yaml 有不同的matchLables节。

具体来说,您的文件具有:

    matchLabels:
      app: myproject
Run Code Online (Sandbox Code Playgroud)

我的猜测是kubectl get deployment -o yamlwhile的输出有一些不同,例如:

    matchLabels:
      app: old-project-name
Run Code Online (Sandbox Code Playgroud)

或者

    matchLabels:
      app: myproject
      version: alpha
Run Code Online (Sandbox Code Playgroud)

新部署无法更改matchLabels节,因为它是不可变的。新部署中的该节必须与旧的相匹配。如果要更改它,则需要使用kubectl delete deployment myproject.

注意:如果您在生产中这样做,您的应用程序将有一段时间不可用。(关于如何在生产中执行此操作的更长讨论在这里没有用。)