POD创建与删除简单描述

90 篇文章 6 订阅

创建一个 Pod 的过程可以分为以下几个步骤:

  • 用户使用 kubectl create 命令或 YAML 文件向 API 服务器发送创建 Pod 的请求。
  • API 服务器将请求转换为 Kubernetes 的内部对象,并将 Pod 的状态设置为 Pending。
  • 调度器根据 Pod 的资源需求和节点的资源情况,将 Pod 调度到合适的节点上。
  • 节点上的 kubelet 接收调度器调度过来的 Pod,并将其状态设置为 Running。
  • kubelet 为 Pod 创建容器,并为容器分配资源。
    容器启动,并开始运行。
白话解释:
用户向 API 服务器说:“我要创建一个 Pod。”
API 服务器把用户的话转换成 Kubernetes 内部的语言,然后告诉调度器:“这个 Pod 要创建了。”
调度器把这件事告诉 kubelet,kubelet 就开始准备创建 Pod。
kubelet 为 Pod 创建容器,并为容器分配资源。
容器启动,并开始运行。

用户->>API 服务器: 提交 Pod 创建请求
  API 服务器->>调度器: 转换 Pod 创建请求
  调度器->>节点: 调度 Pod
  节点->>kubelet: 接收 Pod
  kubelet->>容器: 创建容器
  容器->>: 启动
删除一个 Pod 时,Kubernetes 会执行以下步骤:
    1. 用户使用 kubectl delete 命令或 YAML 文件向 API 服务器发送删除 Pod 的请求。
    1. API 服务器将请求转换为 Kubernetes 的内部对象,并将 Pod 的状态设置为 Terminating
    1. 调度器将 Pod 的状态设置为 Terminating
    1. kubelet 将 Pod 的状态设置为 Terminating,并向 Pod 中的每个容器发送 SIGTERM 信号,通知容器准备退出。
    1. 容器在指定的超时时间内退出。如果容器在超时时间内未退出,则 kubelet 会向容器发送 SIGKILL 信号,强制容器退出。
    1. kubelet 删除 Pod 的相关资源,包括 Pod 的定义、容器的镜像、容器的日志等。
  • etcd 是 Kubernetes 集群的核心组件,负责存储 Kubernetes 的所有数据。在删除 Pod 时,etcd 需要执行以下操作:
    1. 删除 Pod 的定义。
    1. 删除 Pod 的相关资源,包括容器的镜像和容器的日志等。

白话解释

* 用户向 API 服务器说:“我要删除一个 Pod。”
* API 服务器把用户的话转换成 Kubernetes 内部的语言,然后告诉调度器:“这个 Pod 要删除了。”
* 调度器把这件事告诉 kubelet,kubelet 把这件事告诉 Pod 中的容器:“你们要被删除了。”
* 容器听到 kubelet 的话,就开始准备退出。如果容器在规定的时间内没有退出,kubelet 就会强行让它退出。
* 容器退出后,kubelet 会把 Pod 的相关资源都删除掉。

etcd 是 Kubernetes 的记事本,负责记住 Kubernetes 的所有信息。在删除 Pod 时,etcd 要把 Pod 的相关信息都删除掉。

  • Kubernetes 中的 Pod 遵循一个预定义的生命周期,该生命周期由以下几个阶段组成:

  • Pending:Pod 尚未被调度到任何节点。
  • Running:Pod 已被调度到一个节点,并且所有容器都已启动并正在运行。
  • Succeeded:Pod 中的所有容器都已成功终止。
  • Failed:Pod 中的至少一个容器已失败。
  • Unknown:Pod 的状态无法确定。

Pending 阶段

在 Pending 阶段,Pod 尚未被调度到任何节点。Pod 处于此阶段的原因可能有以下几种:

  • Pod 尚未被用户创建。
  • Pod 已被创建,但调度器尚未将其调度到任何节点。
  • Pod 已被调度到一个节点,但该节点尚未准备好运行 Pod。

Running 阶段

在 Running 阶段,Pod 已被调度到一个节点,并且所有容器都已启动并正在运行。Pod 处于此阶段的时间可能会持续很长,直到 Pod 被终止。

Succeeded 阶段

在 Succeeded 阶段,Pod 中的所有容器都已成功终止。Pod 处于此阶段的原因可能是以下几种:

  • Pod 的定义中包含了 terminationGracePeriodSeconds 字段,并且该字段指定的超时时间已过。
  • Pod 的定义中包含了 restartPolicy 字段,并且该字段指定的策略为 Never

Failed 阶段

在 Failed 阶段,Pod 中的至少一个容器已失败。Pod 处于此阶段的原因可能是以下几种:

  • Pod 的定义中包含了 restartPolicy 字段,并且该字段指定的策略为 AlwaysOnFailure
  • Pod 的定义中包含了 terminationGracePeriodSeconds 字段,并且该字段指定的超时时间已过,但 Pod 中的容器仍未成功终止。

Unknown 阶段

在 Unknown 阶段,Pod 的状态无法确定。Pod 处于此阶段的原因可能是以下几种:

  • Pod 的定义中包含了 restartPolicy 字段,并且该字段指定的策略为 Never
  • Pod 的定义中包含了 terminationGracePeriodSeconds 字段,并且该字段指定的超时时间已过,但 Pod 仍未被调度到任何节点。

