三、POD详解

2024-01-09 21:45:10

目录

一、Pod创建过程:

二、Pod的终止

三、pod配置详解

四、查看每种资源的可配置项

五、Pod状态

六、Pod调度

七、Pod探针

1、Pod 探针的检测方式:?


一、Pod创建过程:

  1. 用户提交创建pod请求
  2. API Server处理用户请求,存储Pod数据到Etcd
  3. Schedule通过和API Server的监听机制,查看到新的Pod,尝试为Pod绑定node
  4. 过滤主机:调度器用一组规则过滤不符合要求的主机,比如:Pod指定了所需要的资源,那么就要过滤掉资源不够的主机、或者pod标签指定调度到那个主机上、或者某个节点上存在污点,而此pod能否容忍这个污点,也会被过滤,
  5. 主机打分:对第一步筛选出来的符合要求的主机进行打分,在此阶段,调度器会考虑一些整体优化策略。
  6. 选择主机:选择得分最高的主机,进行binding,并把结果存储到Etcd中。
  7. kubelet根据调度结果执行Pod的创建操作,绑定成功后,会启动container、docker run,scheduler会掉用API Server在etcd中创建一个bound pod 对象,描述在一个工作节点上绑定运行的所有pod 信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod 信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用 Docker API 创建并启动pod 内的容器
  8. POD 创建完成

二、Pod的终止

  1. api server收到删除pod的请求,将 pod 标记为“Terminating”状态
  2. 同时会在Endpoint删除Pod的IP地址
  3. 容器运行时给所有容器的1号进程发送TERM
  4. 如果定义了preStop,则会执行preStop
  5. 容器开始graceful关闭
  6. 如果超过grace-period,pod还没有被关闭,则会执行强制关闭pod流程,容器运行时向所有的container发送 SIGKILL;之后kubelet强制删除pod

如图:如果执行了删除pod 的指令,pod状态变更的同时在Endpoint中pod 的IP也会被删除

三、pod配置详解

#必选,api版本
apiVersion: v1
#必选,定义什么就写什么,比如定义一个pod就写pod,要定义server就写server
kind: Pod
#必选,元数据
metadata:
  #必选,pod名称
  name: string
  #pod的命名空间,如果不填,默认是default,或者使用-n 参数来指定命名空间
  namespace: string
  #对应kind,是pod的标签列表,可以填写多个labels
  labels:
      #对应kind,自定义标签列表,
    - name: string
  #对应kind,自定义注解列表,
  annotations:
    - name: string
#必选,pod中容器的详细定义
spec:
  initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
  - command:
    - sh
    - -c
    - echo "初始化"
  #必选,容器列表
  containers:
    #必选,容器名字
  - name: string
    #必选,容器的镜像名称
    image: string
    #拉取镜像的策略,Always:总是拉取镜像库的镜像,Never:使用本地镜像,IfNotPresent:本地有镜像就不拉取镜像库镜像,没有就拉取
    imagePullPolicy: [Always | Never | IfNotPresent]
    #容器的启动命令,如果不指定,则使用镜像打包时使用的启动命令
    command: [string]
    #容器的启动命令参数列表
    args: [string]
    #容器的工作目录
    workingDir: string
    # workingDir: /k8s/kubernetes/
    #挂载到容器内部的存储卷配置
    volumeMounts:
      #引用pod定义的共享存储卷的名称,
    - name: string
      #存储卷在容器内挂在的绝对路径,赢小于512个字符
      mountsPath: string
      #是否为只读模式,默认是读写
      readOnly: boolean
    #容器需要暴露的端口号列表
    ports:
      #端口名称
    - name: string
      #容器需要监听的端口号
      containerPort: int
      hostPort: int
      #端口协议,支持TCP和UDP  默认TCP
      protocol: string
    #容器运行前设置的环境变量列表
    env:
      #环境变量名称
    - name: string
      #值
      value: string
    #资源限制和请求设置
    resource:
      #资源限制设置
      limits:
        #cpu限制,单位为core数,将用于docker run  --cpu-shares参数
        cpu: string
        #内存限制,单位为MiB、GiB等,将用于docker run --momory参数
        memory: string
      #资源请求设置
      requests:
        #cpu请求,容器启动的初始可用数量
        cpu: string
        #内存请求,容器启动的初始可用数量
        memory: string
    #对pod内各容器健康检查设置当探针无响应几次之后,系统将自动重启该容器,可以设置的方法包括:exec、httpGet、tcpSocket。对一个容器仅需设置一种方法
    livenessProbe:
      #执行容器命令检测方式
      exec:
        command: [string]
      #httpGet检查方式
      httpGet:
        path: string # http服务器上的访问URL
        port: string # 容器上要访问端口号或名称
        host: string # 要连接的主机名,默认POD ip
        scheme: string # 用于连接host的协议,默认HTTP
        httpHeaders: # 自定义HTTP请求headers,HTTP允许重复headers
        - name: string
          values: string
      tcpSocket: # 端口检测方式
        port: 端口号
      initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
      timeoutSeconds: 2 #探针执行检测请求后,等待响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
      periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
      successThreshold: 2 # 检查成功两次表示就绪
      failureThreshold: 1 # 检查失败1次表示未就绪
    Lifecycle:
      postStart: # 容容器创建成功后,运行前的任务,用于资源部署、环境准备等 可以使exec、httpGet、TCPSocket
        exec:
          command:
          - sh
          - -c
          - "mkdir /data/"
      PreStop: #在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。
        httpGet:
          host: monitor.com
          psth: /waring
          port: 8080
          scheme: HTTP          
    securityContext:
      privileged: false
  # restartPolicy pod的重启策略,默认为 Always。
  1、Always:POD一旦终止运行,无论容器是如何终止的,kubelet都将重启它,
  2、OnFailure:只有pod以非0退出码终止时,kubelet才会重启该容器,如果容器正常结束(退出码为0)则不会重启
  3、Never :无论什么状态,都不会重启
  restartPolicy: [Always | Never | OnFailure]
  #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeName: k8s-node-2
  #用于将pod调度到添加了指定标签的node节点上,指定node 节点,先打一个标签。
  nodeSelector: object
    hostname: k8s-node-1
  imagePullSecrets:
  - name: string
  hostNetwork: false/true  默认为false
  # dnsPolicy 设置pod的DNS策略:
  1、default:继承Pod所在宿主机的域名解析设置
  2、clusterFirst:优先是用kubernetes环境的DNS服务,
  3、clusterFirstWithHostNet:适用于以hostNetwork模式运行的pod,此时hostNetwork 必须为true
  4、None:忽略kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置
  dnsPolicy: default
  Volumes: # 共享存储卷列表
  - name: string #名称,
    emptyDir: {} # 挂载目录
    hostPath: #挂载本机目录
      path: string
    secret:
      secretName: string
      items:
      - key:string
        path: string
    configMap:
      name: string
      items:
      - key: string
        path: string

