K8S之Pod基础

Pod的易错点

  • Pod 是在 Kubernetes 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。 Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod 对多容器的支持是 K8 最基础的设计理念。
  • Pod 不是进程,而是容器运行的环境。 Pod 天生地为其成员容器提供了两种共享资源:网络 和 存储。在被删除之前,Pod 会一直存在。
  • Pod中可以有多个容器,在主容器启动前,可以使用init容器进行初始化工作。
  • Pod 在其生命周期中只会被调度一次。 将 Pod 分配到特定节点的过程称为绑定,而选择使用哪个节点的过程称为调度。 一旦 Pod 被调度并绑定到某个节点,Kubernetes 会尝试在该节点上运行 Pod。 Pod 会在该节点上运行,直到 Pod 停止或者被终止;
  • 可以使用Pod 调度就绪态来延迟 Pod 的调度,直到所有的调度门控都被移除。 例如,你可能想要定义一组 Pod,但只有在所有 Pod 都被创建完成后才会触发调度。

Pod的状态

项目Value
Pod的状态
PendingPod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
RunningPod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。

Pod生命周期

在这里插入图片描述

  • 主容器就是我们的镜像构建的容器。
  • 初始化容器阶段初始化pod中每一个init容器,他们是串行执行的,执行完成后就退出了。
  • 三种探针
    • liveness probe(存活探测)
    • readiness probe(就绪探测)
    • startup probe(启动探测)
  • hook钩子函数
    • post start:容器创建之后立即执行,如果失败了就会按照重启策略重启容器
    • pre stop:容器终止前立即执行,执行完成之后容器将成功终止
kubectl explain pod.spec.containers.lifecycle.preStop
kubectl explain pod.spec.containers.lifecycle.postStart

Pod创建过程(重点)

在这里插入图片描述

开机默认所有节点的 kubelet 、master 节点的scheduler(调度器)、controller-manager(控制管理器)一直监听 master 的 api-server 发来的事件变化。

  • 1 :程序员使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告诉 master 让集群使用 tomcat8 镜像,部署一个 tomcat 应用)。
  • 2 :kubectl 命令行内容发给 api-server,api-server 保存此次创建信息到 etcd 。
  • 3 :etcd 给 api-server 上报事件,说刚才有人给我里面保存一个信息。(部署Tomcat[deploy])
  • 4:controller-manager 监听到 api-server 的事件,是 (部署Tomcat[deploy])。
  • 5:controller-manager 处理这个 (部署Tomcat[deploy])的事件。controller-manager 会生成 Pod 的部署信息【pod信息】。
  • 6:controller-manager 把 Pod 的信息交给 api-server ,再保存到 etcd 。
  • 7:etcd 上报事件【pod信息】给 api-server 。
  • 8:scheduler 专门监听 【pod信息】 ,拿到 【pod信息】的内容,计算,看哪个节点合适部署这个 Pod【pod 调度过后的信息(node: node-02)】。
  • 9:scheduler 把 【pod 调度过后的信息(node: node-02)】交给 api-server 保存给 etcd 。
  • 10:etcd 上报事件【pod调度过后的信息(node: node-02)】,给 api-server 。
  • 11:其他节点的 kubelet 专门监听 【pod 调度过后的信息(node: node-02)】 事件,集群所有节点 kubelet 从 api-server 就拿到了 【pod调度过后的信息(node: node-02)】 事件。
  • 12:每个节点的 kubelet 判断是否属于自己的事情;node-02 的 kubelet 发现是他的事情。
  • 13:node-02 的 kubelet 启动这个 pod。汇报给 master 当前启动好的所有信息。

我们可以总结以下几点:

  • kubelet、scheduler、controller都是采取watch机制的。
  • 做一个动作都会经过类似的几步:
    • api-server收到命令(无论是用户的还是组件的)
    • 与底层的etcd交互,存信息
    • etcd处理完后上报api-serever
    • 上层的组件(包括用户)watch,了解变化后做出相应的动作再反馈给api-server

Pod的终止

  • 当你请求删除某个 Pod 时,集群会记录并跟踪 Pod 的体面终止周期, 而不是直接强制地杀死 Pod。在存在强制关闭设施的前提下,kubelet会尝试体面地终止 Pod。
  • kubelet 先发送一个带有体面超时限期的 TERM(又名 SIGTERM) 信号到每个容器中的主进程,将请求发送到容器运行时来尝试停止 Pod 中的容器。 停止容器的这些请求由容器运行时以异步方式处理。 这些请求的处理顺序无法被保证。许多容器运行时遵循容器镜像内定义的STOPSIGNAL值, 如果不同,则发送容器镜像中配置的 STOPSIGNAL,而不是 TERM 信号。
  • 一旦超出了体面终止限期,容器运行时会向所有剩余进程发送 KILL 信号,之后 Pod 就会被从API服务器上移除。 如果kubelet或者容器运行时的管理服务在等待进程终止期间被重启, 集群会从头开始重试,赋予 Pod 完整的体面终止限期。

参考文档

https://xwl.io/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值