> 文档中心 > Kubernetes集群Service资源异常排查思路

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应用程序,问题解决。

Kubernetes集群Service资源异常排查思路