Deployment 是 k8s 中管理发布的控制器,k8s 从v1.2开始就引入了 Deployment 控制器,Deployment 控制器并不直接管理 pod,而是通过管理 ReplicaSet 来间接管理 pod,即:Deployment 管理 ReplicaSet, ReplicaSet 管理 pod。所以 Deployment 比 ReplicaSet 的功能更加强大。
使用 yaml 文件创建 k8s Deployment 资源的流程:
pod对象命名方式为:子对象的名字=父对象名字-随机字符串(包含数字和字母)
Deployment 的主要功能有:
Deployment 资源清单文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
对yaml文件的说明:
.metadata.name
字段标明)的 Deployment。该名称将成为后续创建 ReplicaSet 和 Pod 的命名基础;.spec.replicas
指定);.spec.selector
字段定义所创建的 ReplicaSet 标签,定义如何查找要管理的 Pod。可通过 kubectl 命令行方式获取更加详细的 deployment 模板信息,通过以下帮助信息,可以看到yaml文件下对应节点都有哪些可选字段及其使用方法。
kubectl explain deploy
kubectl explain deploy.spec
kubectl explain deploy.spec.template.spec
使用上边的yaml内容,创建一个名为 nginx-deployment.yaml 的文件。
生效配置文件
kubectl apply -f nginx-deployment.yaml
kubectl get deploy -o wide
kubectl get rs
kubectl get pods
通过名称,可以看出,pod名称是由 ReplicaSet 名称加上随机字符串拼接而成。
ReplicaSet 名称是由 Deployment 名称加上随机字符串拼接而成。
当应用程序部署到k8s集群后,随着版本迭代,比如修改BUG或者功能优化,需要对已经部署的应用进行升级。
在 Deployment 的定义中,可以通过spec.strategy
指定Pod更新的策略,目前支持两种策略:
Recreate
重建,表示Deployment在更新Pod时,会先杀掉正在运行的Pod,然后创建新的Pod,服务更新期间不可用,目前使用较多;RollingUpdate
滚动更新,默认策略。表示Deployment会以滚动更新的方式来逐个更新Pod,服务更新期间持续可用,如下图所示。spce:
strategy:
type: Recreate/RollingUpdate
修改镜像版本,将原来的 nginx-1.14.2 升级为 nginx-1.19.7
直接在 master 节点的命令里,执行如下更新命令
kubectl set image <资源类型>/<资源名称> nginx=nginx:1.19.7
kubectl set image deployment/nginx-deployment nginx=nginx:1.19.7
如果不清楚资源名称,可以通过kubectl get deploy
查看当前所有的Deployment资源。
也可以使用 edit 命令,修改 deployment 配置,一旦镜像文件发生了修改,将触发系统完成 Deployment 所有运行 Pod 根据上边配置的策略进行升级。
kubectl edit deployment/nginx-deployment
修改配置中和版本有关的信息后,保存。
在 deployment 更新时,可以通过以下指令,查看整个更新过程。
kubectl describe deployments/nginx-deployment
在最下边可以看到,整个创建的过程,新的 ReplicaSet 创建的pod由1个增加到2个,原有的 ReplicaSet 则将所属pod缩容到最后的0个。
运行 kubectl get rs
以查看 Deployment 通过创建新的 ReplicaSet 并将其扩容到2个副本,并将旧的 ReplicaSet 缩容到了0个副本,从而完成Pod更新操作。
通过kubectl get pods
查看pod,应仅显示新创建的 pod。
通过指令,查看pod中image版本,已经更新为指定的版本。
kubectl describe pod nginx-deployment-6f456c7d5f-qrtn2
kubectl edit deployment <deployment名称> -n 命名空间
kubectl scale deployment deploy名称 --replicas=pod数量 -n 命名空间
查看当前pod数量 kubectl get pods
,当前有2个deployment创建的pod。
通过命令行变更pod数量为3个
kubectl scale deploy nginx-deployment --replicas=3
查看deployment更新过程,pod增加到了3个。
kubectl describe deployment nginx-deployment
通过修改配置变更pod数量为2个。
kubectl edit deploy nginx-deployment
i
或a
进行编辑模式,修改内容后,再使用:wq
保存并退出编辑。修改自动生效
kubectl describe deploy nginx-deployment
要事件末尾,可以看到容量被缩减为2个。
kubectl get pod
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。