深入掌握k8s核心概念--Pod(一)

发布于:2024-04-18 ⋅ 阅读:(19) ⋅ 点赞:(0)


激动人心的时刻到了,终于到核心概念这一步了,前面的知识是有点“干燥了”。不急后面会看见代码,可以多像金山打字一样打一打代码,熟悉一下yaml格式

Pod 在 Kubernetes 架构中的位置和实现原理

Pod 在架构中的位置

Pod 位于 Kubernetes 架构的核心中,是构建应用的最小单元。Pod 可以用来运行各种类型的应用,包括 Web 应用程序、数据库、缓存、批处理作业等。
在这里插入图片描述

在这里插入图片描述

Pod 具体实现

  • 容器: Pod 中的容器是 Pod 的基本组成单元,每个容器都是一个独立的运行环境。
  • 共享资源: Pod 中的容器共享网络、IPC 和存储资源,这使得 Pod 内部的容器之间可以进行高效的通信和数据交换。
  • 调度: Kubernetes 会根据 Pod 的调度策略将其调度到合适的节点上运行。
  • 管理: Kubernetes 会对 Pod 进行生命周期管理,包括创建、运行、重启、终止等操作。

Pod 的实现依赖于 Kubernetes 的几个核心组件:

  • API Server: Kubernetes 的 API Server 是一个 RESTful API,用于管理 Kubernetes 集群中的所有资源,包括 Pod。
  • Scheduler: Kubernetes 的 Scheduler 负责将 Pod 调度到合适的节点上运行。
  • Kubelet: Kubelet 是运行在每个节点上的代理,负责在节点上管理 Pod 的生命周期。

Pod 为什么在 Kubernetes 中很重要

Pod 在 Kubernetes 中扮演着重要的角色,主要有以下几个原因:

  • Pod 提供了一种简单易用的方式来部署和管理容器。 Pod 可以将多个容器作为一个单元进行管理,简化了操作和维护。
  • Pod 可以提高资源利用率。 Pod 可以将多个容器调度到同一个节点上运行,从而提高资源利用率。
  • Pod 可以提高应用的可靠性。 Pod 可以通过重启策略来保证应用的可靠性。

Pod 的最佳实践

在使用 Pod 时,尽量遵循以下实践:

  • 每个 Pod 仅包含一个容器。 除非有特殊需求,否则每个 Pod 应仅包含一个容器,以简化管理和维护。
  • 使用合理的资源配置。 为 Pod 分配合理的资源,既要满足应用需求,又要避免资源浪费。
  • 定义端口配置。 为容器定义端口配置,以便其他 Pod 或服务可以访问容器。
  • 使用 Pod 扩缩容。 根据应用需求,使用 Pod 扩缩容策略来动态调整 Pod 数量。

为什么Kubernetes会设计出一个全新的Pod的概念并且Pod有这样特殊的组成结构?

  • 原因之一:在一组容器作为一个单元的情况下,我们难以简单地对“整体”进行判断及有效地行动。

    比如,一个容器死亡了,此时算是整体死亡么?是N/M的死亡率么?引入业务无关并且不易死亡的Pause容器作为Pod的根容器,以它的状态代表整个容器组的状态,就简单、巧妙地解决了这个难题。

  • 原因之二:Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume

    这样既简化了密切关联的业务容器之间的通信问题,也很好地解决了它们之间的文件共享问题。

Pod 概述

Pod 是 Kubernetes 中的核心概念,代表了一组并置的容器。 Pod 中的容器共享网络、IPC 和存储资源,并作为单个单元进行调度和管理。Pod 可以包含一个或多个容器,但通常情况下,每个 Pod 仅包含一个容器。

Pod 类型

类型 描述 典型应用场景 详细说明
普通 Pod 运行应用程序 Web 应用程序、数据库、缓存 适用于任何类型的应用程序,可以根据需要进行定制。
守护进程 Pod 确保 Pod 始终运行 监控代理、日志收集器 即使节点发生故障,也能确保 Pod 始终运行。
无状态 Pod 不保留任何数据 Web 服务器、负载均衡器 Pod 终止后,所有数据都会丢失。
有状态 Pod 保留数据 数据库、缓存、存储 使用持久卷存储数据,即使 Pod 终止后,数据仍然存在。
批处理 Pod 执行一次性任务 数据处理、机器学习、分析 适用于需要并行执行的任务,完成后自动销毁。

