Kubernetes Ingress 是 Kubernetes 利用负载均衡、路由、TLS 等技术实现的 API 对外暴露服务的一种方式,因此,Kubernetes Ingress 通常用于服务的 HTTP(S) 流量管理。本篇文章将对 Kubernetes Ingress 进行科普,以及介绍 Ingress 的配置和使用方法。
Kubernetes Ingress 是什么?
Kubernetes Ingress 是 Kubernetes 中用来管理进入集群的外部网络流量的 API 对象。它最常见的使用场景是通过路由将公共 HTTP(S) 流量路由到单个服务或集群中的多个服务上。Ingress 通过将网络流量路由到正确的服务上,使得运维人员可以方便地将公共流量(例如,网页浏览器的请求)定向到符合要求的 Kubernetes 服务上。
Ingress 对象本身不处理流量。它仅是一种配置机制,暴露了多个服务的 IP 或主机主体。生成的配置(通常是代理的配置)由 Kubernetes 通过插件所维护的软件构建,并且由 Kubernetes 代理所重新加载。
Ingress 概述
在 Kubernetes 中创建 Ingress 对象后,Kubernetes 代理(Nginx、Traefik 等)将根据特定的规则路由到集群中的不同 Service 上,每个 Service 又可以进一步映射到 Pod 等具体的后端服务,完成业务逻辑的处理。
其中:
- Ingress Controller:负责将 Ingress 对象中定义的规则应用到对应的服务上,根据负载均衡算法分配请求。
- Ingress Resource:定义公共流量转发的规则。
- Service:提供 K8s 内部各种服务的访问方式,如:ClusterIP、NodePort、LoadBalancer、ExternalName。
- Pod:一个 Kubernetes 中的最小服务单元。
Ingress 的配置
下面是一个简单的 Nginx Ingress 示例,假设我们要将如下 url 请求转发到不同的服务:
https://example.com/hello/ -> hello-service https://example.com/world/ -> world-service
首先,需要创建两个 Deployment 和 Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deploy
labels:
app: hello
spec:
replicas: 1
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: dockercloud/hello-world
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- name: http
port: 80
targetPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: world-deploy
labels:
app: world
spec:
replicas: 2
selector:
matchLabels:
app: world
template:
metadata:
labels:
app: world
spec:
containers:
- name: world
image: tutum/hello-world
ports:
- containerPort: 8000
---
api: v1
kind: Service
metadata:
name: world-service
spec:
selector:
app: world
ports:
- name: http
port: 80
targetPort: 8000
创建完成后,可以运行命令:
kubectl apply -f deployment.yaml -f service.yaml
接下来,创建 Ingress 规则,下面的代码将 example.com/hello 访问路由到 hello-service 的端口 80,将 example.com/world 访问路由到 world-service 的端口 80:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /hello
backend:
serviceName: hello-service
servicePort: 80
- path: /world
backend:
serviceName: world-service
servicePort: 80
接着,在本地计算机的 /etc/hosts 文件中添加以下行,将 example.com 的 IP 地址解析为本地计算机的 IP 地址。
127.0.0.1 example.com
访问 https://example.com/hello/
访问 https://example.com/world/
总结
在本文中,我们了解了 Kubernetes Ingress,介绍了 Ingress 对象的作用和使用场景,并演示了如何使用 Nginx Ingress 来管理进入集群的外部网络流量。如果你想进一步学习 Kubernetes 或者其他容器技术,那么可以查看 Kubernetes、Docker 的相关官方文档。