kubernetes - 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
这是我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 负载均衡器连接
workload
并my.domain.com/api for the API
继续使用?
我想我可以做到这一点,只需将Loadbalancer Service
to 中的选择器更改为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
推荐阅读
- reactjs - 如何在 ReactJS 中为子路由概念创建默认路由
- sql - 在 MemSQL 中对 1+ 亿行查询 GROUP BY
- flask - Python/Flask:为什么程序接收的是 GET 请求而不是 POST 请求?
- web-services - SOAP 和 HTTP 响应代码
- java - Spring:无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/util]
- python - 更改 QPushbutton 或 QToolbutton 的图标
- mysql - mysql - 由于高索引基数导致查询缓慢
- laravel - 通过数据库记录进行 Laravel 验证
- android - 如何检查 PeriodicWorkRequest 是否已入队?
- c# - TFS 构建服务器 2015 - 转换 web.config 不正确