Kubernetes、LoadBalancer 和 Ingress 用于一个域中的多个服务
Kubernetes, LoadBalancer and Ingress for more than one service on one domain
我可能误解了这个概念:
我有两个服务(Frontend 和 API)。两者都应使用一个子域 (my.domain.com):
domain.com => for FRONTEND ('hello-world')
domain.com/api => for API
我在 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
我可能误解了这个概念:
我有两个服务(Frontend 和 API)。两者都应使用一个子域 (my.domain.com):
domain.com => for FRONTEND ('hello-world')
domain.com/api => for API
我在 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/
现在我想将我的后端 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
withmy.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