Pod资源清单详解
资源清单必须存在的属性
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| apiversion | String | 指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查询 |
| kind | String | 这里指的是yaml文件定义的资源类型和角色,比如:Pod |
| metadata | Object | 元数据对象,固定值就写metadata |
| metadata.name | String | 元数据对象的名称,这里由我们编写,比如命名Pod的名字 |
| metadata.namespace | String | 元数据对象的命名空间,由我们自定义 |
| spec | Object | 详细定义对象,固定值就是Spec |
| spec.containers[] | list | 这是是spec对象的容器列表定义,是个列表 |
| spec.containers[].name | String | 这里定义容器的名称 |
| spec.containers[].image | String | 这里定义要用到的镜像名称 |
Pod探针
在K8S集群中,为了测试pod是否正常运行,可以通过kubelet定期对pod进行健康检查,从而保证服务正常运行。
3.5.1 kubelet检查机制
-
exec: 在容器内执行指定命令,当返回码为0表示检测成功。在 Kubernetes 1.20 版本之前,exec 探针会忽略 timeoutSeconds: 探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。
-
httpGet:对容器的IP和URL进行HTTP的GET请求,当响应码(状态码)为大于等于200且小于400,表示容器正常运行。
-
tcpSocket:对容器内的端口或socket进行TCP检查,如果端口成功打开,证明容器正常运行。
3.5.2 探针返回结果
-
Success:表示通过检测。
-
Failure:表示未通过检测。
-
Unknown:表示检测没有正常进行。
3.5.3 探针的类型
-
livenessProbe(存活探针):判断容器是否正常运行。如果存活探测失败,那么kubelet就会把老的容器删除,然后根据重启策略对容器做操作。如果容器没有存活探针,默认状态为Success。
-
readinessProbe(就绪探针):判断容器的是否就绪。比如:应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。在这种情况下,既不想杀死应用,也不想给它发送请求。这个时候就需要用到这个探针。当就绪探测失败,端点控制器将从与 Pod匹配的所有服务的端点列表中删除该 Pod 的 IP 地址(如果是用nodeport映射端口到外网,这个时候就不能访问网站了,但是容器不会被删除),初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。
-
startupProbe(启动探针):指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用 ,直到此探针成功为止。如果启动探测失败,kubelet 将删除容器,而容器依其重启策略进行重启。如果容器没有提供启动探测,则默认状态为 Success。
注意:startupProbe 和 livenessProbe 最大的区别就是startupProbe在探测成功之后就不会继续探测了,而livenessProbe在pod的生命周期中一直在探测!
livenessProbe探针案例
bash
[root@k8s-master01 ~]# cat /root/nginx/nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pods
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
exec: #定义探测方式
command: #不断查看文件是否存在,文件必须是镜像原本存在的文件
- cat
- /usr/share/nginx/html/index.html
initialDelaySeconds: 5 #指定探针多少秒后启动
periodSeconds: 5 #指定探针探测周期时间
[root@k8s-master01 ~]# kubectl apply -f nginx-exec.yml
[root@k8s-master01 ~]# kubectl get pod
###进入容器,触发探针
[root@k8s-master01 nginx]# kubectl exec -it nginx-pods /bin/bash
root@nginx-pods:/usr/share/nginx/html# mv index.html index1.html
###好处看看后发现重启了1次
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pods 1/1 Running 1 (59s ago) 4m15s
##再次进入容器,发现文件重建了
[root@k8s-master01 nginx]# kubectl exec -it nginx-pods /bin/bash
root@nginx-pods:/usr/share/nginx/html# ls
50x.html index.html
readinessProbe探针案例
bash
[root@k8s-master01 ~]# vim nginx-re-exec.yml
apiVersion: v1
kind: Service
metadata:
labels:
svc: nginx-svc-nodeport
name: nginx-svc-nodeport
spec:
type: NodePort
ports:
- port: 8000 ##pod的端口
targetPort: 80 ##容器内部暴露的端口
nodePort: 30080 ##对外访问端口
selector:
app: nginx
[root@k8s-master01 ~]# kubectl apply -f nginx-re-exec.yml #创建容器
[root@k8s-master01 ~]# kubectl get pod -A -o wide #查看容器的创建节点
[root@k8s-master01 ~]# kubectl get svc -o wide #查看service
[root@k8s-master01 ~]# kubectl describe svc nginx-svc-nodeport #查看pod和service绑定
[root@k8s-master01 ~]# curl -I http://192.168.116.132:30080 #访问网站成功
###测试####
[root@k8s-master01 ~]# kubectl get pod -A -o wide 查看容器名字,可以看到原本READY是1/1
[root@k8s-master01 ~]# kubectl exec -it nginx-8595754649-jfz9r -- bash 连接容器
# cd /usr/share/nginx/html/ #修改探针指定探测的文件名字,让探针触发
#ls
#mv index.html index1.html
#exit
[root@k8s-master01 ~]# kubectl get pod -A -o wide #可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建
[root@k8s-master01 ~]# curl -I http://192.168.116.132:30080 #可以看到网站访问不了
[root@k8s-master01 ~]# kubectl describe svc nginx-svc-nodeport #可以看到Endpoints没有值,证明探针把service和pod解除绑定了
###恢复
echo nginx-1 > index.html
kubectl cp index.html default/nginx-8595754649-jfz9r:/usr/share/nginx/html/
就绪探针不会影响pod和pod之间的访问
bash
[root@k8s-master01 ~]# kubectl run net-test1 --image=alpine sleep 360000 #创建容器
[root@k8s-master01 ~]# kubectl get pod -A -o wide #查看pod的IP
[root@k8s-master01 ~]# kubectl exec -it net-test1 -- bash #连接容器
#可以看到只要指定改过的pod的端口,pod和pod之间还是可以访问的
#wget http://10.10.1.36:8080
#ls
Pod案例快速生成YAML文件
bash
##生成Pod模版
[root@k8s-master01 nginx]# kubectl run pod --image=nginx --dry-run=client -o yaml > my-pod.yaml
[root@k8s-master01 ~]# vim /root/nginx/nginx_pod.yaml
bash
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
创建Pod
bash
[root@k8s-master01 ~]# kubectl apply -f /root/nginx/nginx_pod.yaml
Pod常用命令(必须背会)
| 命令 | 作用 |
|---|---|
| 创建pod | kubectl create -f ymal文件 |
| 查看pod | kubectl get pod [-n 名称空间]<br>kubectl get pod -o wide |
| 更新pod | kubectl apply -f yaml文件 |
| 删除pod | kubectl delete pod pod名称 |
| 进入pod中的容器 | kubectl exec -it pod名称 -- shell |
| 查看pod中容器日志 | kubectl logs pod名称 -c 容器名 |
| 查看pod标签 | kubectl get pod pod名称 --show-labels |
| 修改pod标签 | kubectl label pod pod名称 newkey=newvalue |
| 查看标签为app的pod | kubectl get pod -l app |
| 查看所有名称空间标签为app的pod | kubectl get pod -l app --all-namespaces |
| 查看标签为app,值为myapp的pod | kubectl get pod -l app=myapp<br>kubectl get pod -l app=myapp --all-namespaces |
| 查看详细信息 | kubectl describe pod pod名称 |
常用的排障命令
根据标签查看指定pod
bash
kubectl get pod -l app=nginx
vim test-pod.yaml #调整
排错
bash
kubectl apply -f test-pod.yaml
kubectl get po -o wide
kubectl describe pod nginx-3 #看详细信息
因为cpu和内存资源不可更新,所以要先删除再更新就可以了
bash
kubectl delete pod nginx-3
kubectl apply -f test-pod.yaml
常见故障归类
Pod状态 一直处于 Pending
Pod状态 一直处于 Waiting或者Pod状态 一直处于 ContainerCreating
Pod状态 处于 ImagePullBackOff
Pod状态 处于 CrashLoopBackOff
Pod状态 处于 Error
Pod状态 一直处于 Terminating或者Pod状态 处于 Unknown
Pod状态 处于 Evicted