四、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