目录
容器组-Pod
控制器
Deployment
StatefulSet
StatefulSet 使用场景
StatefulSet 的限制
StatefulSet如何为Pod分配DNS name
Kubernetes是一个可以移植、可扩展的开源平台,使用 声明式的配置 并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。
容器组-Pod
Pod(容器组)是 Kubernetes 中最小的可部署单元。一个 Pod(容器组)包含了一个应用程序容器(某些情况下是多个容器)、存储资源、一个唯一的网络 IP 地址、以及一些确定容器该如何运行的选项。Pod 容器组代表了 Kubernetes 中一个独立的应用程序运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。其中,一个 Pod 中只运行一个容器,即"one-container-per-pod" 是 Kubernetes 中最常见的使用方式。此时,可以认为 Pod 容器组是该容器的 wrapper,Kubernetes 通过 Pod 管理容器,而不是直接管理容器。
控制器
K8s通过引入 Controller(控制器)的概念来管理 Pod 实例。在 Kubernetes 中,用户应该始终使用控制器来创建 Pod,而不是直接创建 Pod。在 Kubernetes 支持的控制器有ReplicaSet,Deployment,StatefulSet,DaemonSet,CronJob,Jobs - Run to Completion 等。Kubernetes 官方推荐使用 Deployment 替代 ReplicaSet
Deployment
Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。
StatefulSet
StatefulSet与 Deployment 最大的不同在于 StatefulSet 始终将一系列不变的名字分配给其 Pod,简单理解就是StatefulSet用于管理 Stateful(有状态)的应用程序。这些 Pod 从同一个模板创建,但是并不能相互替换:每个 Pod 都对应一个特有的持久化存储标识。
StatefulSet 使用场景
如果一个应用程序需要稳定的网络标识(例如注册中心中间件),或者需要按顺序部署、删除、增加副本,就适合使用StatefulSet 控制器。相反的,应该考虑使用 Deployment 这类无状态的控制器。
StatefulSet 的限制
删除或 scale down 一个 StatefulSet 将不会删除其对应的数据卷。这样做的考虑是数据安全
删除 StatefulSet 时,将无法保证 Pod 的终止是正常的。如果要按顺序 gracefully 终止 StatefulSet 中的 Pod,可以在删除 StatefulSet 前将其 scale down 到 0
StatefulSet如何为Pod分配DNS name
StatefulSet 中的 Pod 具备一个唯一标识,该标识由以下几部分组成
- 序号
假设一个 StatefulSet 的副本数为 N,其中的每一个 Pod 都会被分配一个序号,序号的取值范围从 0 到 N - 1,并且该序号在 StatefulSet 内部是唯一的。
- 稳定的网络标识
StatefulSet 中 Pod 的 hostname 格式为 $(StatefulSet name)-$(Pod 序号)。上面的例子将要创建三个 Pod,其名称分别为: web-0,web-1,web-2。StatefulSet 中每一个 Pod 将被分配一个 dnsName,格式为: $(podName).$(所在域名)
- 稳定的存储
Kubernetes 为每一个 VolumeClaimTemplate 创建一份 PersistentVolume(存储卷),当 Pod 被调度(或重新调度)到一个节点上,其挂载点将挂载该存储卷声明(关联到该 PersistentVolume)