Pod 特性

特性 描述 优势 详细说明
可移植性 在不同集群间迁移 提高部署灵活性 可以轻松地在不同的 Kubernetes 集群之间迁移 Pod,无需修改配置。
可扩展性 按需扩缩容 满足流量变化需求 可以根据需要动态扩缩容 Pod,以满足应用流量的变化。
资源隔离 容器间相互隔离 提高资源利用率,确保应用稳定性 每个容器都拥有自己的资源配额,互不影响。
故障恢复 自动重启 提高应用可靠性 Pod 失败后可以自动重启,确保应用始终可用。

Pod 生命周期

阶段 描述 详细说明
Pending 等待调度 Pod 尚未被分配到节点上。
Running 正在运行 Pod 已经运行在节点上。
Succeeded 成功完成 Pod 已经成功完成了任务。
Failed 失败 Pod 运行失败。
Unknown 状态未知 Pod 的状态无法确定。

Pod 重启策略

策略 描述 适用场景 详细说明
Always 始终重启 持续运行应用 Pod 失败后会一直尝试重启,直到成功。
OnFailure 因错误失败时重启 可容忍短暂中断应用 只有当 Pod 因错误而失败时才会重启。
Never 不重启 不需要自动恢复应用 Pod 失败后不会自动重启。

总结

Pod 是 Kubernetes 中的核心概念,理解 Pod 的工作原理和配置方式对于使用 Kubernetes 进行应用部署至关重要。
这里放一张yaml格式的资源定义代码图片

在这里插入图片描述

Pod 常见属性

属性 说明 默认值 可选值
apiVersion 指示 Pod 使用的 Kubernetes API 版本 v1 -
kind 指示资源类型 Pod -
metadata.name Pod 名称 必填 -
metadata.namespace Pod 命名空间 default -
metadata.labels Pod 标签 - -
spec.containers Pod 中的容器列表 必填 -
spec.containers.name 容器名称 必填 -
spec.containers.image 容器镜像 必填 -
spec.containers.command 容器启动命令 - -
spec.containers.args 容器启动参数 - -
spec.containers.resources.limits.cpu 容器 CPU 资源限制 - -
spec.containers.resources.limits.memory 容器内存资源限制 - -
spec.containers.resources.requests.cpu 容器 CPU 资源请求 - -
spec.containers.resources.requests.memory 容器内存资源请求 - -
spec.containers.ports.name 容器端口名称 - -
spec.containers.ports.containerPort 容器端口号 必填 -
spec.containers.ports.protocol 容器端口协议 TCP TCP, UDP
spec.restartPolicy Pod 重启策略 Always Always, Never, OnFailure
spec.schedulerName Pod 调度使用的调度器名称 default -
spec.nodeSelector Pod 调度到节点的选择器 - -
spec.affinity Pod 的亲和性规则 - -
spec.tolerations Pod 的容忍度规则 - -
spec.volumes Pod 使用的卷 - -
spec.volumes.name 卷名称 必填 -
spec.volumes.hostPath.path 主机路径卷挂载路径 - -
spec.volumes.emptyDir.medium 空目录卷存储介质 - Memory, None
status.conditions Pod 的条件列表 - -
status.conditions.type 条件类型 Ready, Running, etc. -
status.conditions.status 条件状态 True, False -
status.conditions.reason 条件原因 - -
status.containerStatuses Pod 中每个容器的运行状态 - -
status.containerStatuses.name 容器名称 - -
status.containerStatuses.image 容器镜像 - -
status.containerStatuses.containerID 容器 ID - -
status.containerStatuses.state.running 容器运行状态 - -
status.containerStatuses.state.terminated.reason 容器终止原因 - -
status.containerStatuses.state.terminated.exitCode 容器退出码 - -
status.hostIP Pod 所在节点的 IP 地址 - -
status.podIP Pod 的 IP 地址 - -
status.startTime Pod 的创建时间 - -