如何使用一个负载均衡器为两个域的两个入口配置 nginx-ingress

Posted

技术标签:

【中文标题】如何使用一个负载均衡器为两个域的两个入口配置 nginx-ingress【英文标题】:How to configure nginx-ingress with one load balancer for two ingress for two domains 【发布时间】:2020-07-08 00:27:24 【问题描述】:

我有一个像下面这样的 k8s 集群

#kubectl 获取所有 名称 就绪 状态 重新开始 年龄 pod/nginx-ingress-controller-d78c45477-gxm59 1/1 运行 0 8d pod/nginx-ingress-default-backend-5b967cf596-dc8ss 1/1 运行 0 8d 名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄 服务/kubernetes ClusterIP 10.245.0.1 443/TCP 9d 服务/nginx-ingress-controller LoadBalancer 10.245.203.193 A.B.C.D 80:30033/TCP,443:31490/TCP 8d 服务/nginx-ingress-default-backend ClusterIP 10.245.58.229 80/TCP 8d 姓名 准备就绪 最新可用年龄 部署.apps/nginx-ingress-controller 1/1 1 1 8d 部署.apps/nginx-ingress-default-backend 1/1 1 1 8d 姓名 期望的当前就绪年龄 复制集.apps/nginx-ingress-controller-d78c45477 1 1 1 8d 复制集.apps/nginx-ingress-default-backend-5b967cf596 1 1 1 8d

如上所述,我有一个外部 ip A.B.C.D.

我还有两个域 domainA.com 和 domainB.com。

我的 DNS 设置如下:

对于 domainA.com:

-----域A---- A www.domainA.com A.B.C.D -----域B---- A www.domainB.com A.B.C.D

在我使用 helm 安装两个应用程序之后

我明白了

# kubectl 描述入口 名称:app1 命名空间:默认 地址:A.B.C.D 默认后端:default-http-backend:80 () 规则: 主机路径后端 ---- ---- -------- www.domainA.com app1:80 (10.244.1.15:80,10.244.1.33:80) 注释: kubernetes.io/ingress.class:nginx 事件: 类型原因年龄来自消息 ---- ------ ---- ---- -------- 正常 CREATE 10m nginx-ingress-controller Ingress default/app1 正常 UPDATE 9m48s nginx-ingress-controller Ingress default/app1 名称:app2 命名空间:默认 地址:A.B.C.D 默认后端:default-http-backend:80 () 规则: 主机路径后端 ---- ---- -------- www.domainB.com app2:80 (10.244.1.15:80,10.244.1.33:80) 注释: kubernetes.io/ingress.class:nginx 事件: 类型原因年龄来自消息 ---- ------ ---- ---- -------- 正常 CREATE 8m24s nginx-ingress-controller Ingress default/app2 正常 UPDATE 7m49s nginx-ingress-controller Ingress default/app2

我不知道为什么后端有两个 IP。

www.domainA.com 和 www.domainB.com 可能会路由到我不想要的相同 ip(10.244.1.15:80)。

我想要一个外部 ip 路由到不同 pod 的主机,比如虚拟服务器

www.domainA.com app1:80 (10.244.1.15:800) ----------------- www.domainB.com app2:80 (10.244.1.33:80)

如何修复我的配置?

谢谢

【问题讨论】:

共享入口、服务、部署yaml 【参考方案1】:

如果我对情况的理解正确,您希望将单个外部 IP 域 A 和 B 解析为单个 Ingress 和两个不同的应用程序(每个域一个)。目前的问题是流量被传递到两个应用程序都没有正确路由。

很遗憾,您尚未提供 Ingress 和 Services 配置。这就是为什么我必须解释所有需要的设置:)

这里需要的是有 2 个不同的应用程序(具有不同的标签)、2 个不同的服务(路由到每个服务的端点)以及列出两个域的单个 Ingress。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: domain-A
    http:
      paths:
      - backend:
          serviceName: service-A
          servicePort: 8080
  - host: domain-B
    http:
      paths:
      - backend:
          serviceName: Service-B
          servicePort: 8080

我们在这里创建了 Ingress,为 2 个不同的服务路由流量

apiVersion: v1
kind: Service
metadata: 
  name: Service-A 
spec: 
  selector: 
    app: nginx
  ...

为了清楚起见,我省略了一半的服务规范。最重要的一点是“选择器”

需要使用 2 个不同的选择器创建 2 个服务。 您可以使用kubectl get svc -o widekubectl get ep 来检查服务和相应的端点

不用说,这两个应用程序应分别部署以具有不同的标签。

请检查您的配置并与上述比较。

希望对您有所帮助。如果需要,我们很乐意进一步详细说明。

【讨论】:

是的,你说得对。我听从了你的指示,现在一切正常。我在下面发布最终设置以供参考。【参考方案2】:

我的工作设置:

deployment_app1.yaml:

api版本:应用程序/v1 种类:部署 元数据: 名称:app1 规格: 复制品:1 选择器: 匹配标签: 应用程序:app1 模板: 元数据: 标签: 应用程序:app1 规格: 容器: - 姓名:姓名 图片:图片 端口: - 容器端口:80

deployment_app2.yaml:

api版本:应用程序/v1 种类:部署 元数据: 名称:app2 规格: 复制品:1 选择器: 匹配标签: 应用程序:app2 模板: 元数据: 标签: 应用程序:app2 规格: 容器: - 姓名:姓名 图片:图片 端口: - 容器端口:80

ingress_app1.yaml:

apiVersion:扩展/v1beta1 种类:入口 元数据: 名称:app1 规格: 规则: - 主机:www.domainA.com 网址: 路径: - 后端: 服务名称:app1 服务端口:80

ingress_app2.yaml:

apiVersion:扩展/v1beta1 种类:入口 元数据: 名称:app2 规格: 规则: - 主机:www.domainB.com 网址: 路径: - 后端: 服务名称:app2 服务端口:80

service_app1.yaml:

api版本:v1 种类:服务 元数据: 名称:app1 规格: 类型:集群IP 选择器: 应用程序:app1 端口: - 名称:端口 1 协议:TCP 端口:80 目标端口:80

service_app2.yaml:

api版本:v1 种类:服务 元数据: 名称:app2 规格: 类型:集群IP 选择器: 应用程序:app2 端口: - 名称:端口 1 协议:TCP 端口:80 目标端口:80

【讨论】:

以上是关于如何使用一个负载均衡器为两个域的两个入口配置 nginx-ingress的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态

在 Azure 中使用哪个负载均衡器

Nginx 负载均衡如何配置,高并发报502如何返回正常信息?

13《Nginx 入门教程》Nginx负载均衡(下)

nginx + tomcat配置负载均衡

ECS 和应用负载均衡器