Ingrees 控制器与 Ingress 资源的区别
在 Kubernetes 中,单纯的 Ingress 资源定义文件(YAML)本身不会直接创建 Pod。Ingress 的作用是定义路由规则(如将外部流量路由到集群内的服务),而实际处理流量的 Pod 是由 Ingress 控制器(如 Nginx Ingress Controller、Traefik 等) 创建的。以下是详细解释:
1. Ingress 资源与 Ingress 控制器的区别
组件 | 作用 | 是否创建 Pod |
---|---|---|
Ingress 资源 | 定义路由规则(例如将 example.com 的流量转发到 my-service:80 )。 | ❌ 否 |
Ingress 控制器 | 监听 Ingress 资源,根据规则配置负载均衡器(如 Nginx),并运行对应的 Pod。 | ✅ 是 |
2. Ingress 的工作流程
-
部署 Ingress 控制器
- 需要手动部署一个 Ingress 控制器(如 Nginx Ingress Controller)的 Deployment/DaemonSet。
- 此步骤会创建控制器 Pod(例如
ingress-nginx-controller-xxxxx
)。
# 示例:Nginx Ingress Controller 的 Deployment(简化版) apiVersion: apps/v1 kind: Deployment metadata:name: ingress-nginx-controllernamespace: ingress-nginx spec:replicas: 1selector:matchLabels:app: ingress-nginxtemplate:metadata:labels:app: ingress-nginxspec:containers:- name: ingress-nginximage: registry.k8s.io/ingress-nginx/controller:v1.8.1
-
创建 Ingress 资源
- 定义路由规则(不创建 Pod)。
# 示例:Ingress 资源(定义路由规则) apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: my-ingress spec:ingressClassName: nginx # 指定使用 Nginx 控制器rules:- host: example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
-
Ingress 控制器监听并生效
- Ingress 控制器 Pod 会监听集群中的 Ingress 资源,动态更新负载均衡器配置(如 Nginx 的
nginx.conf
),但不会创建新 Pod。
- Ingress 控制器 Pod 会监听集群中的 Ingress 资源,动态更新负载均衡器配置(如 Nginx 的
3. 常见误解与验证
误解:应用 Ingress 资源会自动创建 Pod
- 纠正:
Ingress 资源仅定义规则,必须提前部署 Ingress 控制器,否则规则不会生效,且不会创建任何 Pod。
验证步骤
-
查看 Ingress 控制器的 Pod:
kubectl get pods -n ingress-nginx # 假设控制器部署在 ingress-nginx 命名空间
输出示例:
NAME READY STATUS ingress-nginx-controller-7c489dc6b5-vwj4s 1/1 Running
-
查看 Ingress 资源是否生效:
kubectl get ingress
输出示例(需确保
ADDRESS
已分配):NAME CLASS HOSTS ADDRESS PORTS my-ingress nginx example.com 192.168.1.100 80
4. 总结
行为 | 是否创建 Pod | 说明 |
---|---|---|
应用 Ingress 资源 | ❌ 否 | 仅添加路由规则,需配合 Ingress 控制器生效。 |
部署 Ingress 控制器 | ✅ 是 | 创建控制器 Pod,负责实际流量处理(如 Nginx、Traefik)。 |
更新 Ingress 资源 | ❌ 否 | 控制器 Pod 会动态加载新配置,但不会新建 Pod。 |
可以将 Ingress Controller 理解为 nginx,将 Ingress 资源理解为对 nginx.conf 的定义。