Kubernetes Ingress实战:用Ingress Controller管理Web应用外部流量
在 Kubernetes 中,Ingress 是一种 API 对象,用于管理对集群中服务的外部访问。Ingress Controller 负责实现 Ingress 规则,它通常是一个负载均衡器,根据 Ingress 规则将外部请求路由到相应的服务。本文将通过一个实际的 Web 应用部署案例,详细讲解如何在 Kubernetes 中使用 Ingress Controller 来管理外部流量。
1. 准备工作
在开始之前,你需要确保已经安装并配置好 Kubernetes 集群,并且安装了 Ingress Controller。常用的 Ingress Controller 有 Nginx Ingress Controller、Traefik 等。本文以 Nginx Ingress Controller 为例进行讲解。
1.1 安装 Nginx Ingress Controller
你可以使用 Helm 来安装 Nginx Ingress Controller。首先,添加 Helm 仓库:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
然后,安装 Nginx Ingress Controller:
helm install my-nginx-ingress ingress-nginx/ingress-nginx
1.2 验证 Ingress Controller 是否正常运行
可以通过查看 Ingress Controller 的 Pod 状态来验证是否正常运行:
kubectl get pods -n ingress-nginx
如果所有 Pod 都处于 Running 状态,则表示 Ingress Controller 已经成功安装并运行。
2. 部署 Web 应用
本文以一个简单的 Nginx Web 应用为例,演示如何通过 Ingress Controller 将其暴露到外部。
2.1 创建 Deployment
创建一个名为 my-web 的 Deployment,使用 Nginx 镜像:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web
labels:
app: my-web
spec:
replicas: 2
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
保存为 my-web-deployment.yaml,并执行以下命令创建 Deployment:
kubectl apply -f my-web-deployment.yaml
2.2 创建 Service
创建一个名为 my-web 的 Service,将流量路由到 my-web Deployment:
apiVersion: v1
kind: Service
metadata:
name: my-web
labels:
app: my-web
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: my-web
保存为 my-web-service.yaml,并执行以下命令创建 Service:
kubectl apply -f my-web-service.yaml
3. 配置 Ingress
创建一个 Ingress 对象,定义外部流量如何路由到 my-web Service。
3.1 创建 Ingress 规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myweb.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-web
port:
number: 80
host: 定义了域名,这里使用myweb.example.com。你需要将其替换为你自己的域名,并在 DNS 中将该域名指向 Ingress Controller 的 IP 地址。path: 定义了路径,这里使用/,表示所有请求都路由到my-webService。backend: 定义了后端服务,指定了 Service 的名称和端口。nginx.ingress.kubernetes.io/rewrite-target: 这个 annotation 的作用是将请求的 URI 重写为/,因为 Nginx 默认会将完整的 URI 传递给后端服务。
保存为 my-web-ingress.yaml,并执行以下命令创建 Ingress:
kubectl apply -f my-web-ingress.yaml
3.2 获取 Ingress Controller 的 IP 地址
执行以下命令获取 Ingress Controller 的 IP 地址:
kubectl get service -n ingress-nginx ingress-nginx-controller
在 EXTERNAL-IP 列中可以看到 Ingress Controller 的 IP 地址。如果 EXTERNAL-IP 处于 pending 状态,则表示 Ingress Controller 正在分配 IP 地址,需要等待一段时间。
3.3 配置 DNS
将域名 myweb.example.com 指向 Ingress Controller 的 IP 地址。具体操作方法取决于你的 DNS 服务提供商。
4. 验证 Ingress 是否生效
在浏览器中访问 http://myweb.example.com,如果能够看到 Nginx 的欢迎页面,则表示 Ingress 已经成功配置并生效。
5. 总结
本文通过一个实际的 Web 应用部署案例,详细讲解了如何在 Kubernetes 中使用 Ingress Controller 来管理外部流量。通过 Ingress,我们可以方便地将集群中的服务暴露到外部,并实现负载均衡、SSL termination 等功能。希望本文能够帮助你更好地理解和使用 Kubernetes Ingress。
6. 拓展
- Ingress Class: Ingress Class 用于指定使用哪个 Ingress Controller 来处理 Ingress 资源。 你可以创建多个 Ingress Controller,并使用 Ingress Class 来区分它们。 例如,你可以创建一个专门处理内部流量的 Ingress Controller,以及一个专门处理外部流量的 Ingress Controller。
- TLS: Ingress 支持 TLS termination,可以将 HTTPS 请求转换为 HTTP 请求,从而减轻后端服务的压力。 你需要准备好 TLS 证书和密钥,并在 Ingress 资源中配置 TLS。 例如,你可以使用 Let's Encrypt 自动生成 TLS 证书。
- 高级路由: Ingress 支持基于 Header、Cookie 等的路由规则,可以实现更复杂的流量管理。 例如,你可以根据用户的地理位置将请求路由到不同的后端服务。
通过灵活运用 Ingress 的各种功能,可以更好地管理 Kubernetes 集群中的外部流量,提升应用的可用性和性能。