创建Service导致Kubernetes报错求助:CentOS7下v1.9集群异常
兄弟,我之前在K8s v1.9版本也踩过Service的坑,既然RC能正常创建,说明集群基础调度和Pod运行机制没问题,咱们一步步揪出问题根源:
1. 先抓准具体错误信息
别光看“创建失败”,先拿实锤日志:
# 查看Service的详细状态和事件 kubectl describe svc <你的Service名称> # 过滤集群中所有和Service相关的事件 kubectl get events | grep -i service
重点看Events字段里的报错,比如是不是标签不匹配、端口冲突,或者网络组件异常?
2. 核对Service YAML配置的核心细节
最常见的坑就是标签选择器和RC/Pod的标签不匹配:
比如你的RC Pod模板里标签是app: my-demo,但Service的selector写成了app: demo-app,直接导致Service找不到后端Pod,状态会显示Endpoints: <none>。
给你贴个正确的配置对照:
RC的Pod模板片段:
spec: template: metadata: labels: app: my-web # 这个标签是关键,必须和Service的selector完全一致 spec: containers: - name: nginx image: nginx:1.12 ports: - containerPort: 80
对应的Service配置:
apiVersion: v1 kind: Service metadata: name: my-web-svc spec: selector: app: my-web # 这里必须和Pod标签完全匹配 ports: - protocol: TCP port: 80 # Service对外暴露的端口 targetPort: 80 # Pod内容器实际监听的端口,别写错
3. 检查集群网络插件状态
K8s v1.9必须依赖第三方网络插件(比如Flannel、Calico)实现Pod通信和Service转发,要是插件挂了,Service肯定罢工:
# 检查网络插件Pod状态(以Flannel为例) kubectl get pods -n kube-system | grep flannel # 看日志找插件异常原因 kubectl logs <flannel-pod-name> -n kube-system
另外CentOS7的防火墙/SELinux也可能搞破坏,先临时关闭试试(生产环境后续要配规则,别直接裸奔):
systemctl stop firewalld setenforce 0
4. 确认kube-proxy组件正常运行
kube-proxy是Service转发的核心,它挂了Service就成了空架子:
# 检查kube-proxy Pod状态 kubectl get pods -n kube-system | grep kube-proxy # 异常的话看日志 kubectl logs <kube-proxy-pod-name> -n kube-system
如果是iptables模式的kube-proxy,还可以检查节点上的规则是否生成:
iptables-save | grep <你的Service名称>
没找到相关规则的话,说明kube-proxy没同步Service配置。
5. 排查DNS组件状态
如果是ClusterIP类型的Service,Pod访问它需要DNS解析,kube-dns挂了也会导致Service“看起来失败”:
kubectl get pods -n kube-system | grep kube-dns
要是状态异常,先解决DNS的问题。
把上面命令得到的具体信息贴出来,我再帮你精准定位问题!
内容的提问来源于stack exchange,提问作者macroxmu

