Kubernetes之deployment详解

 

1.deployment介绍

为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,

而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。

 

 

 

deployment的主要功能有下面几个:

  • 支持replicaset的所有功能
  • 支持版本的滚动更新和版本回退
  • 支持发布的停止、继续

 

deployment的资源清单文件

复制代码
apiVersion: apps/v1  #版本号
kind: Deployment  #类型
metadata:    #元数据
  name:    #rs名称
  namespace:   #所属命名空间
  labels:   #标签
    controller: deploy
spec:   #详情描述
  replicas:  #副本数量
  revisionHistoryLimit: #保留历史版本,默认是10
  paused: #暂停部署,默认是false
  progressDeadlineSeconds: #部署超时时间(s),默认是600
  strategy: #策略
    type: RollingUpdates  #滚动更新策略
    rollingUpdate:  #滚动更新
      maxSurge: #最大额外可以存在的副本数,可以为百分比,也可以为整数
      maxUnavaliable: #最大不可用状态的pod的最大值,可以为百分比,也可以为整数
  selector:  #选择器,通过它指定该控制器管理哪些pod
    matchLabels:   #Labels匹配规则
       app: nginx-pod
    matchExpressions:   #Expression匹配规则
      - {key: app, operator: In, values: [nginx-pod]}
  template:  #模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
        labels:
          app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80
复制代码

2.deployment创建

1)nginx-deployment.yaml,内容如下:

复制代码
[root@k8s-master yaml]# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
     app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
复制代码

 

 

2)执行创建

复制代码
[root@k8s-master yaml]# kubectl apply -f nginx-deployment.yaml
[root@k8s-master yaml]# kubectl get deploy,rs,po -o wide
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/nginx-deployment   3/3     3            3           41s   nginx        nginx:1.17.1   app=nginx-pod

NAME                                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
replicaset.apps/nginx-deployment-5d9c9b97bb   3         3         3       41s   nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=5d9c9b97bb

NAME                                    READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/nginx-deployment-5d9c9b97bb-4p2hx   1/1     Running   0          41s   10.244.36.82     k8s-node1   <none>           <none>
pod/nginx-deployment-5d9c9b97bb-p58lf   1/1     Running   0          41s   10.244.169.133   k8s-node2   <none>           <none>
pod/nginx-deployment-5d9c9b97bb-sm9zz   1/1     Running   0          41s   10.244.36.83     k8s-node1   <none>           <none>
复制代码

注:查看deployment控制的rs和pod,发现rs是在deployment之后加了一段字符串,而pod是在rs之后加了一段字符串

即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大

 

3.deployment扩缩容

Deployment扩容缩容的本质其实就是改变ReplicaSet的数量来控制Pod的数量,增加就是扩容,缩小就是缩容。

  • 方式一:kubectl scale deploy deploy名称 --replicas=pod数量 -n 命名空间
  • 方式二:kubectl edit deploy deploy名字 -n 命名空间

注:以上两种方式均可以实现扩缩容,根据实际情况选择即可

1)扩容示例:假设我们要将nginx从3个pod扩展到5个pod

复制代码
[root@k8s-master yaml]# kubectl scale deploy nginx-deployment --replicas=5 -n default
deployment.apps/nginx-deployment scaled
[root@k8s-master yaml]# kubectl get deploy,rs,po
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   5/5     5            5           19m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-5d9c9b97bb   5         5         5       19m

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5d9c9b97bb-4p2hx   1/1     Running   0          19m
pod/nginx-deployment-5d9c9b97bb-bjnbs   1/1     Running   0          29s
pod/nginx-deployment-5d9c9b97bb-p58lf   1/1     Running   0          19m
pod/nginx-deployment-5d9c9b97bb-sm9zz   1/1     Running   0          19m
pod/nginx-deployment-5d9c9b97bb-x92nj   1/1     Running   0          29s
复制代码

 

 
2)缩容示例:假设我们将nginx从5个缩容到3个
复制代码
[root@k8s-master yaml]# kubectl edit deploy nginx-deployment -n default
deployment.apps/nginx-deployment edited
#找到replicas,将其数量改为3
spec:
  progressDeadlineSeconds: 600
  replicas: 3
[root@k8s-master yaml]# kubectl get deploy,rs,po
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           29m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-5d9c9b97bb   3         3         3       29m

NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-5d9c9b97bb-4p2hx   1/1     Running   0          29m
pod/nginx-deployment-5d9c9b97bb-bjnbs   1/1     Running   0          9m47s
pod/nginx-deployment-5d9c9b97bb-p58lf   1/1     Running   0          29m
复制代码

 

 

4.deployment更新和回滚

deployment支持两种镜像更新策略:重建更新滚动更新(默认),可以通过strategy选项进行配置

strategy:指定新的pod替换旧的pod的策略,支持两个属性:
  type:指定策略类型,支持两种策略
    Recreate:在创建出新的pod之前会先杀掉所有已存在的pod
    RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本pod
  rollingUpdate:当type为RollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性
    maxUnavailable:用来指定在升级过程中不可用pod的最大数量,默认为25%
    maxSurge:用来指定在升级过程中可以超过期望的pod的最大数量,默认为25%
 

