四、K8S之Deployment
一、概述
在K8S中,Deployment是一种更高层级的控制器,用于管理应用程序的部署和更新。为 Pod和 ReplicaSet提供声明式的更新能力。比如:
-
部署ReplicaSet(副本集)
-
清理不再需要的旧版RS
-
扩展/缩小RS里的Pod数量
-
动态更新
Pod
(根据Pod模板定义的更新用新Pod替换旧Pod) -
回滚到以前的
Deployment
版本
二、体验Deployment
- 1、使用命令指定镜像创建
kubectl create deploy nginx-deploy --image nginx
- 2、查看deploy资源
kubectl get deploy
------------------------------------------------------------
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 7m38s
这里就会得到一个名为 nginx-deploy
的deploy资源,而我们知道Deployment不直接控制Pod,是先控制ReplicaSe,所以先查看replicaSet资源
- 2、获取replicaSet资源信息
kubectl get replicaSet
------------------------------------------------------------
NAME DESIRED CURRENT READY AGE
nginx-deploy-6c758c8d46 1 1 1 10m
这里的名字是有规律的,在 nginx-deploy
后面加上了随机字符-6c758c8d46
作为replicaSet的资源名称。
- 3、再看一下Pod
kubectl get po
------------------------------------------------------------
NAME READY STATUS RESTARTS AGE
nginx-deploy-6c758c8d46-5swnb 1/1 Running 0 20m
最后发现他们的是有联系,在nginx-deploy-6c758c8d46
后面又多了随机字符作为pod的名称
- 4、删除Pod会怎么样?
kubectl delete pods nginx-deploy-6c758c8d46-5swnb
- 5、再看Pod信息
kubectl get po
发现pod又出来了一个,但名字变了,说明Deployment也确实在帮我们管理的pod信息
- 6、查看yaml文件
我们虽然是直接用的命令来创建deployment,但K8S也帮我们创建了一个配置文件,使用口令可查看
kubectl get deploy nginx-deploy -o yaml
把配置内容简化并且加上注释得到
apiVersion: apps/v1
kind: Deployment
metadata: #元信息
labels: #配置的标签名称
app: nginx-deploy
name: nginx-deploy #Deployment的名称
namespace: default #所用的命名空间
spec:
replicas: 1 # 期望副本数量
revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数
selector: # !关键,是叫选择器,用于找到匹配RS的重要条件
matchLabels: # 按照标签匹配
app: nginx-deploy
strategy: # 更新策略
type: RollingUpdate # 更新类型,采用滚动更新
rollingUpdate: # 滚动更新配置
maxSurge: 25% #进行滚动更新时,更新的个数最多可以超过多少个数/比率
maxUnavailable: 25% # 进行滚动更新时,允许多少个数/比率失败
template: #描述pod的模板
metadata: #描述Pod的元信息
labels: # 设置pod的标签
app: nginx-deploy
spec: #pod期望信息
containers: #容器配置信息
- image: nginx
imagePullPolicy: Always #拉取策略
name: nginx
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30 #删除超时时间
三、滚动更新
滚动更新主要目标是无缝地将旧版本的Pod替换成新版本的Pod,采用逐步增加新版本Pod的副本数,同同时逐渐减少旧的版本的副本数量,以实现应用程序的平滑升级,这样可以确保应用程序在整个更新过程中持续提供服务
3.1、创建Deploy文件
- 创建文件
touch nginx-deploy.yaml
- 编辑内容
apiVersion: apps/v1
kind: Deployment
metadata: #元信息
labels: #配置的标签名称
app: nginx-deploy
name: nginx-deploy #Deployment的名称
namespace: default #所用的命名空间
spec:
replicas: 1 # 期望副本数量
revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数
selector: # !关键,是叫选择器,用于找到匹配RS的重要条件
matchLabels: # 按照标签匹配
app: nginx-deploy
strategy: # 更新策略
type: RollingUpdate # 更新类型,采用滚动更新
rollingUpdate: # 滚动更新配置
maxSurge: 25% #进行滚动更新时,更新的个数最多可以超过多少个数/比率
maxUnavailable: 25% # 进行滚动更新时,允许多少个数/比率失败
template: #描述pod的模板
metadata: #描述Pod的元信息
labels: # 设置pod的标签
app: nginx-deploy
spec: #pod期望信息
containers: #容器配置信息
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent #拉取策略
name: nginx
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30 #删除超时时间
- 创建deployment
kubectl create -f nginx-deploy.yaml
3.2、修改副本数
- 获取deploy信息
kubectl get deploy
------------------------------------------
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 23m
这里看UP-TO-DATE
列(更新数),为1
- 修改副本数为3
kubectl edit deploy nginx-deploy
# 将下面信息修改为3
spec.replicas=3
- 再次查看已成功修改了
kubectl get deploy
------------------------------------------
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 33m
3.3、滚动更新
- 修改nginx镜像版本
kubectl set image deployment/nginx-deploy nginx=nginx:1.9.1 --record
可以使用命令,也可以进到配置文件里修改, --record 是用来记录修改的内容
- 查看滚动更新信息
kubectl rollout status deploy nginx-deploy
- 查deploy的详细信息
kubectl describe deploy nginx-deploy
----------------------------------------------------------
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 55m deployment-controller Scaled up replica set nginx-deploy-78d8bf4fd7 to 3
Normal ScalingReplicaSet 47m deployment-controller Scaled up replica set nginx-deploy-754898b577 to 1
Normal ScalingReplicaSet 44m deployment-controller Scaled down replica set nginx-deploy-78d8bf4fd7 to 2
Normal ScalingReplicaSet 44m deployment-controller Scaled up replica set nginx-deploy-754898b577 to 2
Normal ScalingReplicaSet 38m deployment-controller Scaled down replica set nginx-deploy-78d8bf4fd7 to 1
Normal ScalingReplicaSet 38m deployment-controller Scaled up replica set nginx-deploy-754898b577 to 3
Normal ScalingReplicaSet 38m deployment-controller Scaled down replica set nginx-deploy-78d8bf4fd7 to 0
- 分析日志
Scaled up replica set nginx-deploy-78d8bf4fd7 to 3
Scaled up replica set nginx-deploy-754898b577 to 1
Scaled down replica set nginx-deploy-78d8bf4fd7 to 2
Scaled up replica set nginx-deploy-754898b577 to 2
Scaled down replica set nginx-deploy-78d8bf4fd7 to 1
Scaled up replica set nginx-deploy-754898b577 to 3
Scaled down replica set nginx-deploy-78d8bf4fd7 to 0
看日志得出,先是修改的**replica(nginx-deploy-78d8bf4fd7)
副本数为3,随后创建新的replica(nginx-deploy-754898b577)
**,副本数为1,当新的replica启动1个后,则旧的replica副本数旧副本数就减少1个,依次类推,直到新的replica启动了3个,旧的replica剩下0个
- 查看RS信息
kubectl get rs
-----------------------------------------
nginx-deploy-754898b577 3 3 3 56m
nginx-deploy-78d8bf4fd7 0 0 0 96m
四、版本回滚
- 查看历史版本
kubectl rollout history deployment/nginx-deploy
- 查看具体的版本信息
kubectl rollout history deployment/nginx-deploy --revision=2
- 回退得上一个版本
kubectl rollout undo deployment/nginx-deploy
- 指定版本回退
kubectl rollout undo deployment/nginx-deploy --to-revision=2
- 调整保留的历史版本数
#默认为10 ,设置为0,则代表不能回滚
.spec.revisonHistoryLimit=10
五、扩缩容和更新暂停
5.1、扩缩容
每次调整副本数去修改文件会觉得麻烦,可以直接使用命令 的方式实现副本数的调整
kubectl scale --replicas=xx deploy nginx-deploy
5.2、更新的暂停和恢复
在知道需要修改多次配置文件,不想每次修改完执行更新操作,可以使用命令暂停更新
- 暂停
kubectl rollout pause deployment nginx-deploy
- 恢复
kubectl rollout resume deploy nginx-deploy