【问题标题】:Kubectl apply command for updating existing service resource用于更新现有服务资源的 Kubectl apply 命令
【发布时间】:2018-12-18 09:51:19
【问题描述】:

目前我使用的是 Kubernetes 版本 1.11.+。以前我总是对我的 cloud build 脚本使用以下命令:

- name: 'gcr.io/cloud-builders/kubectl'
  id: 'deploy'
  args:
  - 'apply'
  - '-f'
  - 'k8s'
  - '--recursive'
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=${_REGION}'
  - 'CLOUDSDK_CONTAINER_CLUSTER=${_CLUSTER_NAME}'

并且命令按预期工作,当时我使用的是 k8s 版本 1.10.+。但是最近我收到以下错误:

  • spec.clusterIP:无效值:“”:字段不可变
  • metadata.resourceVersion:无效值:“”:必须为更新指定

所以我想知道这是否是服务资源的预期行为?

这是我的服务的 YAML 配置:

apiVersion: v1
kind: Service
metadata:
  name: {name}
  namespace: {namespace}
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "{backend-config-name}"}'
spec:
  ports:
   - port: {port-num}
     targetPort: {port-num}
  selector:
    app: {label}
    environment: {env}
type: NodePort

【问题讨论】:

  • 你的 YAML 是什么样的?
  • 您好,我已经包含了我的 YAML 配置,谢谢..
  • 这是你k8s目录中唯一的YAML服务吗?
  • 不,它也包括部署和入口。但是,导致此问题的唯一文件是服务配置。所以我只给你服务配置。
  • 我发现这篇文章很有帮助 - timcosta.io/…

标签: kubernetes google-cloud-platform google-kubernetes-engine google-cloud-build


【解决方案1】:
【解决方案2】:

手动运行kubectl apply -f somefile.yaml 时有时会遇到此错误。 我认为当有人通过 Kubernetes 仪表板更改规范而不是通过 kubectl apply 应用新更改时会发生这种情况。

为了修复它,我运行 kubectl edit services/servicename,它会在我的默认编辑器中打开 yaml 规范。然后删除字段metadata.resourceVersionspec.clusterIP,点击保存并再次运行kubectl apply -f somefile.yaml

【讨论】:

  • 删除字段,返回错误# services "servicename" was not valid: # * metadata.resourceVersion: Invalid value: "": must be specified for an update # * metadata.resourceVersion: Invalid value: "": must be specified for an update # * spec.clusterIP: Invalid value: "": field is immutable
【解决方案3】:

您需要在您的服务 yaml 文件中设置 spec.clusterIP,并将其值替换为服务中的 clusterIP 地址,如下所示:

spec:
  clusterIP:

您的问题在以下github 上进行了讨论,还有一个解决方法可以帮助您绕过此问题。

【讨论】:

  • 它不会导致中断吗?
猜你喜欢
  • 2019-07-25
  • 2020-02-07
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多