K8S Pod详解

在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。

图片[1]-K8S Pod详解-不念博客

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.yaml
pod/nginx-deploy created

2、查看pod状态

[root@k8s-master ~]# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
nginx-deploy   1/1     Running   0          4s

常见状态值

running运行中
CrashLoopBackOff容器退出,kubelet正在将它重启
Terminating正在终止Pod
ImagePullBackOff正在重试拉取镜像
RegistryUnavailable连接不到镜像仓库
ErrImagePull拉取镜像出错
ContainerCreating容器创建中
Evicted驱赶(当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的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-deploy
Name:             nginx-deploy
Namespace:        default
Priority:         0
Service Account:  default
Node:             k8s-node2/10.0.0.107
Start Time:       Sat, 06 Jan 2024 11:28:44 +0800
Labels:           app=nginx
Annotations:      cni.projectcalico.org/containerID: ba17161d21659b9dd8dd912094359c3f0a64a0c9aeaaa90d44d43b8d2d1caaa0
                  cni.projectcalico.org/podIP: 10.224.169.137/32
                  cni.projectcalico.org/podIPs: 10.224.169.137/32
                  name: mynginx
Status:           Running
IP:               10.224.169.137
IPs:
  IP:  10.224.169.137
Containers:
  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:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  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.yaml
pod "nginx-deploy" deleted

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

–grace-period=0  重载默认值

–force   强制删除

[root@k8s-master ~]# kubectl delete pod nginx-deploy --grace-period=0 --force
Warning: 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
© 版权声明
THE END