K8S学习笔记之Pod详解

艺帆风顺 发布于 2025-04-07 19 次阅读


在Kubernetes并不直接运行容器,而是通过Pod对象的方式来运行。Pod是Kubernetes中最小的调度和管理单位,它是由一个或多个容器组成的集合。每个Pod都有自己的IP地址,而且Pod内的所有容器共享相同的网络命名空间和存储卷。换句话说,Pod是一组运行在同一个节点上的容器的集合体。

Pod不是进程,而是容器运行的环境。在被删除之前,Pod会一直存在。

一、Pod资源清单详解

YAML格式的Pod定义文件的重要内容:

apiVersion: v1 # 资源对象版本号kind: Pod # 资源对象类型metadata: # 元数据 name: nginx-deploy # 元数据对象名称 labels: # 自定义标签 app: nginx # 自定义标签键值对 namespace: default # 命名空间,默认是default annotations: # 自定义注解 name: mynginx # 自定义注解信息apiVersion: v1 # 资源对象版本号kind: Pod # 资源对象类型metadata: # 元数据 name: nginx-deploy # 元数据对象名称 labels: # 自定义标签 app: nginx # 自定义标签键值对 namespace: default # 命名空间,默认是default annotations: # 自定义注解 name: mynginx # 自定义注解信息spec: # 定义对象 containers: # 定义容器列表 - name: nginx # 容器名称 image: nginx:1.22.0 # 指定容器镜像及版本 imagePullPolicy: IfNotPresent # 容器镜像拉去策略
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录 ports: # 需要暴露的端口列表 - name: http # 端口名称 containerPort: 80 # 所需暴露的端口号 protocol: TCP # 端口号的协议 volumeMounts: # 挂载到容器内部的存储卷配置 - name: data-volume # 指定可以被容器挂载的存储卷名称 mountPath: /data # 定义卷在容器内的挂载路径 readOnly: false # 设置存储卷的读写模式,true为只读模式,false是读写模式 resources: requests: # 最少需要的资源,不满足无法运行 cpu: 100m # 要求cpu最少使用0.1个核心 memory: 64Mi # 要求memory最少使用64Mi limits: # 最多使用的资源,超过则杀掉该容器 cpu: 200m # 限制最多使用0.2个核心 memory: 128Mi # 限制最多使用128兆 restartPolicy: OnFailure # 重启策略,Onfailure表示只有失败的情况才会重启 volumes: # 在该pod上定义的存储卷列表 - name: data-volume # 存储卷名称 emptyDir: {} # 类型为emptyDir的存储卷

说明:

1、镜像拉取策略:

  • Always:表示每次都尝试重新拉取镜像,这是默认的拉取镜像策略。

  • IfNotPresent:表示如果本地有该镜像,则使用本地镜像,本地不存在则拉取镜像。

  • Never:表示仅用本地镜像

2、port详解

  • port:port是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service

  • nodePort:nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service。

  • targetPort:targetPort是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

  • containerPort:containerPort是pod内部容器的端口,targetPort映射到containerPort。

总结:port和nodePort都是service的端口,前者暴露给k8s集群内部服务访问,后者暴露给k8s集群外部流量访问。从这两个端口到来的数据都需要经过反向代理kube-proxy,流入后端pod的targetPort上,最后到达pod内容器的containerPort。

3、重启策略

  • Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet都将重启它,这是默认的重启策略

  • OnFailure:有失败的情况才会重启,如果容器正常结束,则kubelet将不会重启它。

  • Never:Pod终止后,kubelet不会再重启该Pod。

二、Pod基本用法

1、创建pod

可以通过kubectl create命令直接创建也可以,yaml资源清单来

说明:生产环境Pod通常不是直接创建的,而是使用工作负载资源(如deployment,statusful等)创建的。

[root@k8s-master ~]# kubectl apply -f pod.yamlpod/nginx-deploy created

2、查看pod状态

[root@k8s-master ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deploy 1/1 Running 0 4s

常见状态值

running运行中
CrashLoopBackOff容器退出,kubelet正在将它重启
Terminating正在终止Pod
ImagePullBackOff正在重试拉取镜像
RegistryUnavailable连接不到镜像仓库
ErrImagePull拉取镜像出错
ContainerCreating容器创建中
Evicted驱赶(当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod.)。多见于资源不足时导致的驱赶

Pod生命周期的说明:

Pod的生命周期:

  • pod创建

  • 运行初始化容器(Init container);

  • 运行主容器;

  • 容器启动后钩子(post start)、容器终止前钩子(pre stop),在启动后就执行post start;

  • 容器存活性检查、就绪性检测。

  • pod终止过程,pod完全退出之前执行 pre stop操作。

Pod在其生命周期中只会被调度一次。一旦Pod被调度到某个节点,Pod会一直在该节点运行直到Pod停止或者被终止。

Pod是临时存在的实体。Pod被创建并被调度到节点,并在终止或删除之前一直运行在该节点。

3、查看pod的详细信息

[root@k8s-master ~]# kubectl describe pod nginx-deployName: nginx-deployNamespace: defaultPriority: 0Service Account: defaultNode: k8s-node2/10.0.0.107Start Time: Sat, 06 Jan 2024 11:28:44 +0800Labels: app=nginxAnnotations: cni.projectcalico.org/containerID: ba17161d21659b9dd8dd912094359c3f0a64a0c9aeaaa90d44d43b8d2d1caaa0 cni.projectcalico.org/podIP: 10.224.169.137/32 cni.projectcalico.org/podIPs: 10.224.169.137/32 name: mynginxStatus: RunningIP: 10.224.169.137IPs: IP: 10.224.169.137Containers: nginx: Container ID: containerd://1da5d9228ac8ef2bbf0ea0f886da6ca1974d505a3c8256b9205873b112614035 Image: nginx:latest Image ID: docker.io/library/nginx@sha256:2bdc49f2f8ae8d8dc50ed00f2ee56d00385c6f8bc8a8b320d0a294d9e3b49026 Port: 80/TCP Host Port: 0/TCP State: Running Started: Sat, 06 Jan 2024 11:28:45 +0800 Ready: True Restart Count: 0 Limits: cpu: 200m memory: 128Mi Requests: cpu: 100m memory: 64Mi Environment: none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5tw6x (ro)Conditions: Type Status Initialized True  Ready True  ContainersReady True  PodScheduled True Volumes: kube-api-access-5tw6x: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional:  DownwardAPI: trueQoS Class: BurstableNode-Selectors: none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 15m default-scheduler Successfully assigned default/nginx-deploy to k8s-node2 Normal Pulled 15m kubelet Container image "nginx:latest" already present on machine Normal Created 15m kubelet Created container nginx Normal Started 15m kubelet Started container nginx

4、删除pod

通过yaml资源清单删除

[root@k8s-master ~]# kubectl delete -f pod.yamlpod "nginx-deploy" deleted

有时候 Pod 的状态一直为  Terminating(终止),这个状态默认值是30秒,超时后可以强制删除Pod。

--grace-period=0  重载默认值

--force   强制删除

[root@k8s-master ~]# kubectl delete pod nginx-deploy --grace-period=0 --forceWarning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.pod "nginx-deploy" force deleted