1)重建更新

编辑pc-deployment.yaml,在spec节点下添加更新策略

spec:
  strategy:  #策略
    type: Recreate  #重建更新策略

创建deploy进行验证

复制代码
#首先记录原本的pod名
[root@k8s-master yaml]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5d9c9b97bb-4p2hx   1/1     Running   0          40m
nginx-deployment-5d9c9b97bb-bjnbs   1/1     Running   0          21m
nginx-deployment-5d9c9b97bb-p58lf   1/1     Running   0          40m

#更改pod镜像
[root@k8s-master yaml]# kubectl set image deploy nginx-deployment nginx=nginx:1.17.2
deployment.apps/nginx-deployment image updated

#再次查看镜像(先是中断rs控制器,再是拉取nginx新镜像,最后根据新镜像创建pod)
[root@k8s-master yaml]# kubectl get pods
NAME                                READY   STATUS        RESTARTS   AGE
nginx-deployment-5d9c9b97bb-4p2hx   0/1     Terminating   0          42m
[root@k8s-master yaml]# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-7c7477c7ff-5xmxl   0/1     ContainerCreating   0          0s
nginx-deployment-7c7477c7ff-xjdcg   0/1     ContainerCreating   0          0s
nginx-deployment-7c7477c7ff-xtxh7   0/1     ContainerCreating   0          0s
[root@k8s-master yaml]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7c7477c7ff-5xmxl   1/1     Running   0          63s
nginx-deployment-7c7477c7ff-xjdcg   1/1     Running   0          63s
nginx-deployment-7c7477c7ff-xtxh7   1/1     Running   0          63s
复制代码

 注:Recreate 的升级策略就是完全删除再重建,这样会导致服务一段时间不可用

 

 

2)滚动更新

编辑pc-deployment.yaml,在spec节点下添加滚动更新策略(也可以把strategy去掉,因为默认滚动更新策略)

strategy:
  type: RollingUpdate #滚动更新策略
  rollingUpdate:
    maxUnavailable: 25%  #用来指定在升级过程中不可用pod的最大数量,默认为25%
    maxSurge: 25% #用来指定在升级过程中可以超过期望的pod的最大数量,默认为25%

创建deploy进行验证

复制代码
滚动更新前(nginx为1.17.2)
[root@k8s-master yaml]# kubectl get deploy,rs,pod -o wide
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
deployment.apps/nginx-deployment   3/3     3            3           6m4s   nginx        nginx:1.17.2   app=nginx-pod

NAME                                          DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
replicaset.apps/nginx-deployment-5d9c9b97bb   0         0         0       6m4s   nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=5d9c9b97bb
replicaset.apps/nginx-deployment-7c7477c7ff   3         3         3       87s    nginx        nginx:1.17.2   app=nginx-pod,pod-template-hash=7c7477c7ff

NAME                                    READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod/nginx-deployment-7c7477c7ff-769lc   1/1     Running   0          84s   10.244.36.94     k8s-node1   <none>           <none>
pod/nginx-deployment-7c7477c7ff-9jvdj   1/1     Running   0          87s   10.244.36.93     k8s-node1   <none>           <none>
pod/nginx-deployment-7c7477c7ff-m9b2r   1/1     Running   0          85s   10.244.169.139   k8s-node2   <none>           <none>


更新镜像
[root@k8s-master yaml]# kubectl set image deploy nginx-deployment nginx=nginx:1.17.3
deployment.apps/nginx-deployment image updated
[root@k8s-master yaml]# kubectl get deploy,rs,pod -o wide
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
deployment.apps/nginx-deployment   3/3     3            3           8m43s   nginx        nginx:1.17.3   app=nginx-pod

NAME                                          DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
replicaset.apps/nginx-deployment-5d9c9b97bb   0         0         0       8m43s   nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=5d9c9b97bb
replicaset.apps/nginx-deployment-76fd8c7f84   3         3         2       3s      nginx        nginx:1.17.3   app=nginx-pod,pod-template-hash=76fd8c7f84
replicaset.apps/nginx-deployment-7c7477c7ff   1         1         1       4m6s    nginx        nginx:1.17.2   app=nginx-pod,pod-template-hash=7c7477c7ff

NAME                                    READY   STATUS              RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
pod/nginx-deployment-76fd8c7f84-2ttfm   1/1     Running             0          2s     10.244.169.140   k8s-node2   <none>           <none>
pod/nginx-deployment-76fd8c7f84-4g5wq   0/1     ContainerCreating   0          1s     <none>           k8s-node1   <none>           <none>
pod/nginx-deployment-76fd8c7f84-694sl   1/1     Running             0          3s     10.244.36.95     k8s-node1   <none>           <none>
pod/nginx-deployment-7c7477c7ff-769lc   0/1     Terminating         0          4m3s   10.244.36.94     k8s-node1   <none>           <none>
pod/nginx-deployment-7c7477c7ff-9jvdj   1/1     Running             0          4m6s   10.244.36.93     k8s-node1   <none>           <none>
pod/nginx-deployment-7c7477c7ff-m9b2r   1/1     Terminating         0          4m4s   10.244.169.139   k8s-node2   <none>           <none>