四、查看每种资源的可配置项

kubelet explain 资源类型

#   kubectl explain 资源类型         查看某种资源可以配置的一级属性
#    kubectl explain 资源类型.属性     查看属性的子属性
[root@k8s-master-1 logs]# kubectl explain pod
[root@k8s-master-1 logs]# kubectl explain pod.metadata

五、Pod状态

1、Pending:挂起。我们在请求创建pod时,天剑不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了但是没有适合它运行的节点叫做挂起。

2、Running:Pod内多有容器都已经被创建,且至少一个容器正处于运行状态,正在启动状态或者重启状态。

3、Succeeded:Pod中所有容器都执行成功后退出,并且没有处于重启的容器

4、Failed:Pod中所有容器都已退出,但是至少还有一个容器退出时为失败状态

5、Unknown:位置状态,所谓pod是什么状态是apiserver和运行在节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息 了,就会看到Unknown。

六、Pod调度

????????在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration

七、Pod探针

????????StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否启动。如果配置了StartupProbe,就会先禁止其他的探测,直到他成功为止,成功后将不在进行探测。

????????LivenessProbe 存活性探针:用于探测容器是否运行,如果探测失败,kubelet 会根据配置的重启策略,进行相应的处理,若没有配置该探针,默认就是success

????????ReadinessProbe 就绪性探针:一般用于探测容器内的程序是否健康,它的返回值如果为success ,那么就代表这个容器已经完全启动,并且程序已经是可以接受流量的状态

区别:探测方式相同,只是对Pod的处置方式不同

????????readinessProbe:当检测到失败后,将POD的IP:PORT从对应的EndPoint列表中删除

????????LicenessProbe:当检测到失败后,将杀死容器并根据pod的重启策略来决定作出对应的措施

1、Pod 探针的检测方式:?

Exec:在容器内执行一个命令,如果返回值为0,则认为容器健康

TCPSocket:通过容器的IP地址和端口号执行TCP检查,如果是通的就认为容器健康,

HTTPGet:通过应用程序暴露的API地址来检测程序是否是正常的,如果状态码为200-400之间,则认为容器健康

探针检查参数配置:

initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S

timeoutSeconds: 2 #响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启

periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次

successThreshold: 2 # 检查成功2次表示就绪

failureThreshold: 1 # 检查失败1次表示未就绪

探针探测结果有以下值

Success:表示通过检测。

Failure:表示未通过检测。

Unknown:表示检测没有正常进行。

1.2 探针使用用例

(1)通过exec 方式做健康检查

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:                       #创建测试探针探测的文件
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      initialDelaySeconds: 10   #延迟检测时间
      periodSeconds: 5          #检测时间间隔
      exec:                     #使用命令检查
        command:                #指令,类似于运行命令sh
        - cat                   #sh 后的第一个内容,直到需要输入空格,变成下一行
        - /tmp/healthy          #由于不能输入空格,需要另外声明,结果为sh cat"空格"/tmp/healthy

解释:

????????容器在初始化后,执行(/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600")首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令一次(默认successThreshold:1),存活探针就认为探测成功,由于没有配置(failureThreshold、timeoutSeconds),所以执行(cat /tmp/healthy)并只等待1s,如果1s内执行后返回失败,探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。

文章来源:https://blog.csdn.net/weixin_42171272/article/details/135439359
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。