问题描述
我可能误解了这个概念:
我有两个服务(前端和 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
这是我用于前端 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/
现在我想将我的后端 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
如何实现将另一个 workload
与 my.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