Kubernetes集群Service资源异常排查思路
Kubernetes集群Service资源异常排查思路
文章目录
- Kubernetes集群Service资源异常排查思路
-
- 1.Service资源的概念
- 2.在K8S集群中部署Deployment资源
- 3.编写Service资源模拟标签选择器关联错误的故障
- 4.Service资源异常的故障排查思路
1.Service资源的概念
在K8S集群中,Pod资源是无状态的,随时可能会被删除重建,也就是说Pod的IP随时都可能发生变化,如果服务与服务之间的调用是通过Pod的IP进行调度的,那么当Pod删除重建后,就无法正常调度了。
基于这种情况,可以在K8S集群中定义Service资源对象,充电一个负载均衡器的作用,定义一个唯一的服务访问入口,这个地址可以是域名也可以是Service资源的地址,由Service资源管理一个服务的所有Pod资源,服务之间的调用就可以通过Service资源访问到具体的Pod资源。
Service接收到请求如何分发主要是靠Kube-proxy来转发的。
最常见的Service资源异常就是标签选择器关联错误导致,下面来创建一个Deployment资源,由Service资源进行管理,模拟访问异常的故障排查流程。
2.在K8S集群中部署Deployment资源
1)编写资源编排文件
# vim knowsystem.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: knowsystemspec: replicas: 3 selector: matchLabels: app: knowsystem-pod template: metadata: labels: app: knowsystem-pod spec: containers: - name: know-system image: jiangxlrepo/know-system:v1
2)创建资源
# kubectl apply -f knowsystem.yaml# kubectl get podNAME READY STATUS RESTARTS AGEknow-system-768f8fb59d-6dqwr 1/1 Running0 39sknow-system-768f8fb59d-x8lnf 1/1 Running0 44sknow-system-768f8fb59d-xfhm9 1/1 Running0 41s
3.编写Service资源模拟标签选择器关联错误的故障
1)编写资源编排文件
# vim knowsystem-svc.yaml apiVersion: v1kind: Servicemetadata: name: knowsystem-svc labels: app: knowsystemspec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 selector: app: knowsystem#故意将标签选择器关联Pod的标签写错,模拟出访问异常的故障
2)创建资源
# kubectl apply -f knowsystem-svc.yaml[root@k8s-master k8s-tools]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEknowsystem-svc NodePort 10.100.248.6 80:30574/TCP 67s
3)访问Service资源管理的Pod提供的服务
# curl 10.100.248.6curl: (7) Failed connect to 10.100.248.6:80; 拒绝连接
4.Service资源异常的故障排查思路
故障描述:
在前面部署完Deployment资源和Service资源后,发现通过Service资源访问Pod资源提供的服务,出现了拒绝连接的现象,访问不成功。
排查思路:
1)首先排查Pod中的应用程序是否可以正常访问。
# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESknowsystem-569b887d55-kp8z7 1/1 Running 0 3m32s 100.64.169.178 k8s-node2 knowsystem-569b887d55-qztnc 1/1 Running 0 3m32s 100.111.156.73 k8s-node1 knowsystem-569b887d55-shzv5 1/1 Running 0 3m32s 100.64.169.179 k8s-node2 # curl -I 100.64.169.178HTTP/1.1 200 OKServer: nginx/1.16.0
2)发现Pod中的应用程序是可以正常提供服务的,紧接着去排查Service资源的详细信息。
[root@k8s-master k8s-tools]# kubectl describe svc knowsystem-svc Name:knowsystem-svcNamespace: defaultLabels: app=knowsystemAnnotations:Selector: app=knowsystem#关联Pod标签的选择器Type:NodePortIP: 10.100.248.6Port: 80/TCPTargetPort: 80/TCPNodePort: 30574/TCPEndpoints: #没有关联到任何的Pod资源Session Affinity: NoneExternal Traffic Policy: ClusterEvents:
3)查看Service资源的详细信息后,发现没有关联上任何一个Pod资源,那么问题也就出在了Service资源这里,Service资源管理Pod资源是通过标签选择器进行关联的,下面我们来查看Pod定义的标签列表。
[root@k8s-master k8s-tools]# kubectl get pod --show-labelsNAME READY STATUS RESTARTS AGE LABELSknowsystem-569b887d55-kp8z7 1/1 Running 0 6m27s app=knowsystem-pod,pod-template-hash=569b887d55knowsystem-569b887d55-qztnc 1/1 Running 0 6m27s app=knowsystem-pod,pod-template-hash=569b887d55knowsystem-569b887d55-shzv5 1/1 Running 0 6m27s app=knowsystem-pod,pod-template-hash=569b887d55
4)可以看到Pod的标签是app=knowsystem-pod,而Service的标签选择器中关联的是app=knowsystem,那么问题就可以定位了,标签选择器关联错Pod的标签导致的。
5)在Service资源的编排文件中将标签选择器进行调整。
······ selector: app: knowsystem-pod
6)更新Service资源。
# kubectl apply -f knowsystem-svc.yamlservice/knowsystem-svc configured
7)再次访问Service资源管理的Pod应用程序,问题解决。