Kubernetes、LoadBalancer 和 Ingress 用于一个域中的多个服务

Kubernetes, LoadBalancer and Ingress for more than one service on one domain

我可能误解了这个概念:

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

我在 Hetzner 有一个 K8s-cloud 运行。 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"

以上两个清单有效!我可以通过访问 my.domain.com/

联系 'hello-world'

现在我想将我的后端 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

How can I achieve to connect another workload with my.domain.com/api for the API and keep the use of the Hetzner loadbalancer?

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

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

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

提前致谢

您需要创建一个类型的服务:LoadBalancer 并按照下面 link 中的说明在选择器中使用入口控制器应用程序的标签。尽管 link 讨论了使用 Traefik,但 Nginx 入口控制器的过程应该相同。

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