1. 为什么选择ingress-nginx作为K8s入口网关
在Kubernetes 1.28+版本中部署ingress-nginx控制器,本质上是在解决集群外部流量如何高效、安全地路由到内部服务的问题。与传统的NodePort或LoadBalancer服务类型相比,ingress-nginx提供了七层路由能力,可以实现基于主机名和路径的流量分发,这是现代微服务架构的刚需。
我亲历过从早期kube-proxy到如今ingress-nginx的演进过程。最新版本的ingress-nginx控制器在性能上有显著提升,特别是对WebSocket和gRPC的长连接支持。其核心优势在于:
- 动态配置热加载(无需重启Pod)
- 支持金丝雀发布和蓝绿部署
- 与Prometheus监控体系无缝集成
- 社区活跃度高,问题响应快
注意:在K8s 1.28+环境中,官方已弃用部分旧版API,如extensions/v1beta1,必须使用networking.k8s.io/v1版本的Ingress资源
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件检查
2.1 集群基础环境确认
首先需要确保你的Kubernetes集群版本不低于1.28。通过以下命令验证:
bash复制kubectl version --short | grep Server
输出应显示类似:
code复制Server Version: v1.28.4
关键依赖组件状态检查:
bash复制# 检查CoreDNS运行状态(默认应有2个副本)
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 确认网络插件正常工作
kubectl get pods -n kube-system -l app=<your-cni-plugin>
2.2 资源配额与节点标签
ingress-nginx对节点有特殊要求:
bash复制# 为将要运行ingress的节点打标签
kubectl label nodes <node-name> ingress-ready=true
# 验证节点资源是否充足(建议至少2核4GB)
kubectl describe nodes | grep -A 10 "Allocated resources"
3. Helm安装ingress-nginx的完整流程
3.1 Helm仓库添加与更新
bash复制helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
3.2 定制化values.yaml配置
创建自定义配置文件custom-values.yaml:
yaml复制controller:
kind: DaemonSet # 推荐使用DaemonSet而非Deployment
hostNetwork: true # 直接使用主机网络,提升性能
dnsPolicy: ClusterFirstWithHostNet # 关键DNS策略
nodeSelector:
ingress-ready: "true" # 绑定到特定节点
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
metrics:
enabled: true # 开启Prometheus指标
resources:
limits:
cpu: 2000m
memory: 1024Mi
3.3 执行Helm安装命令
bash复制helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx --create-namespace \
-f custom-values.yaml \
--version 4.7.1 # 指定与k8s 1.28兼容的版本
安装后验证:
bash复制# 检查Pod状态(应看到每个ingress-ready节点上有1个Pod)
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
# 查看服务外部IP
kubectl get svc -n ingress-nginx
4. 关键配置详解与性能调优
4.1 内核参数调优
在宿主机上设置以下sysctl参数:
bash复制# 增加连接跟踪表大小
echo "net.netfilter.nf_conntrack_max = 1048576" >> /etc/sysctl.conf
# 提高本地端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" >> /etc/sysctl.conf
# 生效配置
sysctl -p
4.2 Nginx配置热加载机制
ingress-nginx采用lua动态加载配置:
yaml复制controller:
config:
enable-dynamic-certificates: "true" # 动态证书加载
upstream-keepalive-connections: "100" # 保持连接数
worker-processes: "4" # 根据CPU核心数调整
4.3 监控与告警配置
集成Prometheus监控:
yaml复制controller:
metrics:
enabled: true
serviceMonitor:
enabled: true
namespace: monitoring
5. 常见问题排查指南
5.1 证书管理问题
当遇到TLS证书相关错误时:
bash复制# 查看secret是否正常
kubectl get secret -n <namespace>
# 检查ingress资源配置
kubectl describe ingress <ingress-name> -n <namespace>
5.2 413 Request Entity Too Large
调整上传大小限制:
yaml复制controller:
config:
proxy-body-size: "20m" # 默认1m,按需调整
5.3 长连接中断问题
优化keepalive配置:
yaml复制controller:
config:
keep-alive: "75s"
keep-alive-requests: "100"
6. 生产环境最佳实践
6.1 多副本与反亲和性
yaml复制controller:
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values: [ingress-nginx]
topologyKey: kubernetes.io/hostname
6.2 安全加固措施
yaml复制controller:
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
6.3 金丝雀发布策略
通过annotation实现:
yaml复制nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
7. 版本升级与回滚方案
7.1 Helm升级流程
bash复制# 先检查新版本变更说明
helm search repo ingress-nginx --versions
# 执行升级
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx \
-f custom-values.yaml \
--version <new-version>
7.2 紧急回滚操作
bash复制# 查看历史版本
helm history ingress-nginx -n ingress-nginx
# 回滚到指定版本
helm rollback ingress-nginx <revision-number> -n ingress-nginx
我在实际生产环境中发现,当ingress-nginx Pod出现CrashLoopBackOff时,90%的情况是由于节点资源不足或网络策略冲突导致。一个快速诊断命令是:
bash复制kubectl describe pod <pod-name> -n ingress-nginx | grep -A 20 Events
