Happy Coding, Happy Life

K8s之Pod

| Comments

Pod是kubernetes中你可以创建和部署的最小也是最简的单位。Pod代表着集群中运行的进程。Pod中封装着应用的容器(1或多个容器)、存储、独立的网络IP,并管理着容器运行的策略选项。

Pod概览

Pod是一个服务的多个进程的聚合单位,pod通过提供一个更高级别的抽象的方式,极大简化了应用部署管理。 Pod作为一个独立的部署单位,支持横向扩展和复制、协同调度、命运共同体(例如被同时终结),协同复制,资源共享,依赖管理等,Pod会自动的为容器处理这些问题。

什么是Pod

Pod是kubernetes中你可以创建和部署的最小也是最简的单位。Pod代表着集群中运行的进程。

Pod中封装着应用的容器(1或多个容器)、存储、独立的网络IP,并管理着容器运行的策略选项。

在Kubrenetes集群中Pod有如下两种使用方式:

  • 一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单容器的封装,kuberentes管理的是Pod而不是容器。

  • 在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个紧密耦合、互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器互相协作,成为一个service单位——如一个容器共享文件,另一个容器更新文件。Pod将这些容器的存储资源作为一个实体来管理。

Pod的生命周期

Pod 的 status 字段是一个 PodStatus 对象,PodStatus中有一个 phase 字段。

下面是 phase 可能的值:

  • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

下图是Pod的生命周期示意图,从图中可以看到Pod状态的变化。

Pod如何管理多个容器

Pod中可以同时运行多个容器(独立进程运行)并协同工作。同一个Pod中的容器会自动的分配到同一个node 上运行,同时,同一个Pod中的容器共享存储、网络和依赖,它们总是被同时调度。

  • 网络

    每个Pod都会被分配唯一的一个IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。

  • 存储

    可以为一个Pod指定多个共享的Volume。Pod中的所有容器都可以访问共享的volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。

Pod的管理

Pod间发现

Pod中应用容器共享网络空间(IP地址和端口),因此可以通过localhost互相发现。 Pod中应用容器的hostname被设置成Pod的名字。 Pod中应用容器可以共享volume。volume能够保证pod重启时使用的数据不丢失。

Pod的使用

Pod也可以用于垂直应用(例如LAMP),这样使用的动机是为了支持共同调度和协调应用程序,例如: * 内容管理系统、文件和数据加载器、本地换群管理器等。 * 日志和检查点备份、压缩、旋转、快照等。 * 数据变更观察者、日志和监控适配器、活动发布者等。 * 代理、桥接和适配器等。 * 控制器、管理器、配置器、更新器等。

Pod的持久性

Pod不是作为持久化设计的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会失败。

通常,用户不需要手动直接创建Pod,而是应该使用controller(例如Deployments),即使是在创建单个Pod的情况下。Controller可以提供集群级别的自愈功能、复制和升级管理。

Pod高级特性

Pod Preset

Kubernetes提供了一个准入控制器(PodPreset),当其启用时,Pod Preset 会将应用创建请求传入到该控制器上。因此,Pod Preset是用来在 Pod 被创建的时候向其中注入额外的运行时需求的 API 资源。

您可以使用label selector 来指定为哪些 Pod 应用 Pod Preset。

Pod和Controller

Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

包含一个或者多个Pod的Controller示例:

  • Deployment
  • StatefulSet
  • DaemonSet

通常,Controller会用你提供的Pod Template来创建相应的Pod。

Init容器

Init是一种专用的容器,在应用程序容器启动之前运行,包含应用镜像中工具或环境的安装脚本。

Pod 能够有一个或多个先于应用容器启动的 Init 容器。

Init 容器与普通的容器非常像,除了如下两点: * Init 容器总是运行到成功完成为止。 * 每个 Init 容器都必须在下一个 Init 容器启动之前成功完成。

如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init容器成功为止。然而,如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。

因为 Init 容器具有与应用程序容器分离的单独镜像,所以它们的启动相关代码具有如下优势:

  • 它们可以包含并运行实用工具,它们可以包含使用工具和定制化代码来安装。例如,创建镜像没必要FROM 另一个镜像,只需要在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具。

  • 应用程序镜像可以分离出创建和部署的角色,而没有必要联合它们构建一个单独的镜像。

  • Init 容器使用 Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问 Secret 的权限,而应用程序容器则不能。

  • 它们必须在应用程序容器启动之前运行完成,所以 Init 容器能够提供一种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。

Pod 安全策略

Pod 安全策略 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么资源的能力。

Comments