Kubernetes 是现代容器编排系统的代表,由于其灵活且高度自动化的特性,越来越多的应用场景选择使用 Kubernetes 进行部署和管理。本文将深入探讨 Kubernetes 中两个主要的集合应用:Deployment 和 StatefulSet,探究它们的区别、使用场景以及部署实践。
Deployment
Deployment 提供了容器副本集的声明式更新,利用它您可以轻松地创建和更新副本集,并确保高可用性的容器组。Deployment 的控制器监视目标 Pod 变化,根据用户定义的副本数进行平滑地扩缩容或滚动升级,保证服务可靠性和连续性。
Deployment 的定义
下面是一个简单的 Deployment 模板:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- ---------------- ----- --------- - --------- ------------ ---- ----- --------- --------- ------- ---- ----- ----- ----------- - ----- --------------- ------ ------------ ------ - -------------- --
解释一下每个字段:
- apiVersion
- api 版本号,apps/v1 代表这个资源类型的 API 版本,Deployment 是 apps/v1 中的一种资源类型;
- kind
- 资源类型,本例中为 Deployment;
- metadata
- 元数据,包括资源名称;
- spec
- 控制器的规格,定义了副本数量、选择器以及如何运行 Pod;
- replicas
- 副本数量,即希望 Kubernetes 运行多少个相同的 Pod 副本;
- selector
- 选择器,是一个包含标签的映射,用于指定那些 Pod 属于这个 Deployment 控制器的管理范围;
- template
- Pod 模板,是 Kubernetes 管理的所有 Pod 的模板,在该模板中声明容器应该如何运行;
- labels
- 标签,是将该模板与控制器关联的标识符;
- containers
- 容器数组,描述 Pod 中要运行的容器。
Deployment 的使用场景
如果你想部署多个相同的 Pod 副本且需要在更新时保持高可用性的话,那么 Deployment 是最好的选择。Deployment 的控制器将在您更新版本时一步步按照新的 Pod 模板进行操作,而旧版的 Pod 模板会逐渐被更新的版本所取代。同时,Deployment 控制器会确保每个具体更新版本在任何时候都有恰好 $N$ 个副本,不多不少。
Deployment 的操作实践
使用 kubectl 命令创建 Deployment:
$ kubectl create -f deployment.yaml
通过 kubectl 命令获取 Deployment 状态:
$ kubectl get deployment
通过 kubectl 命令升级 Deployment:
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
通过 kubectl 命令回滚 Deployment:
$ kubectl rollout undo deployment/nginx-deployment
StatefulSet
StatefulSet 是 Kubernetes 中一种用于管理有状态应用的控制器。对于有状态应用(Stateful Application)而言,它需要满足以下几个要求:
- 稳定的持久化存储;
- 稳定的网络标识(如 DNS);
- 稳定的 Pod 稳定性。
在 Kubernetes 环境中,这些要求可以通过使用 StatefulSet 来保证有状态应用进行管理。
StatefulSet 的定义
下面是一个简单的 StatefulSet 模板:
-- -------------------- ---- ------- ----------- ------- ----- ----------- --------- ----- --------- ----- --------- - ------------ --------- --------- ------------ ---- ----- --------- --------- ------- ---- ----- ----- ----------- - ----- --------------- ------ ------------ ------------- - ----- ---------- ---------- ----------------- --------------------- - --------- ----- ---------- ----- ------------ ----------------- ---------- --------- -------- ----
解释一下每个字段:
- apiVersion
- api 版本号,apps/v1 代表这个资源类型的 API 版本,StatefulSet 是 apps/v1 中的一种资源类型;
- kind
- 资源类型,本例中为 StatefulSet;
- metadata
- 元数据,包括资源名称;
- spec
- 控制器的规格,定义了副本数量、服务名称、选择器以及如何运行 Pod;
- replicas
- 副本数量,即希望 Kubernetes 运行多少个相同的 Pod 副本;
- serviceName
- 服务名称,这里与 Service 设置的名称相同,保证了容器名字解析的一致性;
- selector
- 选择器,是一个包含标签的映射,用于指定那些 Pod 属于这个 StatefulSet 控制器的管理范围;
- template
- Pod 模板,是 Kubernetes 管理的所有 Pod 的模板,在该模板中声明容器应该如何运行;
- labels
- 标签,是将该模板与控制器关联的标识符;
- containers
- 容器数组,描述 Pod 中要运行的容器;
- volumeMounts
- 定义了挂载的配置;
- volumeClaimTemplates
- 定义了 StatefulSet 所管控的 PV/PVC 模板。
StatefulSet 的使用场景
如果你需要管理具有识别性的有状态应用,例如数据库 Pod、消息队列 Pod 等,那么 StatefulSet 是最好的选择。StatefulSet 在执行升级操作时,会遵循部分有状态应用的特殊要求,如确定副本在升级期间的标识符,并将其应用于新 Pod。并且,StatefulSet 能够使用有状态服务(Stateful Service)来管理服务资源,这使得您更轻松地维护稳定的 DNS 名称和 IP 地址。
StatefulSet 的操作实践
使用 kubectl 命令创建 StatefulSet:
$ kubectl create -f statefulset.yaml
通过 kubectl 命令获取 StatefulSet 状态:
$ kubectl get statefulset
通过 kubectl 命令升级 StatefulSet:
$ kubectl set image statefulset/nginx-sts nginx=nginx:1.16.1
通过 kubectl 命令回滚 StatefulSet:
$ kubectl rollout undo statefulset/nginx-sts
总结
Deployment 和 StatefulSet 是 Kubernetes 集合中的两种基本应用,Deployments 是通用的集合工具,主要用于无状态应用,而 StatefulSet 则用于有状态应用。Deployments 和 StatefulSet 都提供了控制器和模板能力,允许您轻松地管理一组相同的 Pod 副本, 满足您在Kubernetes环境下的服务高可用和稳定性的需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fee6d195b1f8cacdd93616