K8s Nginx Ingress控制器启动失败问题排查求助
排查Ingress控制器部署失败及CrashLoopBackOff问题
咱们一步步拆解你的问题,逐个解决:
首先得明确:普通的nginx:1.13.12镜像并不是Kubernetes Ingress控制器专用镜像——这是你第一个Pod启动失败的核心原因,这个镜像里只有基础Nginx服务,完全没有Ingress控制器需要的/nginx-ingress-controller执行文件,启动自然会报错。
接下来针对你换镜像后遇到的CrashLoopBackOff、权限问题和inClusterConfig警告,咱们逐个击破:
1. 替换为正确的Ingress控制器镜像
Kubernetes主流的Ingress控制器镜像有两种选择,别再用普通Nginx镜像了:
- 官方Nginx Ingress控制器:
k8s.gcr.io/ingress-nginx/controller:v1.8.1(如果国内拉取困难,可改用国内镜像源:registry.cn-hangzhou.aliyuncs.com/google_containers/ingress-nginx-controller:v1.8.1) - NGINX官方维护的控制器:
nginxinc/nginx-ingress-controller:3.3.0
把你的Deployment镜像替换为上述专用镜像,这是解决问题的基础。
2. 解决权限不足问题
Ingress控制器需要访问Kubernetes API和系统资源,权限不够直接导致启动失败:
- 检查Deployment的
securityContext配置,确保运行用户正确:securityContext: runAsUser: 101 # 这是Ingress控制器默认使用的UID,对应容器内的nginx用户 allowPrivilegeEscalation: true - 配置必要的RBAC权限:Ingress控制器需要读取Ingress、Service、Endpoints等资源,你得创建对应的ClusterRole和ClusterRoleBinding,并绑定到控制器的ServiceAccount:
同时记得在Deployment里指定apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-nginx rules: - apiGroups: [""] resources: ["services", "endpoints", "pods"] verbs: ["get", "list", "watch"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "list", "watch"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses/status"] verbs: ["update"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ingress-nginx roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: ingress-nginx subjects: - kind: ServiceAccount name: ingress-nginx namespace: default # 替换为你的Ingress控制器所在命名空间serviceAccountName: ingress-nginx(要先提前创建这个ServiceAccount)。
3. 消除inClusterConfig警告
这个警告本质是控制器无法通过集群内API访问Kubernetes配置,核心还是RBAC或ServiceAccount配置问题:
- 确认控制器的ServiceAccount已经绑定了足够的ClusterRole权限;
- 可以进入Pod测试API访问:先安装curl(
apt update && apt install curl -y),然后执行curl https://kubernetes.default.svc,如果返回403,说明权限仍然不足,需要检查RBAC配置。
4. 验证Ingress资源配置
最后确保你的Ingress资源符合Kubernetes v1版本规范,这里给你适配两个服务的示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gearbox-rack-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 # 路径重写规则,适配服务路径 nginx.ingress.kubernetes.io/ssl-redirect: "false" # 暂时关闭HTTPS重定向,方便测试 spec: ingressClassName: nginx # 要和你的Ingress控制器class一致,默认是nginx rules: - http: paths: - path: /eureka/(.*) pathType: Prefix backend: service: name: gearbox-rack-eureka-server-nodeport port: number: 8761 - path: /config/(.*) pathType: Prefix backend: service: name: gearbox-rack-config-server-nodeport port: number: 8888
实用排查命令
如果还是有问题,用这些命令收集关键信息:
- 查看Pod详细日志:
kubectl logs <ingress-controller-pod-name> -n <namespace> - 查看Pod启动事件:
kubectl describe pod <ingress-controller-pod-name> -n <namespace> - 检查Ingress资源状态:
kubectl describe ingress gearbox-rack-ingress
内容的提问来源于stack exchange,提问作者user84592
相关产品推荐
相关产品推荐

