【问题标题】:Why does Google Cloud show an error when using ClusterIP为什么 Google Cloud 在使用 ClusterIP 时会显示错误
【发布时间】:2019-01-05 10:07:58
【问题描述】:

在我的 gcloud 控制台中,它为我定义的入口显示以下错误:

同步期间出错:评估入口规范时出错:服务 “monitoring/kube-prometheus”类型为“ClusterIP”,预期为“NodePort” 或“负载均衡器”

我使用 traefik 作为反向代理(而不是 nginx),因此我使用 ClusterIP 定义了一个入口。据我了解,所有流量都是通过 traefik 服务(定义了 Loadbalancer 入口)代理的,因此我所有其他入口实际上应该有一个 ClusterIP 而不是 NodePort 或 Loadbalancer?

问题:

那么为什么 Google Cloud 会警告我它需要一个 NodePort 或 LoadBalancer?

【问题讨论】:

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


    【解决方案1】:

    我不知道为什么会发生这个错误,因为它(对我来说)似乎是一个有效的配置。但要清除错误,您可以将服务切换到命名的 NodePort。然后切换您的入口以使用端口名称而不是数字。例如:

    服务:

    apiVersion: v1
    kind: Service
    metadata:
      name: testapp
    spec:
      ports:
      - name: testapp-http # ADD THIS
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: testapp
      type: NodePort
    

    入口:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: testapp
    spec:
      rules:
      - host: hostname.goes.here
        http:
          paths:
          - backend:
              serviceName: testapp
              # USE THE PORT NAME FROM THE SERVICE INSTEAD OF THE PORT NUMBER
              servicePort: testapp-http
            path: /
    

    更新:

    这是我从 Google 收到的解释。

    因为默认情况下服务是 ClusterIP [1],并且这种类型的服务可以从集群内部访问。使用 kube-proxy 时可以从外部访问,而不是直接通过 ingress 访问。

    作为一个建议,我个人认为这篇文章 [2] 有助于理解这些类型的服务之间的区别。

    [1]https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

    [2]https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

    【讨论】:

    • 其实这个服务不应该被公众直接访问。它应该只能通过代理使用(当我使用 ClusterIP 时)。使用 NodePort 可以直接从我不想要的公众访问。我是不是误会了什么?
    • 这取决于您的网络设置。我的 VPC 都是私有的。 (我认为这是默认设置。)让流量进入我的集群的唯一方法是通过负载均衡器。
    • 旁注:我使用的是 nginx 入口控制器。我遇到了一个问题,它正在与 GCP 入口控制器竞争,并且东西正在翻转。您可以为 GKE 禁用 HttpLoadBalancing 插件,或者确保指定 kubernetes.io/ingress.class 注释。 kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/…
    【解决方案2】:

    谢谢@aayore。就我而言,我必须明确指定一个入口类,以便 Google Cloud 不会干扰。 Nginx 入口似乎对ClusterIp 服务感到满意。

    metadata:
      name: foo
      annotations:
        kubernetes.io/ingress.class: "nginx"
    

    【讨论】:

    【解决方案3】:

    我们在生产环境中遇到了这个问题,但在暂存环境中没有,这是由集群版本不匹配引起的。事实证明,如果您使用 Container Native Load Balancing,ClusterIP 仅在 GKE 上是一个有效的 ServiceType,它在 1.17.6-gke.7 及更高版本的 GKE 集群上默认启用。我们通过简单地将生产集群升级到最新的稳定版本来修复它。

    【讨论】:

      【解决方案4】:

      对我们来说,解决方案是在要公开的服务上设置注释 cloud.google.com/neg: '{"ingress": true}'

      通常这会自动设置为following conditions下的所有服务:

      • 使用至少 1.17.6-gke.7 创建的服务
      • VPC 原生集群
      • 不使用共享 VPC
      • 不使用 GKE 网络政策

      当我们开始引入网络策略时,我们暴露的服务停止工作。

      所以上面的例子也应该适用于 ClusterIP:

      apiVersion: v1
      kind: Service
      metadata:
        name: testapp
        annotations:
          cloud.google.com/neg: '{"ingress": true}'
      spec:
        ports: ...
        type: ClusterIP
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 2010-10-08
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-20
        相关资源
        最近更新 更多