首页 > 解决方案 > 为什么入口服务有地址?那个地址有什么用?

问题描述

我使用 Ingress Controller 在 GKE 上部署集群

我使用Helm安装以下内容:

我还部署了入口对象(配置如下)


然后我观察到以下状态......

Ingress Controller暴露(通过负载均衡器服务)具有两个端点:35.197.XX.XX:80、35.197.XX.XX:443

这两个端点由云负载均衡器公开。我没有问题。

但是,当我执行时kubectl get ing ingress-service -o wide,它会打印出以下信息。

NAME              HOSTS             ADDRESS       PORTS     AGE
ingress-service   k8s.XX.com.tw   34.87.XX.XX   80, 443   5h50m

我真的不使用ADDRESS栏下的IP。

我还可以看到 Google 在我的 Ingress 配置文件的末尾添加了一些关于负载均衡器 IP 的额外信息。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   ....(ommitted)
spec:
  rules:
  - host: k8s.XX.com.tw
    http:
      paths:
      - backend:
          serviceName: client-cluster-ip-service
          servicePort: 3000
        path: /?(.*)
      - backend:
          serviceName: server-cluster-ip-service
          servicePort: 5000
        path: /api/?(.*)
  tls:
  - hosts:
    - k8s.XX.com.tw
    secretName: XX-com-tw
status:
  loadBalancer:
    ingress:
    - ip: 34.87.XX.XX

根据Google 的文档,这个(34.87.XX.XX)看起来像一个外部 IP,但我无法使用http://34.87.XX.XX访问它


我的问题是,既然我们已经有一个外部 IP (35.197.XX.XX) 来接收流量,为什么我们需要这个地址用于入口服务

如果它是内部或外部 IP 地址?这个地址绑定到什么?这个地址到底是做什么用的?

任何人都可以解释一下吗?非常感谢!

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


如果你只是去看看文档,你就会得到答案。

什么是入口资源:https ://kubernetes.io/docs/concepts/services-networking/ingress/#what-is-ingress

所以按照文档:

Ingress 将来自集群外部的 HTTP 和 HTTPS 路由暴露给集群内的服务。流量路由由 Ingress 资源上定义的规则控制。

为了更准确地描述云提供商,入口将创建一个负载均衡器以将服务公开给互联网。关于 gke 特定主题的文档:https ://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer

这就解释了为什么你有一个外部 IP 用于入口。

你现在应该做什么:

  • 如果您不想公开 HTTP 或/和 HTTPS 端口,只需删除入口资源,您就不要使用它,所以它几乎没用。
  • 如果您使用的是 HTTP/HTTPS 资源,请将您的服务类型更改为 nodePort 并将负载均衡器的管理留给入口。

我的观点是,当您部署入口控制器时,您应该选择第二个选项并将负载均衡器的管理留给它。对于 ingress-controller 的 ingress,不要只在 nodePort 服务的后端定义规则,规则应该在每个应用程序的特定 ingress 中定义,并由 ingress-controller 管理。


推荐阅读