Kubernetes集群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.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: knowsystem
spec:
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 pod
NAME READY STATUS RESTARTS AGE
know-system-768f8fb59d-6dqwr 1/1 Running 0 39s
know-system-768f8fb59d-x8lnf 1/1 Running 0 44s
know-system-768f8fb59d-xfhm9 1/1 Running 0 41s
3.编写Service资源模拟标签选择器关联错误的故障
1)编写资源编排文件
# vim knowsystem-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: knowsystem-svc
labels:
app: knowsystem
spec:
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 svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
knowsystem-svc NodePort 10.100.248.6 <none> 80:30574/TCP 67s
3)访问Service资源管理的Pod提供的服务
# curl 10.100.248.6
curl: (7) Failed connect to 10.100.248.6:80; 拒绝连接
4.Service资源异常的故障排查思路
故障描述:
在前面部署完Deployment资源和Service资源后,发现通过Service资源访问Pod资源提供的服务,出现了拒绝连接的现象,访问不成功。
排查思路:
1)首先排查Pod中的应用程序是否可以正常访问。
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
knowsystem-569b887d55-kp8z7 1/1 Running 0 3m32s 100.64.169.178 k8s-node2 <none> <none>
knowsystem-569b887d55-qztnc 1/1 Running 0 3m32s 100.111.156.73 k8s-node1 <none> <none>
knowsystem-569b887d55-shzv5 1/1 Running 0 3m32s 100.64.169.179 k8s-node2 <none> <none>
# curl -I 100.64.169.178
HTTP/1.1 200 OK
Server: nginx/1.16.0
2)发现Pod中的应用程序是可以正常提供服务的,紧接着去排查Service资源的详细信息。
[root@k8s-master k8s-tools]# kubectl describe svc knowsystem-svc
Name: knowsystem-svc
Namespace: default
Labels: app=knowsystem
Annotations: <none>
Selector: app=knowsystem #关联Pod标签的选择器
Type: NodePort
IP: 10.100.248.6
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30574/TCP
Endpoints: <none> #没有关联到任何的Pod资源
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
3)查看Service资源的详细信息后,发现没有关联上任何一个Pod资源,那么问题也就出在了Service资源这里,Service资源管理Pod资源是通过标签选择器进行关联的,下面我们来查看Pod定义的标签列表。
[root@k8s-master k8s-tools]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
knowsystem-569b887d55-kp8z7 1/1 Running 0 6m27s app=knowsystem-pod,pod-template-hash=569b887d55
knowsystem-569b887d55-qztnc 1/1 Running 0 6m27s app=knowsystem-pod,pod-template-hash=569b887d55
knowsystem-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.yaml
service/knowsystem-svc configured
7)再次访问Service资源管理的Pod应用程序,问题解决。