ingress-nginx控制器默认采用轮询(round robin)算法实现负载均衡,无需额外配置;只要后端service关联多个就绪pod、ingress资源正确指向该service、控制器正常运行,请求即自动在健康pod间轮询分发。

在 Kubernetes 环境下,Nginx 本身不直接实现轮询调度,真正执行轮询的是 ingress-nginx 控制器——它基于 Nginx 构建,但由 K8s 原生机制驱动,自动将 Ingress 规则翻译为带轮询逻辑的 nginx.conf 并热重载。
要让后端容器服务被轮询分发,关键不是手写 upstream 块,而是确保整条链路支持动态发现 + 默认策略生效。
轮询是 ingress-nginx 的默认行为
ingress-nginx 控制器内置的 upstream 默认采用轮询(Round Robin)算法,无需额外配置即可生效。只要满足以下条件,请求就会自动在匹配 Service 的所有健康 Pod 间轮询:
- 后端 Service 类型为
ClusterIP(推荐),且通过 label selector 正确关联到 Pod - Ingress 资源正确指向该 Service 名称和端口
- ingress-nginx 控制器已部署并正常运行(监听 Ingress 变更)
- Pod 处于
Running状态且 readiness probe 通过(否则不会被加入 Endpoints)
例如,一个典型 Ingress 配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
控制器会自动读取 web-service 对应的 EndpointSlice,生成类似这样的 upstream 块(内部生成,不可见):
upstream upstream-default-backend {
server 10.244.1.12:80 max_fails=1 fail_timeout=10s;
server 10.244.1.13:80 max_fails=1 fail_timeout=10s;
server 10.244.2.8:80 max_fails=1 fail_timeout=10s;
}
这些 server 条目按轮询顺序参与调度。
如何确认轮询正在工作
- 查看 ingress-nginx Pod 日志:
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller | grep "upstream" - 进入控制器 Pod,检查生成的配置:
kubectl exec -n ingress-nginx deploy/ingress-nginx-controller -- cat /etc/nginx/nginx.conf | grep -A 10 "upstream.*web-service" - 发起连续 HTTP 请求,用
curl -H "Host: app.example.com" http://<ingress_ip>/</ingress_ip>,配合后端日志观察不同 Pod 是否交替响应
若需调整轮询行为(非必需,但可选)
虽然默认即轮询,但可通过以下方式微调:
-
启用加权轮询:在 Service annotation 中添加
annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$server_addr"
(注意:这不是加权,这是 IP 哈希;加权需改用
nginx.ingress.kubernetes.io/configuration-snippet注入自定义 upstream 块,但不推荐,因破坏声明式管理) -
强制启用最少连接(不推荐覆盖默认):
annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "" nginx.ingress.kubernetes.io/load-balance: "least_conn"
-
控制健康检查节奏(影响轮询可用节点数):
在 ConfigMap 中设置:data: upstream-keepalive-connections: "32" proxy-next-upstream: "error timeout http_502 http_503 http_504"
轮询调度在 K8s 中本质是“自动的”——你只需保证 Service 有多个就绪 Pod、Ingress 指向正确、控制器运行正常,剩下的由 ingress-nginx 自动完成。不需要手动维护 IP 列表或 reload 配置。











