当前位置: 首页 > 知识库问答 >
问题:

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

壤驷瑾瑜
2023-03-14

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

#kubectl get all

NAME                                                 READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-d78c45477-gxm59         1/1     Running   0          8d
pod/nginx-ingress-default-backend-5b967cf596-dc8ss   1/1     Running   0          8d

NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
service/kubernetes                      ClusterIP      10.245.0.1                 443/TCP                      9d
service/nginx-ingress-controller        LoadBalancer   10.245.203.193   A.B.C.D   80:30033/TCP,443:31490/TCP   8d
service/nginx-ingress-default-backend   ClusterIP      10.245.58.229              80/TCP                       8d

NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-ingress-controller        1/1     1            1           8d
deployment.apps/nginx-ingress-default-backend   1/1     1            1           8d

NAME                                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-ingress-controller-d78c45477         1         1         1       8d
replicaset.apps/nginx-ingress-default-backend-5b967cf596   1         1         1       8d

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

我还有两个域名domainA。com和域B。通用域名格式。

我的DNS设置如下:

对于domainA。通用域名格式:

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

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

我得到了

# kubectl describe ingress

Name:             app1
Namespace:        default
Address:          A.B.C.D
Default backend:  default-http-backend:80 ()
Rules:
  Host            Path  Backends
  ----            ----  --------
  www.domainA.com
                     app1:80 (10.244.1.15:80,10.244.1.33:80)

Annotations:
  kubernetes.io/ingress.class:  nginx
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  CREATE  10m    nginx-ingress-controller  Ingress default/app1
  Normal  UPDATE  9m48s  nginx-ingress-controller  Ingress default/app1


Name:             app2
Namespace:        default
Address:          A.B.C.D
Default backend:  default-http-backend:80 ()
Rules:
  Host         Path  Backends
  ----         ----  --------
  www.domainB.com
                  app2:80 (10.244.1.15:80,10.244.1.33:80)

Annotations:
  kubernetes.io/ingress.class:  nginx
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  CREATE  8m24s  nginx-ingress-controller  Ingress default/app2
  Normal  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)

如何修复配置?

非常感谢。

共有2个答案

戚兴邦
2023-03-14

我的工作设置:

deployment\u 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\u 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\u app2。yaml:

apiVersion: v1
kind: Service
metadata:
  name: app2
spec:
  type: ClusterIP
  selector:
    app: app2
  ports:
    - name: port1
      protocol: TCP
      port: 80
      targetPort: 80
池阳伯
2023-03-14

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

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

这里需要的是有两个不同的应用程序(具有不同的标签),两个不同的服务路由到每个服务的endpoint,以及列出两个域的单个入口。

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

在这里,我们创建了用于路由2个不同服务的流量的入口

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

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

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

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

请检查您的配置并与以上内容进行比较。

希望这有帮助。如有需要,我们将乐于进一步阐述。

 类似资料:
  • 我尝试在使用相同nodejs应用程序的两个容器之间实现nginx反向代理负载平衡。 目录结构: docker撰写。yml:

  • 在使用GKE ingress时,我观察到GKE ingress为负载平衡器创建了多个后端服务,这导致后端服务如此之多,我们甚至面临后端服务作为其全局配额的配额耗尽问题。我的问题是,尽管ingress中有多条路径规则,但为什么NGINX ingress controller不像GCE ingress那样创建多个后端服务。我阅读了这里的文档, https://cloud.google.com/kube

  • 所以我正在使用库伯内特斯作为一个辅助项目,它很棒。运行像我这样的小项目更便宜(一个3-5个实例的小集群基本上为我提供了大约30美元/月的GCP所需的一切)。 我唯一努力的领域是尝试使用kubernetes入口资源映射到集群并扇出到我的微服务(它们是小型Go或节点后端)。我有入口映射到不同服务的配置设置,没有问题。 我知道,在创建入口资源时,您可以很容易地让GCP启动负载平衡器。这很好,但这也意味着

  • 在Kubernetes中创建负载平衡器类型的服务时,它是创建一个全新的外部负载平衡器,还是只为负载平衡器类型的第一个服务创建一个负载平衡器,并将该负载平衡器重新用于负载平衡器类型的所有后续服务? 这个问题特别重要,因为为每个服务构建一个单独的负载平衡器对我来说成本太高。 如果它特定于云提供商,我使用Azure,但我很想知道其他云提供商是否不同。

  • 是否可以在没有负载均衡器的情况下在库伯内特斯中使用入口控制器功能(在数字海洋中)。 是否有其他机制允许域名映射到Kubernetes服务;例如,如果我在Kubernetes集群上托管两个WordPress站点: == 域名如何在不显式输入端口号的情况下映射到容器端口8080。 感谢任何帮助。

  • 本文向大家介绍Nginx如何配置负载均衡,包括了Nginx如何配置负载均衡的使用技巧和注意事项,需要的朋友参考一下 Nginx配置负载均衡 使用nginx来配置负载均衡也是比较简单的 首先在http块中配置虚拟域名所对应的地址 然后在server块中配置监听 这样在使用9000端口访问服务器的时候就会进行8080和8082的负载调用 Nginx 负载均衡策略 轮询(默认) 按照时间顺序逐一的分配到