Kubernetes Ingress:帮你轻松管理外部流量
在 Kubernetes 的世界中,Pod、Service 等组件帮助我们实现了应用的灵活部署和服务发现,但问题来了——当我们需要从外部访问这些服务时,该怎么做呢?这就是 Kubernetes Ingress 的用武之地!今天,我们来聊聊什么是 Ingress,它的作用、常见使用场景以及如何配置它。
什么是 Ingress?
简单来说,Ingress 是 Kubernetes 中用于管理外部 HTTP 和 HTTPS 流量如何路由到集群内服务的 API 对象。你可以把它看成一座“网关桥”,帮助外部流量有条不紊地找到它的目的地。
相比于传统的 Service(比如 NodePort 或 LoadBalancer),Ingress 提供了更强大的功能:
- 基于域名的路由:根据请求的 Host 或路径,将流量转发到不同的服务。
- SSL/TLS 支持:可以配置 HTTPS 加密,提升数据安全性。
- 反向代理能力:支持负载均衡、重定向等高级功能。
为什么需要 Ingress?
假设你的 Kubernetes 集群里运行了多个服务,比如:
- 一个博客服务(
blog-service
) - 一个电商服务(
shop-service
)
如果没有 Ingress,外部用户可能需要通过不同的端口访问这些服务:
http://<集群IP>:30001
(博客)http://<集群IP>:30002
(电商)
不仅难记,还显得杂乱。使用 Ingress 后,你可以:
- 通过域名访问:
http://blog.example.com
和http://shop.example.com
- 或者通过路径访问:
http://example.com/blog
和http://example.com/shop
是不是瞬间清爽了许多?
Ingress 的架构与组成
一个典型的 Ingress 设置由以下部分组成:
- Ingress Controller:负责实现 Ingress 的实际功能,常见的有 NGINX、Traefik、HAProxy 等控制器。
- Ingress 资源对象:定义具体的路由规则,比如将
example.com/blog
的流量转发到blog-service
。
使用场景
场景 1:简单的域名路由
多个服务共享一个域名,通过不同路径区分:
/blog
-> 转发到blog-service
/shop
-> 转发到shop-service
场景 2:基于域名的路由
根据 Host 区分服务:
blog.example.com
-> 转发到blog-service
shop.example.com
-> 转发到shop-service
场景 3:HTTPS 安全访问
通过配置 TLS 证书,让用户访问 https://example.com
,提升访问的安全性。
配置 Ingress 的例子
示例 1:简单路径路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /blog
pathType: Prefix
backend:
service:
name: blog-service
port:
number: 80
- path: /shop
pathType: Prefix
backend:
service:
name: shop-service
port:
number: 80
解读:
/blog
路径的流量转发到blog-service
的 80 端口。/shop
路径的流量转发到shop-service
的 80 端口。
示例 2:基于域名的路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-based-ingress
spec:
rules:
- host: blog.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blog-service
port:
number: 80
- host: shop.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: shop-service
port:
number: 80
解读:
- 访问
blog.example.com
时,流量转发到blog-service
。 - 访问
shop.example.com
时,流量转发到shop-service
。
示例 3:开启 HTTPS 支持
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
解读:
- 配置了
example-tls
证书,支持 HTTPS。 - 流量通过
https://example.com
访问,并转发到my-service
。
如何部署 Ingress Controller?
Ingress 本身只是定义规则的资源对象,实际的流量处理由 Ingress Controller 实现。以下是常见步骤:
- 安装 Ingress Controller
可以通过 Helm 或 YAML 安装,比如 NGINX Ingress Controller:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
- 验证是否安装成功
检查ingress-nginx-controller
Pod 是否运行:
kubectl get pods -n ingress-nginx
- 配置 Ingress 资源
创建上面示例的 Ingress 规则并测试是否正常工作。
注意事项
- Ingress Controller 的选择
根据需求选择适合的 Controller,比如:
- NGINX:功能丰富,支持多种配置。
- Traefik:易于部署,适合微服务架构。
- HAProxy:性能优越,适合高流量场景。
- 路径匹配规则
Kubernetes 1.18 开始支持pathType
,要注意选择Prefix
或Exact
类型。 - TLS 配置
确保你的证书正确无误,否则 HTTPS 会报错。
总结
Ingress 是 Kubernetes 中连接外部流量和内部服务的桥梁,它让你的应用变得更加易于访问和管理。通过配置域名路由、路径路由或启用 HTTPS,你可以轻松构建一个安全、高效的访问入口。
希望这篇文章帮你更好地理解和使用 Ingress。如果在使用过程中遇到问题,欢迎留言交流,我们一起探讨!