如何使用一个负载均衡器为两个域的两个入口配置 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 wide
和kubectl get ep
来检查服务和相应的端点
不用说,这两个应用程序应分别部署以具有不同的标签。
请检查您的配置并与上述比较。
希望对您有所帮助。如果需要,我们很乐意进一步详细说明。
【讨论】:
是的,你说得对。我听从了你的指示,现在一切正常。我在下面发布最终设置以供参考。【参考方案2】:我的工作设置:
deployment_app1.yaml:
api版本:应用程序/v1 种类:部署 元数据: 名称:app1 规格: 复制品:1 选择器: 匹配标签: 应用程序:app1 模板: 元数据: 标签: 应用程序:app1 规格: 容器: - 姓名:姓名 图片:图片 端口: - 容器端口:80deployment_app2.yaml:
api版本:应用程序/v1 种类:部署 元数据: 名称:app2 规格: 复制品:1 选择器: 匹配标签: 应用程序:app2 模板: 元数据: 标签: 应用程序:app2 规格: 容器: - 姓名:姓名 图片:图片 端口: - 容器端口:80ingress_app1.yaml:
apiVersion:扩展/v1beta1 种类:入口 元数据: 名称:app1 规格: 规则: - 主机:www.domainA.com 网址: 路径: - 后端: 服务名称:app1 服务端口:80ingress_app2.yaml:
apiVersion:扩展/v1beta1 种类:入口 元数据: 名称:app2 规格: 规则: - 主机:www.domainB.com 网址: 路径: - 后端: 服务名称:app2 服务端口:80service_app1.yaml:
api版本:v1 种类:服务 元数据: 名称:app1 规格: 类型:集群IP 选择器: 应用程序:app1 端口: - 名称:端口 1 协议:TCP 端口:80 目标端口:80service_app2.yaml:
api版本:v1 种类:服务 元数据: 名称:app2 规格: 类型:集群IP 选择器: 应用程序:app2 端口: - 名称:端口 1 协议:TCP 端口:80 目标端口:80【讨论】:
以上是关于如何使用一个负载均衡器为两个域的两个入口配置 nginx-ingress的主要内容,如果未能解决你的问题,请参考以下文章
负载均衡器 IP 和入口 IP 状态在 kubernetes 中处于挂起状态