kubernetes中ingress本身不执行负载均衡,实际由ingress controller(如ingress-nginx)实现;需先部署controller,再配置service与ingress资源,并通过注解或configmap设置轮询、ip_hash、least_conn等策略。

Kubernetes 中的 Ingress 本身不直接做负载均衡,它只是一个路由规则的声明接口。真正执行七层负载均衡的是背后的 Ingress Controller(比如 ingress-nginx、HAProxy 或云厂商 ALB/GCLB)。所以“配置 Ingress 负载均衡”,本质是两步:部署合适的 Ingress Controller + 正确编写 Ingress 资源并配合注解控制分发行为。
1. 先装好 Ingress Controller
没有 Controller,Ingress 资源只是 YAML 文件,不会生效。
-
推荐使用
ingress-nginx(社区最成熟、文档最全):kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.2/deploy/static/provider/cloud/deploy.yaml
✅ 注意:生产环境建议用 Helm 安装,便于配置调优(如 worker 进程数、HTTP/2、TLS 复用等)
-
验证是否就绪:
kubectl get pods -n ingress-nginx # 看到 Running 状态的 controller pod 即可
2. 配置后端 Service 和 Deployment
Ingress 只能转发到已存在的 Service,且 Service 必须有明确的 selector 匹配 Pod:
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
确保对应 Deployment 的 label 是 app: web,否则 Ingress 找不到后端。
3. 编写 Ingress 资源,启用负载均衡行为
默认就是轮询(Round Robin),但你可以按需显式指定策略或增强能力:
-
基础域名路由 + 默认轮询:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress annotations: nginx.ingress.kubernetes.io/load-balance: "round-robin" # 可省略,默认即此 spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: web-svc port: number: 80 -
按客户端 IP 保持会话(IP Hash):
Kubernetes Skills下载针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
annotations: nginx.ingress.kubernetes.io/load-balance: "ip_hash"
-
优先发给连接最少的 Pod(适合长连接/IO密集型):
annotations: nginx.ingress.kubernetes.io/load-balance: "least_conn"
-
启用 Cookie 会话保持(Sticky Sessions):
annotations: nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "INGRESS_ROUTE" nginx.ingress.kubernetes.io/session-cookie-expires: "1728000" nginx.ingress.kubernetes.io/session-cookie-max-age: "1728000"
4. (可选)全局默认策略统一管理
不想每个 Ingress 都加注解?改 ingress-nginx 的 ConfigMap:
kubectl edit configmap -n ingress-nginx ingress-nginx-controller
在 data 下添加或修改:
load-balance: "least_conn"
该设置会影响所有未显式覆盖注解的 Ingress。
5. 验证与调试
-
查看 Ingress 是否绑定成功:
kubectl get ingress # ADDRESS 字段应有 IP(NodePort 模式下可能是空,需查 controller service)
-
查看 controller 日志,确认规则加载无报错:
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller
-
curl 测试:
curl -H "Host: example.com" http://<ingress_ip></ingress_ip>
-
进入 controller Pod 查看生成的 upstream 配置:
kubectl exec -n ingress-nginx deploy/ingress-nginx-controller -- cat /etc/nginx/nginx.conf | grep -A 10 "upstream"
不复杂但容易忽略细节。关键不是写对 Ingress,而是让 Controller 跑起来、Service 对得上、注解用得准。










