前言
Ingress-Nginx 是 Kubernetes 生态中最常用的 Ingress Controller,负责将外部请求路由到集群内部的服务。在实际使用过程中,定期升级 Ingress-Nginx 以修复漏洞、增强功能、提高稳定性是非常重要的。
1. 检查当前 Ingress-Nginx 版本
在升级前,首先需要确认当前正在运行的版本。
helm list -n ingress-nginx
或者使用 kubectl
命令查看 Pod 及其镜像版本:
kubectl get pods -n ingress-nginx -o wide
kubectl describe pod <ingress-nginx-pod> -n ingress-nginx | grep Image
如果你使用 kubectl apply
安装的 Ingress-Nginx,可以通过以下命令检查 Deployment 版本:
kubectl get deployment -n ingress-nginx -o yaml | grep 'image:'
2. 备份当前配置
在升级之前,建议备份当前 Ingress-Nginx 配置,以便在升级失败时快速回滚。
2.1 备份 Ingress 规则
kubectl get ingress -A -o yaml > ingress-backup.yaml
2.2 备份 Helm Values(如果是 Helm 安装的)
helm get values ingress-nginx -n ingress-nginx -o yaml > values-backup.yaml
3. 确定目标升级版本
查看 Ingress-Nginx 官方最新发布的版本:https://github.com/kubernetes/ingress-nginx/releases
检查 Kubernetes 版本与 Ingress-Nginx 兼容性:
kubectl version --short
helm search repo ingress-nginx -l | head -5 # 列出最新 5 个版本
例如,如果你的 Kubernetes 版本是 1.29.x
,请确保选择与其兼容的 Ingress-Nginx 版本。
4. 开始升级 Ingress-Nginx
4.1 使用 Helm 升级(推荐方式)
如果你使用 Helm 部署了 Ingress-Nginx,可以使用以下命令升级:
helm repo update # 更新 Helm 仓库
helm upgrade ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx -f values-backup.yaml
如果要指定特定版本,例如 4.12.1
,可以运行:
helm upgrade ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx -f values-backup.yaml --version 4.12.1
4.2 使用 Helm 手动安装或升级
如果你下载了 .tgz
包并想要手动安装或升级 Ingress-Nginx,可以使用以下命令:
# 安装
helm install ingress-nginx -n ingress-nginx -f values-4.12.1.yaml ingress-nginx-4.12.1.tgz
# 升级
helm upgrade ingress-nginx -n ingress-nginx -f values-4.12.1.yaml ingress-nginx-4.12.1.tgz
# 卸载
helm uninstall ingress-nginx -n ingress-nginx
4.3 使用 kubectl apply 升级
如果你使用 kubectl apply
安装的 Ingress-Nginx,可以通过下载最新的 deploy.yaml
进行升级:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.0/deploy/static/provider/cloud/deploy.yaml
5. 验证升级是否成功
5.1 检查 Pod 状态
kubectl get pods -n ingress-nginx
所有 Pod 应该处于 Running
状态。
5.2 检查 Ingress 规则
kubectl get ingress -n <your-namespace>
5.3 测试访问
使用 curl
或浏览器访问 Ingress 入口地址,确保请求能够正常路由到后端服务。
curl -v http://<your-ingress-domain>
6. 解决常见问题
6.1 Helm 升级卡住
如果 Helm 命令执行后一直没有响应,可能是由于 Pod 无法正常启动。
解决方案:
kubectl get pods -n ingress-nginx
kubectl describe pod <pod-name> -n ingress-nginx
如果发现 ErrImagePull
,尝试手动拉取镜像:
docker pull registry.k8s.io/ingress-nginx/controller:v1.9.0
6.2 Pod 无法删除
如果 kubectl delete pod
后 Pod 仍然存在,可以使用强制删除:
kubectl delete pod <pod-name> -n ingress-nginx --grace-period=0 --force
如果还是删除不了,尝试重启 kubelet
:
sudo systemctl restart kubelet
6.3 访问 Ingress 时 404 错误
可能是 Ingress 规则未正确匹配,检查日志:
kubectl logs -n ingress-nginx <controller-pod>
确保 Ingress 规则正确:
kubectl describe ingress -n <your-namespace>
7. 结论
升级 Ingress-Nginx 是保障 Kubernetes 集群稳定性和安全性的关键步骤。