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

How to configure nginx-ingress with one load balancer for two ingress for two domains

我有一个如下所示的 k8s 集群

#kubectl 获取所有

姓名 READY STATUS RESTARTS AGE
pod/nginx-ingress-controller-d78c45477-gxm59 1/1 运行 0 8d
pod/nginx-ingress-default-backend-5b967cf596-dc8ss 1/1 运行 0 8d

名称类型集群 IP 外部 IP 端口年龄
service/kubernetes 集群 IP 10.245.0.1 443/TCP 9d
service/nginx-ingress-controller 负载均衡器 10.245.203.193 A.B.C.D 80:30033/TCP,443:31490/TCP 8d
service/nginx-ingress-default-backend 集群 IP 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----
www.domainA.comA.B.C.D
-----域B----
www.domainB.comA.B.C.D

我用helm安装了两个app后

我得到了

# 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
事件:
  消息类型原因年龄
  ---- ------ ---- ---- --------
  正常创建 10m nginx-ingress-controller Ingress default/app1
  正常更新 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
  正常更新 7m49s nginx-ingress-controller Ingress default/app2

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

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

我想要一个单一的外部 ip 路由到不同的 pods 通过像虚拟服务器

这样的主机
www.domainA.com
                     app1:80 (10.244.1.15:800)

------------------
www.domainB.com
                     app2:80 (10.244.1.33:80)

如何修复我的配置?

谢谢

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

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

这里需要的是拥有 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
  ...

为清楚起见,我省略了一半的服务规范。最重要的一点是"selector"

需要使用 2 个不同的选择器创建 2 个服务。 您可以使用 kubectl get svc -o widekubectl get ep

检查服务和相应的端点

不用说,两个应用程序应该单独部署以具有不同的标签。

请检查您的配置并与上面的进行比较。

希望对您有所帮助。如果需要,我们很乐意进一步阐述。

我的工作设置:

deployment_app1.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app1
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: app1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
      - name: name
        image: image
        ports:
        - containerPort: 80                 

deployment_app2.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app2
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: app2
  template:
    metadata:
      labels:
        app: app2
    spec:
      containers:
      - name: name
        image: image
        ports:
        - containerPort: 80                 

ingress_app1.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app1
spec:
  rules:
    - host: www.domainA.com
      http:
        paths:
          - backend:
              serviceName: app1
              servicePort: 80

ingress_app2.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app2
spec:
  rules:
    - host: www.domainB.com
      http:
        paths:
          - backend:
              serviceName: app2
              servicePort: 80

service_app1.yaml:

apiVersion: v1
kind: Service
metadata:
  name: app1
spec:
  type: ClusterIP
  selector:
    app: app1
  ports:
    - name: port1
      protocol: TCP
      port: 80
      targetPort: 80

service_app2.yaml:

apiVersion: v1
kind: Service
metadata:
  name: app2
spec:
  type: ClusterIP
  selector:
    app: app2
  ports:
    - name: port1
      protocol: TCP
      port: 80
      targetPort: 80