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

问题描述

我可能误解了这个概念:

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

  • domain.com => for FRONTEND ('hello-world')
  • domain.com/api => for API

我在 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

这是我用于前端 Deploymenthello-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

如何实现将另一个 workloadmy.domain.com/api for the API 连接并保持 Hetzner 负载均衡器的使用?

我以为我可以做到这一点,只需将 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 并在选择器中使用入口控制器应用程序的标签,如下面的链接中所述。虽然链接中谈到了使用 Traefik,但 Nginx 入口控制器的过程应该是相同的。

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