如何在Kubernetes 1.26.3中部署并配置Nginx-Ingress控制器?
问题排查与解答
一、svclb-nginx-ingress-v1-controller Pod Pending 问题排查
在Rancher Desktop环境下,这个svclb开头的Pod是ServiceLB组件的实例,用来给LoadBalancer类型的Service提供本地负载均衡能力。它处于Pending状态,大概率是以下几种情况:
- 先查节点资源:执行
kubectl describe node <节点名称>,看节点的CPU、内存是否有剩余容量 - 看Pod事件详情:跑
kubectl describe pod svclb-nginx-ingress-v1-controller -n kube-system,重点看Events字段,有没有镜像拉取失败、节点选择器不匹配这类具体报错 - 确认Rancher Desktop的网络状态:ServiceLB依赖主机网络,检查containerd运行正常,且主机的80/443端口没被其他进程占用
另外可以先确认Nginx-Ingress核心组件状态:kubectl get pods -n kube-system | grep nginx-ingress,如果controller的Pod是Running状态,说明控制器本身已经正常启动,svclb的问题只是外部暴露的LoadBalancer服务暂时未就绪,不影响Ingress规则的内部转发测试。
二、Ingress配置疑问解答
1. ingressClassName 是否必须指定?
从Kubernetes 1.19版本开始,Ingress资源默认需要指定ingressClassName(除非集群设置了默认IngressClass):
- 单Ingress控制器场景:先查集群里的IngressClass:
kubectl get ingressclass,如果有标注default: true的条目,那Ingress配置里可以不写ingressClassName,系统会自动匹配;如果没有默认项,必须手动指定,否则Ingress规则不会被控制器识别。 - 多Ingress控制器场景:必须指定ingressClassName,用来区分不同控制器处理对应的Ingress规则。
2. backend.service.port 指的是什么端口?
这个字段是集群内Service自身监听的端口,也就是你的game-core-service的8080端口。外部访问的80/443是Ingress控制器暴露的端口,Ingress规则会把外部80端口的请求转发到Service的8080端口。
给你一个符合需求的Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: game-core-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: ingressClassName: nginx # 换成你实际的IngressClass名称 rules: - host: localhost http: paths: - path: /myservice/(.*) pathType: Prefix backend: service: name: game-core-service port: number: 8080
如果要让localhost:80/myservice直接转发到服务根路径,可根据服务的路由规则调整path和rewrite-target参数。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

