如何使用Terraform和ClusterIP定义Kubernetes服务

时间:2019-12-23 22:16:04

标签: kubernetes terraform

我可以使用NodePort或LoadBalancer定义服务,但是当我尝试使用ClusterIP Terraform时会显示此消息

Failed to update service: Service "hello-service" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'

这是一个奇怪的消息,因为我没有提供nodePort。大概是默认情况下ClusterIP不需要的东西。这是我的服务定义:

resource "kubernetes_service" "hello-service" {
  metadata {
    name = "hello-service"
    labels = {
      app = "hello"
    }
  }
  spec {
    type = "ClusterIP" 
    selector = {
      app = "hello"
    }
    port {
      port        = 80
      target_port = 8080
      protocol = "TCP"
    }

  }
}

我看过文档,没有发现ClusterIP必须有所不同的地方。我错过了什么?

terraform --version
Terraform v0.12.4
+ provider.google v3.3.0
+ provider.kubernetes v1.10.0

Running on GCP

谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 请尝试使用$ kubectl apply -f your-service-conf-file.yaml --force

  2. 您还可以执行$ kubectl replace命令

    注意:它需要将clusterIP字段指定为相同的IP 作为此服务的分配ClusterIP

  3. 您也可以使用头盔来解决此问题:

        - port: {{ .Values.service.externalPort }} {{- if (eq .Values.service.type "ClusterIP") }}
          nodePort: null {{- end }}
          targetPort: {{ .Values.service.internalPort }}
          protocol: TCP
          name: {{ .Values.service.name }}
    
    

    这仅在第一次安装后 起作用。所以没有 “声明式”解决方法,您需要手动更改服务。

  4. 最后的解决方法可能是先删除服务:$ kubectl delete svc my-nginx

    然后您可以使用弹出类型创建服务。

您可以在这里找到更多信息:service-types-issue