今天我们继续学习Kubernetes内容pod资源对象

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

相关推荐
远程软件小帮手10 小时前
云电脑挂机功能上线!边上班摸鱼边游戏多开教程
运维·服务器
xier_ran10 小时前
关键词解释:对比学习(Contrastive Learning)
人工智能·深度学习·学习·机器学习·对比学习
andwhataboutit?10 小时前
GAN学习
深度学习·学习·生成对抗网络
CHANG_THE_WORLD11 小时前
Python 学习三 Python字符串拼接详解
开发语言·python·学习
cike_y11 小时前
浅谈用docker搭建一个ctf镜像
运维·安全·网络安全·docker·容器·ctf
其美杰布-富贵-李11 小时前
SpaceClaim流体域创建学习笔记
笔记·学习
冬夜戏雪11 小时前
【java学习日记】【2025.12.6】【6/60】
学习
云和数据.ChenGuang11 小时前
运维工程师技术之openEuler 网卡基础查询指令
运维·中间件·mycat·运维工程师·运维技术
意疏11 小时前
不用云服务器也能跨设备转写!CapsWriter+cpolar 实现离线语音协作自由
运维·服务器