如何在Kubernetes中部署应用程序
Kubernetes是最流行的自动化平台之一,用于在主机或节点群上部署、扩展和操作应用容器。
本文将讨论Kubernetes中的一个核心对象:部署(Deployment)。目标是了解它的行为以及如何创建、更新和删除它。
什么是部署(Deployment)?
部署(Deployment)是用于启动Pod的对象之一。Kubernetes最佳实践鼓励使用部署来管理无状态应用程序。如果没有部署,您将需要手动创建、更新和删除多个Pod,这对于许多Pod来说将是繁琐且不可行的。
部署不仅声明了一个单一对象,该对象不仅创建Pod,还确保它们是最新的并且正在运行。您还可以使用Kubernetes上的部署轻松自动扩展应用程序。因此,部署用于扩展、部署和回滚Pod中应用程序的版本。
部署还告诉Kubernetes我们要运行多少个Pod的副本,Kubernetes会处理剩下的事情。当创建一个部署时,关联的控制器将根据您的配置创建一个副本集。与副本集关联的控制器将根据副本集的配置创建一系列Pod。
使用部署而不是直接创建副本集的优势包括:
- 对象历史记录:对象的每个更改(通过“应用”或“编辑”)都会创建先前版本的备份。
- 部署和回滚管理:可以与前一点连接来回退配置。
创建部署(Deployment)
有两种方法可以使用来创建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:
# Specifies the number of Pod Copies
replicas: 3
# Selects the Pod to be managed by the deployment
selector:
# Matches the defined labels
matchLabels:
deploy: example
template:
metadata:
# Specifies the labels on the Pod.
labels:
deploy: example
spec:
containers:
- name: nginx
image: nginx:1.20.2
在这个YAML文件中,在定义Kubernetes API版本、要创建的对象类型和部署名称之后,是spec部分。在该部分中,首先定义了replicas关键字,它表示部署必须保持活动的Pod实例的数量。
使用选择器标签来标识部署中的Pod。为此,您可以使用deploy标签,它告诉所有匹配这些标签的Pod都被分组在部署中。
之后,您有模板对象,在其中在部署规范中有一个Pod模型。当部署创建Pod时,它使用此模板来创建它们。普通Pod的规范可以在模板键下找到。
使用此部署,Nginx镜像将被部署到Pods中。此外,您还必须对此点格外小心,Pod是Kubernetes中的可伸缩性单元,因此如果将多个容器放在同一个Pod中,您必须考虑要使用的模式。
接下来,应用new_deployment.yaml
Yaml文件,使用以下命令:
kubectl apply -f new_deployment.yaml
几秒钟后,您可以使用以下命令获取部署状态:
kubectl get all
检索和更新部署
请注意,您已经创建了Pods、部署和一个Replicaset。因此,部署始终会创建并管理一个Replicaset。现在,您可以使用以下命令描述部署:
kubectl describe deployment nginx-deployment
现在,您已经完整描述了部署。它突出显示了当更新被定义为RollingUpdate时创建/重建Pod的策略。
RollingUpdate策略允许有序地将应用程序的一个版本迁移到较新版本。这是Kubernetes中使用的默认策略。
除此之外,我们还有以下策略:
- Recreate:终止当前正在运行的Pod实例并以新版本“重新创建”它们;
- Blue/Green:该策略创建了两个独立但完全相同的环境。在蓝色环境中,应用程序按原样运行,而在绿色环境中,应用程序按照将来将要运行的方式运行;
- Canary:一种部署策略,其中一部分用户参与应用程序或服务的渐进式发布。
如果选择“rolling-update”,可以配置其关于所需副本数量的行为。
maxSurge
允许您指示(以百分比或绝对值)它可以在当前配置的副本数量之外创建多少个Pod。maxUnavailable
允许您指示(以百分比或绝对值)在更新期间可以“不可用”的Pod数量,具体取决于配置的副本数量。
根据您的应用程序和自动缩放器,这些配置将允许您确保QoS或加快部署速度。
接下来,您需要将Pod缩放到10个,并将Nginx镜像标签更改为最新版本。
kubectl scale deployment nginx-deployment --replicas=10
请注意,我们正在创建5个容器,而在10个Pod中,我们有5个可用的。
几秒钟后,使用以下命令:
kubectl get all
在这里,您可以看到所有Pod都已创建,容器正在运行。
删除您的部署
要删除Kubernetes部署,可以使用以下命令:
kubectl delete deploy nginx-deployment
kubectl delete deploy new_deployment.yaml
Helm:简化部署
当您想要部署一个使用数十甚至数百个Kubernetes资源的复杂应用程序时,kubectl工具变得不再适用,这就是为什么开发了Helm工具。Helm是Kubernetes的软件包管理器,构建在kubectl上,并简化了应用程序部署。
在Helm词汇表中,一个应用程序称为一个发布。它与一个chart相关联,即一组以YAML格式包含全局变量和描述Kubernetes资源的模板的配置文件。
结论
部署是一个重要的Kubernetes对象。由于伟大的力量意味着伟大的责任,当配置它时,您必须小心,否则可能会出现意外行为。要进一步了解部署配置,请参阅Kubernetes documentation。
您还可以探索一些最好的Kubernetes tutorials,从零开始学习并成为专家。