如何为两个域的两个入口配置一个负载均衡器的 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 wide
和 kubectl 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
我有一个如下所示的 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 wide
和 kubectl 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