今天我们继续学习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

相关推荐
China_Yanhy2 小时前
入职 Web3 运维日记 · 第 8 日:黑暗森林 —— 对抗 MEV 机器人的“三明治攻击”
运维·机器人·web3
艾莉丝努力练剑2 小时前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
酉鬼女又兒3 小时前
每天一个Linux命令_printf
linux·运维·服务器
翼龙云_cloud3 小时前
国际云代理商:2026年国际云注册风控升级实战指南 8 大平台无卡解决方案对比
服务器·阿里云·云计算
●VON3 小时前
CANN推理引擎:从云端到边缘的极致加速与部署实战
学习·react native
虾说羊3 小时前
docker容器化部署项目流程
运维·docker·容器
Trouvaille ~3 小时前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
笔画人生3 小时前
深度解析 CANN 项目:以 `ops-transformer` 为例探索高性能 AI 算子库
学习·开源
大大大反派3 小时前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
AI视觉网奇3 小时前
3d数字人 ue blender 绑定衣服对齐 2026
学习·ue5