Pod是Kubernetes对象模型中能够创建或部署的最小并且是最简单的基本单元。一个Pod代表在集群中正在运行的一个进程。
Pod由一个或多个容器组成,它们共享容器存储、网络和容器运行配置项。Pod中的容器总是被同时调度,由共同的运行环境。

一、通过yaml文件定义Pod

Pod分类:

  • 自主式Pod:需要自己手动管理的Pod
  • 受控制器管理的Pod

Pod资源清单格式:

apiVersion:(group/version)
kind:(pod)
metadata:
  name:
  namespace:
  labels:
  annotations:
  ...
  ...
spec:
  containers:
  - name:
    image:
    command:
    args:
    imagePullPolicy:
    lifecycle:
    livenessProbe:
    readinessProbe:
    env:
    - name:
      value:
  nodeSelector:
    key1: value1
    key2: value2
status:<只读,由kubernetes自己创建>

可以使用kubectl explain pod命令详细查看pod资源所支持的所有字段:
比如我想了解pod资源的spec字段下的nodeSelector字段的详细信息,可以使用以下命令查看:

[[email protected] manifests]# kubectl explain pod.spec.nodeSelector
KIND:     Pod
VERSION:  v1

FIELD:    nodeSelector <map[string]string>

DESCRIPTION:
 NodeSelector is a selector which must be true for the pod to fit on a node.
 Selector which must match a node's labels for the pod to be scheduled on
 that node. More info:
 https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

定义一个pod-demo.yaml创建一个pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"  

使用kubectl create命令更具pod-demo.yaml创建pod:

[[email protected] manifests]# kubectl create -f pod-demo.yaml 
pod/pod-demo created

Kubernetes之Pod
这样就创建了一个名为pod-demo的pod

二、Pod调度

调度策略分为

  • 全局调度:在调度器启动是配置
  • 运行时调度:在yaml文件中指定,包括nodeSelector等

Scheduler是kubernetes的调度器,其作用是根据特定的调度算法和策略将Pod调度到指定的计算节点(Node)上,其作为单独的程序运行,启动之后会一直监听API Server,获取Pod.spec.nodeName为空的Pod,对每个Pod都会创建一个绑定(binding)。

全局调度
分以下几个部分:

1.首先是预选过程,过滤掉不满足条件的节点,这个过程称为predicates。
2.然后是优选过程,对通过的节点按照优先级排序,称之为priorities。
3.最后从中选择优先级最高的节点

大体如下图
Kubernetes之Pod
运行时调度
kubernetes主要通过以下几种方式设置运行时调度:

1.节点设置相应label,然后使用nodeSelector选择对应节点的label
2.节点设置相应label,然后使用affinity(亲和性)和anti-affinity(非亲和性)选择对应节点的label
3.为节点设置污点taints,然后使用容忍tolerations

详细的使用方法可以参考Kubernetes之Pod调度

三、pod生命周期

Kubernetes之Pod
说明:

  1. 初始化容器阶段初始化pod中每一个容器
  2. 启动主容器main container
  3. 在main container刚刚启动之后可以执行post start命令
  4. 在整个main container执行的过程中可以做两类探测:liveness probe(存活探测)和readiness probe(就绪探测)
  5. 在main container结束前可以执行pre stop命令

pod状态解析

  • Pending:挂起,表示调度尚未完成
  • Running:运行,调度已完成并且所有容器已经被创建
  • Failed:失败,pod中的所有容器都被终止并且至少由一个容器终止异常
  • Succeeded:完成,pod中的所有容器都已经被终止并且不会被重启
  • Unknown:未知,pod状态获取不到

配置Pod的liveness和readiness探针
两种探针都支持三种类型:

  • ExecAction:命令形式
  • TCPSocketAction:建立TCP连接
  • HTTPGetAction:发送http get请求

详细可参考配置Pod的liveness和readiness探针

配置启动后钩子(post start)和终止前钩子(pre stop)

  • post start:容器创建之后立即执行,如果失败了就会按照重启策略重启容器
  • pre stop:容器终止前立即执行,执行完成之后容器将成功终止

可以使用以下命令查看post start和pre stop的设置格式:

[[email protected] manifests]# kubectl explain pod.spec.containers.lifecycle.preStop
[[email protected] manifests]# kubectl explain pod.spec.containers.lifecycle.postStart

四、Pod控制器

pod控制器类型以及对应的核心资源:

  • ReplicationController:副本控制器
  • ReplicaSet:管理无状态应用,新一代的ReplicationController
    用户期望的副本数
    标签
    扩缩容
  • Deployment:管理无状态应用,建构在ReplicaSet之上的
    滚动更新
    声明式配置–>支持动态运行时修改
  • DaemonSet:管理无状态应用
  • Job:执行一次性任务,执行成功后就退出
  • CronJob:周期性Job
  • StatefulSet:管理有状态应用

Deployment滚动更新策略:
Kubernetes之Pod

相关文章:

  • 2020-04-11
  • 2018-07-06
  • 2019-09-14
  • 2019-11-18
  • 2021-11-19
  • 2021-08-14
  • 2021-04-29
  • 2021-12-02
猜你喜欢
  • 2021-12-15
  • 2021-05-09
  • 2021-04-06
  • 2021-11-01
  • 2022-01-01
  • 2021-11-03
  • 2021-09-08
相关资源
相似解决方案