Kubernetes 是一个非常流行的自动化平台,它被用来在主机或节点集群上部署、扩展和管理应用程序容器。
本文将深入探讨 Kubernetes 中一个关键的对象:部署(Deployment)。目标是理解部署的工作原理,以及如何创建、更新和删除它。
什么是部署?
部署是 Kubernetes 中用于启动 Pod 的核心对象之一。Kubernetes 的最佳实践建议,对于无状态应用程序应优先使用部署。如果没有部署,就需要手动创建、更新和删除多个 Pod,这对于大量 Pod 来说是繁琐且不切实际的。
部署在 YAML 文件中声明一个对象,这个对象不仅负责创建 Pod,还负责确保 Pod 始终处于最新状态并正常运行。您还可以利用 Kubernetes 上的部署,轻松实现应用程序的自动扩展。因此,部署的主要用途是在 Pod 中扩展、部署和回滚应用程序的不同版本。
部署还负责告知 Kubernetes 需要运行多少个 Pod 副本,剩余的工作则由 Kubernetes 处理。当创建一个部署时,相关的控制器会根据您的配置创建一个 ReplicaSet。而与 ReplicaSet 关联的控制器,则会根据 ReplicaSet 的配置创建一系列 Pod。
使用部署而不是直接创建 ReplicaSet 的优势在于:
- 对象历史记录:每次对对象进行修改(通过“应用”或“编辑”)都会创建一个先前版本的备份。
- 发布和回滚管理:您可以轻松地回滚到之前的配置。
创建部署
创建 Kubernetes 部署通常有两种方法:
命令式方法
Kubernetes API 提供了一种更直接和命令式的方法,无需使用配置文件或 YAML 格式的清单。这种方法下,您只需声明您想做什么,而 Kubernetes 会负责定义为达到预期结果所必须执行的操作。
使用命令式方法,您可以使用以下命令:
kubectl create deployment nginx-deployment --image nginx --port=80
声明式方法
在这种方法中,您需要声明所有内容。当您执行代码时,Kubernetes 只会读取您的定义,并完全按照您的声明来创建资源。
要使用声明式部署,您必须创建一个 YAML 文件。
一个名为 new_deployment.yaml 的部署 YAML 文件示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: # 指定 Pod 副本的数量 replicas: 3 # 选择由部署管理的 Pod selector: # 匹配定义的标签 matchLabels: deploy: example template: metadata: # 指定 Pod 上的标签 labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
在这个 YAML 文件中,在定义了 Kubernetes API 版本、要创建的对象类型和部署的名称后,是 spec 部分。在这个部分,首先定义了 `replicas` 键,它指示部署必须保持活动状态的 Pod 实例数量。
使用选择器标签来识别部署中的 Pod。可以使用 `deploy` 标签,它告知所有匹配此标签的 Pod 都被分组在这个部署中。
接下来是 `template` 对象,它在部署规范中定义了一个 Pod 的模型。当部署创建 Pod 时,它会使用此模板进行创建。常规 Pod 的规范可以在 `template` 键下找到。
通过此部署,带有指定标签的 Nginx 镜像将被部署到 Pod 中。此外,需要注意的是,Pod 是 Kubernetes 中可扩展的单元,如果将多个容器放在同一个 Pod 中,必须考虑使用的模式。
接下来,应用 new_deployment.yaml YAML 文件,使用以下命令:
kubectl apply -f new_deployment.yaml
几秒钟后,您可以使用以下命令来获取部署状态:
kubectl get all
检索和更新部署
请注意,您已经创建了 Pod、部署以及 ReplicaSet。 部署始终负责创建和管理 ReplicaSet。现在可以使用以下命令来描述部署:
kubectl describe deployment nginx-deployment
现在您已经获得了关于部署的完整描述。其中,当更新定义为 `RollingUpdate` 时,会特别突出显示用于创建/重建 Pod 的策略。
`RollingUpdate` 策略允许有序地将应用程序的一个版本迁移到新版本。 这是 Kubernetes 中使用的默认策略。
除此之外,还有以下策略:
- `Recreate`:终止当前正在运行的 Pod 实例,并使用新版本“重新创建”它们。
- `Blue/Green`:此策略会创建两个独立但相同的环境。在蓝色环境中,应用程序按原样运行,而在绿色环境中,应用程序按将来的方式运行。
- `Canary`:一种部署策略,其中一部分用户参与应用程序或服务的逐步发布。
如果您选择“滚动更新”,您可以配置其关于所需副本数量的行为。
- `maxSurge` 允许您指示(以百分比或绝对值表示)除了当前配置的副本数量之外,还可以创建多少个额外的 Pod。
- `maxUnavailable` 允许您指示(以百分比或绝对值表示)在更新期间,允许有多少 Pod 处于“不可用”状态,具体取决于配置的副本数。
根据您的应用程序和自动缩放器的设置,这些配置将允许您确保服务质量(QoS)或加快部署速度。
接下来,您可以将 Pod 缩放至 10 个,并将 Nginx 镜像标签更改为 `latest`:
kubectl scale deployment nginx-deployment --replicas=10
请注意,我们创建了 5 个容器,在 10 个 Pod 中,有 5 个可用。
几秒钟后,使用以下命令:
kubectl get all
在这里,您可以看到所有的 Pod 都已创建,并且容器正在运行。
删除您的部署
要删除 Kubernetes 部署,您可以使用以下命令:
kubectl delete deploy nginx-deployment kubectl delete -f new_deployment.yaml
Helm:简化部署
当您要部署一个使用数十甚至数百个 Kubernetes 资源的复杂应用程序时,`kubectl` 工具可能会显得力不从心。这就是开发 Helm 工具的原因。Helm 是 Kubernetes 的包管理器,它构建在 `kubectl` 之上,旨在简化应用程序部署过程。
在 Helm 的术语中,应用程序被称为“发布(Release)”。 它与一个“图表(Chart)”相关联,图表是一组 YAML 格式的配置文件,其中包含描述 Kubernetes 资源的全局变量和模板。
结论
部署是 Kubernetes 中至关重要的对象。 强大的功能意味着重大的责任,因此在配置部署时必须小心,否则可能会出现意外的行为。 要进一步了解部署配置,您可以参考 Kubernetes 官方文档。
您还可以探索一些优秀的 Kubernetes 教程,从头开始学习,并逐步成为专家。