Kubectl apply命令用于更新现有服务资源

时间:2018-12-18 09:51:20

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

当前,我正在使用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:无效值:“”:必须指定更新
  •   

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

这是我为我的服务配置的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

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

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

spec:
  clusterIP:

下面的github讨论了您的问题,并提供了一种解决方法来帮助您绕过此问题。

答案 2 :(得分:0)

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

要解决此问题,我运行kubectl edit services/servicename,它将在默认编辑器中打开yaml规范。然后删除字段metadata.resourceVersionspec.clusterIP,点击保存并再次运行kubectl apply -f somefile.yaml