Pod 的状态转换

Pod 的状态可能会从一个阶段转换到另一个阶段。以下是 Pod 状态转换的可能情况:

  • Pending -> Running:Pod 已被调度到一个节点,并且所有容器都已启动。
  • Running -> Succeeded:Pod 中的所有容器都已成功终止。
  • Running -> Failed:Pod 中的至少一个容器已失败。
  • Pending -> Unknown:Pod 的定义中包含了 restartPolicy 字段,并且该字段指定的策略为 Never
  • Running -> Unknown:Pod 的定义中包含了 terminationGracePeriodSeconds 字段,并且该字段指定的超时时间已过,但 Pod 仍未被调度到任何节点。

控制 Pod 的状态

可以使用 Kubernetes 的 API 或命令行工具来控制 Pod 的状态。使用 kubectl delete 命令来终止 Pod。

还可以使用 Pod 的 restartPolicy 字段来控制 Pod 在失败时是否重启。如果您将 restartPolicy 字段设置为 Never,则 Pod 将不会在失败时重启。


Deployment 和 ReplicaSet 都是 Kubernetes 中用于管理 Pod 副本的对象。它们的主要区别在于:
  • **Deployment 是一个更高级的抽象。**它提供了一些 ReplicaSet 没有的功能,例如:
    • 滚动更新:Deployment 可以自动滚动更新 Pod 副本,而不会影响应用程序的可用性。
    • 回滚:Deployment 可以自动回滚到以前的版本。
    • 伸缩:Deployment 可以自动伸缩 Pod 副本的数量。
  • **ReplicaSet 是一个更简单的对象。**它只负责管理 Pod 副本的数量。

1.28.x 版本的 Kubernetes 仍然支持 ReplicaSet。但是,新版本的 Kubernetes 建议使用 Deployment 来管理 Pod 副本。Deployment 提供了 ReplicaSet 没有的功能,可以简化应用程序的部署和管理。

以下是 Deployment 和 ReplicaSet 的具体用途:

  • **Deployment 适合需要进行滚动更新、回滚和伸缩的应用程序。**例如,Web 应用程序、微服务等。
  • **ReplicaSet 适合不需要进行滚动更新、回滚和伸缩的应用程序。**例如,批处理应用程序、数据库等。

具体选择哪种对象,需要根据应用程序的实际需求来决定。

StatefulSet 更新 Pods 很慢的原因主要有以下几个:

  • **StatefulSet 的更新策略是滚动更新。**在滚动更新过程中,StatefulSet 会逐个更新 Pod,并将旧 Pod 从集群中删除。这会导致应用程序的不可用时间。
  • **StatefulSet 的存储卷是持久化的。**在更新 Pod 时,StatefulSet 需要将旧 Pod 的存储卷数据复制到新 Pod。这会导致更新过程变慢。

如果没有存储的情况下,StatefulSet 更新 Pods 仍然很慢的原因是,StatefulSet 仍然需要将旧 Pod 从集群中删除。这会导致应用程序的不可用时间。

以下是一些可以提高 StatefulSet 更新速度的建议:

  • **使用自定义的更新策略。可以使用“暂停更新”策略,在更新所有 Pod 之前暂停应用程序。
  • **使用快照存储。**快照存储可以加快存储卷数据的复制速度。
  • **使用复制 Pod。**复制 Pod 可以提高应用程序的可用性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 中的 Pod 是最小的可部署单元,它由一个或多个容器组成。下面是 Kubernetes Pod创建过程: 1. **创建 Pod 定义文件**:使用 YAML 或 JSON 格式创建一个 Pod 定义文件,其中包含了 Pod 的规格、容器镜像、端口映射等配置信息。 2. **提交 Pod 定义文件**:使用 `kubectl apply -f <pod-definition-file>` 命令提交 Pod 定义文件给 Kubernetes 集群。这会将 Pod 定义文件传递给 Kubernetes 控制平面。 3. **kube-apiserver 处理请求**:kube-apiserver 是 Kubernetes API 的主要入口,它接收到提交的 Pod 定义文件,并进行处理。它验证并将 Pod描述存储到 etcd 中,这是 Kubernetes 集群的分布式键值存储。 4. **kube-scheduler 分配节点**:kube-scheduler 是 Kubernetes 的调度器组件,它根据调度算法选择一个合适的节点来运行 Pod。调度决策通常基于节点的资源可用性、Pod 的资源需求、亲和性和反亲和性等因素。 5. **kubelet 创建容器**:kubelet 是在每个节点上运行的代理程序,它负责管理容器的生命周期。一旦 kubelet 接收到分配给该节点的 Pod,它会与容器运行时(如 Docker)交互来创建和管理容器实例。 6. **容器状态报告**:kubelet 定期向 kube-apiserver 报告容器的状态。这包括容器的运行状态、健康状况和事件等信息。 7. **控制器监控和调节**:kube-controller-manager 中的控制器会监控 Pod 的状态,并根据需要进行调节。例如,如果 Pod 失败或被删除,控制器将负责重新创建或部署 Pod,以确保应用程序的高可用性。 以上是 Pod 的一般创建过程。整个过程中,Kubernetes 的各个组件协同工作,确保 Pod 能够在适当的节点上正确运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值