Pod 是 Kubernetes 工作节点中最基本的操作单元,是集群中运行的一个进程,能够实现可管理性,通用和资源共享。
概况
作为 Kubernetes 计算的最小可部署单元,一个 Pod 可能包含一个或多个容器(可以是 docker 容器):
- 运行单一容器(one-container-per-Pod):最常见模型,Kubernetes 通过管理 pod 直接管理容器
- 运行多个容器:将应用程序的不同模块分离并分别部署到单独的容器中,加载时将所有容器视为一个容器加载,一起启动,一起停止;
- 适合资源共享紧密的容器,但因为存在容器(服务)的职责粘连,并不多见(如数据拉取+清理存储+生成报表)
类似于一个 Servlet 容器完成部署 war 包、日志收集等功能。
Pod 有多种模式,包括 Sidebar,Proxy 等。
Pod 的状态(status)有五种:
- Pending:创建 pod 的请求被 Kubernetes 接受,但容器还没启动成功
- 可能正处于写数据到 etcd、调度、pull 镜像、启动容器四个状态中的一个
- 通常伴随这 ADDED, Modified 两个事件
- Running:pod 已经绑定到 node 节点,所有容器已经启动成功 / 至少一个容器在运行或重启
- Succeed:pod 中所有容器已正常自行退出,且 Kubernetes 永远不会重启这些容器,一般会在部署 job 时候出现
- Failed:pod 中所有容器已终止,且至少一个容器以失败告终(非零退出或被系统停止)
- Unknown:某种原因无法获取 pod 状态,通常由于与 pod 的主机通信错误
yaml 格式的 pod 定义文件完整内容:
1 | apiVersion: v1 #必选,版本号,例如 v1 |
在容器编排的时候,可根据 pod 的标签(labels)区分这个 pod 要运行在哪台主机(node)上。
每个 pod 就像一个受 node 管理的机器人一样,接收路由过来的请求,做着自己的事情。
网络通信
每个 Pod 会被分配到属于自己的 IP 地址,该 IP 仅在 cluster 中可见,kube-proxy 将使用该 IP 来路由流量。
每个 pod 启动时,内部会启动一个 infra container(由 Google 的一个镜像:gcr.io/google_containers/pause
启动而来,也叫 pause 容器)。
pause 容器使用默认网络模式;
pod 中的其它容器的网络模式为 container 模式,并会被指定为 pause 容器的 ID:network_mode: "container:{pauseContainerID}"
。
由此,pod 内部所有容器可共享 pause 容器的网络,通过 pause 容器统一识别外部网络空间,跟集群内其它 pod 进行通信。
由此完成了对 pod 中所有内部容器的共享设置:共享资源,共享配置;各个容器之间可通过 localhost
相互访问,对外则总是被同时调度。
生命周期
初始化阶段:在 pod 主容器启动前,可以启动一些 init 容器来完成必要的初始化工作;这些 init 容器串行化执行,执行完后便会退出。
主容器启动后和结束前可分别指定操作 post start 和 pre stop,用来执行一些操作。
主容器启动后,可设置探针(probe)监测 pod 的状态:
- liveness probe:检查 pod 是否为 running 状态
- readness probe:判断容器是否可以接收 service 的请求:容器的 ready 是否为 True
- 每类探针支持三种探测方法:exec, httpGet, tcpSocket
- 探针的返回结果:success, failure, unknown
Namespace
在 Kubernetes 集群内,可将资源对象(controller、pod 等)分配到不同的命名空间 namespace 中,以实现多租户的资源隔离。
集群默认的 namespace 是 default
,kube-*
都是 Kubernetes 系统的命名空间。
在一个 pod 中,所有容器共享的资源包括:
- PID namespace(命名空间):pod 中不同应用程序可看到其他应用程序的进程 ID
- 网络 namespace:pod 中多个容器能访问同一个 IP 和端口范围
- IPC namespace:pod 中多个容器能使用 SystemV IPC 或 POSIX 消息队列进行通信(属于进程间通信)
- UTS namespace:pod 中多个容器共享一个主机名(localhost)
- Volumes:共享存储卷,pod 中各个容器可访问在 pod 级别定义的 Volumes