首页 > 解决方案 > Kubernetes、LoadBalancer 和 Ingress,用于一个域上的多个服务

问题描述

我可能会误解这个概念:

我有两个服务(前端和 API)。两者都应该使用一个子域(my.domain.com):

我有一个在 Hetzner 运行的 K8s 云。Hetzner 还提供负载均衡器。集群是使用Rancher-UI创建的

这就是我配置的方式loadbalancer Service

---
apiVersion: "v1"
kind: Service
metadata:
  name: "nginx-hello-world"
  labels:
    app: "hello-world"
  annotations:
    load-balancer.hetzner.cloud/name: lb-development
    load-balancer.hetzner.cloud/hostname: my.domain.com
    load-balancer.hetzner.cloud/protocol: http
spec:
  type: LoadBalancer
  selector:
    app: "hello-world"
  ports:
    - name: "http"
      port: 80
      targetPort: 80

这是我Deployment的前端hello-world

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "nginx-hello-world"
  labels:
    app: "hello-world"
spec:
  selector:
    matchLabels:
      app: "hello-world"
  strategy:
    type: "Recreate"
  template:
    metadata:
      labels:
        app: "hello-world"
    spec:
      containers:
        - image: "rancher/hello-world"
          name: "nginx-hello-world"
          imagePullPolicy: "Always"
          ports:
            - containerPort: 80
              name: "http"

上面的两个清单正在工作!我可以通过访问来接触“hello-world”my.domain.com/

现在我想将我的后端 API 连接到该设置中。我想我可以通过使用ingress清单来做到这一点:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    app: my-ingress
  name: my-ingress
spec:
  rules:
  - host: my.domain.com
    http:
      paths:
      - backend:
          serviceName: hello-api
          servicePort: 80
        path: "/app"
        pathType: Prefix
      - backend:
          serviceName: hello-world
          servicePort: 80
        path: "/"
        pathType: Prefix

如何实现与 Hetzner 负载均衡器连接workloadmy.domain.com/api for the API继续使用?

我想我可以做到这一点,只需将Loadbalancer Serviceto 中的选择器更改为my-ingress,但到目前为止我没有尝试过任何工作。

┌─────────────────┐  ┌──────────────────┐   ┌──────────────────┐
│                 │  │  Ingress         │   │                  │
│ Loadbalancer Svc├─►│my.domain.com/    ├──►│ Frontend deploym.│
│                 │  │my.domain.com/api ├──►│ backend API depl │
└─────────────────┘  └──────────────────┘   └──────────────────┘

PS:可能会很有趣:我在部署 Rancher 时,它还创建了一个nginx-ingress-controller

先感谢您

标签: kuberneteskubernetes-ingressnginx-ingressrancher

解决方案


您需要创建一个类型的服务:LoadBalancer 并在选择器中使用入口控制器应用程序的标签,如下面的链接中所述。虽然链接谈到了使用 Traefik,但 Nginx 入口控制器的过程应该相同。

https://community.hetzner.com/tutorials/howto-k8s-traefik-certmanager


推荐阅读