在AWS部署NGINX Ingress Controller后Pod异常问题求助
解决NGINX Ingress Controller CrashLoopBackOff:services "ingress-nginx" not found
我之前也碰到过一模一样的问题,咱们一步步拆解排查:
这个错误的核心原因很直接:你执行的patch命令是用来配置--publish-service参数的,它要求Ingress Controller关联ingress-nginx/ingress-nginx这个Service,但你的集群里根本不存在这个Service,导致Controller启动时直接报错退出。
第一步:先恢复正常状态
先把被patch改坏的Deployment回滚到之前的正常版本:
kubectl rollout undo deployment nginx-ingress-controller -n ingress-nginx
等个几十秒,你会看到Pod重新回到Running状态,Available计数也会恢复。
第二步:确认当前集群的Service情况
执行命令查看ingress-nginx命名空间下的所有Service:
kubectl get svc -n ingress-nginx
你大概率会发现没有名为ingress-nginx的Service,反而可能是类似nginx-ingress-controller的名称(这是旧版本Ingress Controller部署的默认Service名)。
第三步:根据实际情况修复
情况1:已经存在对应的Service,修正patch参数
假设你查到的Service名称是nginx-ingress-controller,直接用这个名称重新执行patch:
kubectl patch deployment -n ingress-nginx nginx-ingress-controller --type='json' --patch='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--publish-service=ingress-nginx/nginx-ingress-controller"}]'
情况2:没有对应的LoadBalancer Service,先创建再patch
首先创建适配AWS环境的LoadBalancer Service,保存为ingress-nginx-svc.yaml:
apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx labels: app: nginx-ingress spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP name: http - port: 443 targetPort: 443 protocol: TCP name: https selector: app: nginx-ingress # 这个要和你Ingress Controller Pod的标签匹配,可通过`kubectl get pods -n ingress-nginx --show-labels`确认
执行创建命令:
kubectl apply -f ingress-nginx-svc.yaml
等Service创建完成(AWS会分配ELB地址),再重新执行你最初的patch命令即可。
最后验证
检查Pod状态确认恢复正常:
kubectl get pods -n ingress-nginx
也可以查看Pod日志确认没有报错:
kubectl logs -n ingress-nginx <你的controller-pod名称>
内容的提问来源于stack exchange,提问作者SME
相关产品推荐
相关产品推荐