查看更新后镜像版本(nginx为1.17.3
[root@k8s-master yaml]# kubectl get deploy,rs,pod -o wide
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/nginx-deployment   3/3     3            3           10m   nginx        nginx:1.17.3   app=nginx-pod

NAME                                          DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
replicaset.apps/nginx-deployment-5d9c9b97bb   0         0         0       10m    nginx        nginx:1.17.1   app=nginx-pod,pod-template-hash=5d9c9b97bb
replicaset.apps/nginx-deployment-76fd8c7f84   3         3         3       118s   nginx        nginx:1.17.3   app=nginx-pod,pod-template-hash=76fd8c7f84
replicaset.apps/nginx-deployment-7c7477c7ff   0         0         0       6m1s   nginx        nginx:1.17.2   app=nginx-pod,pod-template-hash=7c7477c7ff

NAME                                    READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
pod/nginx-deployment-76fd8c7f84-2ttfm   1/1     Running   0          117s   10.244.169.140   k8s-node2   <none>           <none>
pod/nginx-deployment-76fd8c7f84-4g5wq   1/1     Running   0          116s   10.244.36.96     k8s-node1   <none>           <none>
pod/nginx-deployment-76fd8c7f84-694sl   1/1     Running   0          118s   10.244.36.95     k8s-node1   <none>           <none>
复制代码

 

 

3)滚动更新的过程

 

 

 

5.deployment回滚

deployment支持版本升级过程中的暂停,继续功能以及版本回退等诸多功能,下面具体来看

kubectl rollout:版本升级相关功能,支持下面的选项:

  • status:显示当前升级状态
  • history:显示升级历史记录
  • pause:暂停版本升级过程
  • resume:继续已经暂停的版本升级过程
  • restart:重启版本升级过程
  • undo:回滚到上一级版本(可以使用--to-revision回滚到指定版本)
复制代码
#当前nginx版本
[root@k8s-master yaml]# kubectl get deploy -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           24m   nginx        nginx:1.17.3   app=nginx-pod


#查看升级状态
[root@k8s-master yaml]# kubectl rollout status deploy nginx-deployment
deployment "nginx-deployment" successfully rolled out

#查看升级历史
[root@k8s-master yaml]# kubectl rollout history deploy nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

#查看版本详情
[root@k8s-master yaml]# kubectl rollout history deployment nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:    app=nginx-pod
    pod-template-hash=7c7477c7ff
  Containers:
   nginx:
    Image:    nginx:1.17.2
    Port:    <none>
    Host Port:    <none>
    Environment:    <none>
    Mounts:    <none>
  Volumes:    <none>

#版本回滚这里使用--to-revision=2回滚到2版本,如果省略这个选项,则会回退到上个版本
[root@k8s-master yaml]# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back

#查看当前版本(nginx为1.17.2)说明回退成功
[root@k8s-master yaml]# kubectl get deployments -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           27m   nginx        nginx:1.17.2   app=nginx-pod
复制代码

 

 

 

6.金丝雀发布(灰度发布)

deployment支持更新过程中的控制,如"暂停(pause)"或"继续(resume)"更新操作,观察新服务实际运行状况再决定操作

金丝雀发布(可以理解为灰度发布):比如有一批新的pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新的pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

复制代码
#更新deployment版本,并配置暂停deployment
[root@k8s-master yaml]# kubectl set image deploy nginx-deployment nginx=nginx:1.17.3 && kubectl rollout pause deploy nginx-deployment
deployment.apps/nginx-deployment image updated
deployment.apps/nginx-deployment paused


#查看rs,发现老版本rs没有减少,新版本rs增加一个,状态为更新中....
[root@k8s-master yaml]# kubectl get rs,deploy
NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-5d9c9b97bb   0         0         0       39m
replicaset.apps/nginx-deployment-76fd8c7f84   1         1         1       30m
replicaset.apps/nginx-deployment-7c7477c7ff   3         3         3       34m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   4/3     1            4           39m
[root@k8s-master yaml]# kubectl rollout status deployment nginx-deployment 
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...


#继续deploy的更新
[root@k8s-master yaml]# kubectl rollout resume deployment nginx-deployment 
deployment.apps/nginx-deployment resumed
[root@k8s-master yaml]# kubectl rollout status deployment nginx-deployment 
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out


#查看rs更新结果,发现老版本均停止,新版本已经创建好
[root@k8s-master yaml]# kubectl get rs,deploy
NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-5d9c9b97bb   0         0         0       41m
replicaset.apps/nginx-deployment-76fd8c7f84   3         3         3       32m
replicaset.apps/nginx-deployment-7c7477c7ff   0         0         0       36m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           41m
复制代码

 

posted @   杰宏唯一  阅读(4011)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示