Kubernetes(k8s)的Pod控制器Deployment详细讲解

1. 概述

Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod。所以Deployment的功能比ReplicaSet强大。支持扩缩容、 发布的停止和继续、镜像版本滚动变更、ReplicaSet版本回退

Deployment

Deployment的资源清单文件模板

apiVersion: apps/v1                    
kind: Deployment                      
metadata:                             
  name: pod-controller                # deploy名称 
  namespace: dev                      # deploy所属命名空间 
  labels:                             # 给deploy打标签 
    controller: deploy 
spec:                                
  replicas: 3                         # pod副本数量。默认是1
  revisionHistoryLimit: 3             # 保留ReplicaSet历史版本数量,默认为10 
  paused: false                       # 暂停部署,默认是false 
  progressDeadlineSeconds: 600        # 部署超时时间(s),默认是600 
  strategy:                           # Pod更新策略,默认是RollingUpdate 
    type: RollingUpdate               # 滚动更新策略。另一种是Recreate,其没有子属性配置参数 
    rollingUpdate:                    # 当type为RollingUpdate的时候生效,为其配置参数
      maxSurge: 25%                   # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%
      maxUnavailable: 25%             # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25% 
  selector:                           # 选择器,通过该控制器管理哪些pod 
    matchLabels:                      # Labels匹配规则。和matchExpressions类似
      app: nginx-pod 
    matchExpressions:                 # Expressions匹配规则。和matchLabels类似 
      - {key: app, operator: In, values: ["nginx-pod"]} 
  template:                           # pod副本创建模板。属性和Pod的属性一样
    metadata: 
      labels: 
        app: nginx-pod 
    spec: 
      containers: 
      - name: nginx 
        image: nginx:latest
        ports: 
        - name: nginx-port
          containerPort: 80
          protocol: TCP

2. 创建Deployment

新建pod-controller.yaml,内容如下。并运行deployment

[root@k8s-master ~]# cat pod-controller.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-controller
  namespace: dev
  labels:
    controller: deploy 
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: nginx-port
              containerPort: 80
              protocol: TCP
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl apply -f pod-controller.yaml 
deployment.apps/pod-controller created
[root@k8s-master ~]#

2.1 查看Deployment

UP-TO-DATE表示更新时最新版本的Pod数量

[root@k8s-master ~]# kubectl get deploy pod-controller -n dev
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
pod-controller   3/3     3            3           2m13s
[root@k8s-master ~]# 

3. 扩缩容

方式一:使用以下命令,编辑文本内容:spec: replicas: 4

[root@k8s-master ~]# kubectl edit deploy pod-controller -n dev
deployment.apps/pod-controller edited
[root@k8s-master ~]#

方式二:直接使用命令

[root@k8s-master ~]# kubectl scale deploy pod-controller --replicas=2 -n dev
deployment.apps/pod-controller scaled
[root@k8s-master ~]#

4. 镜像版本变更

4.1 概述

新的Pod替代旧的Pod支持两种镜像更新策略:

  • 重建更新Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
  • 滚动更新RollingUpdate(默认):先杀死一部分,再启动一部分。再杀死一部分,再启动一部分。如此循环。在更新过程中,存在两个版本的Pod

通过strategy属性进行配置

4.2 重建更新

在spec属性下面新增strategy属性,最终的pod-controller.yaml内容如下。然后使yaml配置文件生效

[root@k8s-master ~]# cat pod-controller.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-controller
  namespace: dev
  labels:
    controller: deploy 
spec:
  replicas: 3
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: nginx-port
              containerPort: 80
              protocol: TCP
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl apply -f pod-controller.yaml 
deployment.apps/pod-controller configured
[root@k8s-master ~]# 

更新镜像版本

[root@k8s-master ~]# kubectl set image deploy pod-controller nginx=nginx:1.21.6 -n dev
deployment.apps/pod-controller image updated
[root@k8s-master ~]# 

持续查看Pod版本变更情况

[root@k8s-master ~]# kubectl get pod -n dev -w
NAME                              READY   STATUS              RESTARTS   AGE
pod-controller-5bdd9d95bf-9lljw   0/1     ContainerCreating   0          11s
pod-controller-5bdd9d95bf-9nph6   0/1     ContainerCreating   0          11s
pod-controller-5bdd9d95bf-z7n5c   0/1     ContainerCreating   0          11s
pod-controller-5bdd9d95bf-9nph6   1/1     Running             0          95s
pod-controller-5bdd9d95bf-z7n5c   1/1     Running             0          106s
pod-controller-5bdd9d95bf-9lljw   1/1     Running             0          113s

4.3 滚动更新

在spec属性下面新增strategy属性,最终的pod-controller.yaml内容如下。然后使yaml配置文件生效

[root@k8s-master ~]# cat pod-controller.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-controller
  namespace: dev
  labels:
    controller: deploy 
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: nginx-port
              containerPort: 80
              protocol: TCP
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl apply -f pod-controller.yaml 
deployment.apps/pod-controller configured
[root@k8s-master ~]# 

更新镜像版本

[root@k8s-master ~]# kubectl set image deploy pod-controller nginx=nginx:1.21 -n dev
deployment.apps/pod-controller image updated
[root@k8s-master ~]# 

持续查看Pod版本变更情况。可以看到是滚动更新的

[root@k8s-master ~]# kubectl get pod -n dev -w
NAME                              READY   STATUS              RESTARTS   AGE
pod-controller-5b899bbdb4-2w59n   1/1     Running             0          53s
pod-controller-5b899bbdb4-9bfm9   1/1     Running             0          19s
pod-controller-5b899bbdb4-fn5ck   1/1     Running             0          37s
pod-controller-bcc5899bf-mcfnh    0/1     ContainerCreating   0          2s
pod-controller-bcc5899bf-mcfnh    1/1     Running             0          16s
pod-controller-5b899bbdb4-9bfm9   1/1     Terminating         0          33s
pod-controller-bcc5899bf-w6vfb    0/1     Pending             0          0s
pod-controller-bcc5899bf-w6vfb    0/1     ContainerCreating   0          1s
pod-controller-bcc5899bf-w6vfb    1/1     Running             0          17s
pod-controller-5b899bbdb4-fn5ck   1/1     Terminating         0          68s
pod-controller-bcc5899bf-zkfkb    0/1     Pending             0          0s
pod-controller-bcc5899bf-zkfkb    0/1     ContainerCreating   0          0s
pod-controller-bcc5899bf-zkfkb    1/1     Running             0          16s
pod-controller-5b899bbdb4-2w59n   1/1     Terminating         0          100s

查看ReplicaSet情况。可以看到原来的rs依旧存在,只是Pod的数量变为0。这就是Deployment可以进行版本回退的原因

[root@k8s-master ~]# kubectl get rs -n dev
NAME                        DESIRED   CURRENT   READY   AGE
pod-controller-5b899bbdb4   0         0         0       18m
pod-controller-5bdd9d95bf   0         0         0       13m
pod-controller-bcc5899bf    3         3         3       5m54s
[root@k8s-master ~]#

5. 版本回退(镜像版本变更回退)

Deployment支持版本升级过程中的暂停、继续功能,以及版本回退等功能

版本回退的命令语法如下所示:

[root@k8s-master ~]# kubetl rollout 参数 deploy deploy-name

支持的参数如下:

  • status:显示当前升级的状态
  • history:显示升级历史记录。kubectl apply -f deploy.yaml需要加上--record参数,CHANGE-CAUSE字段才有数据
  • pause:暂停版本升级过程
  • resume:继续已经暂停的版本升级过程
  • restart:重启版本升级过程
  • undo:回滚到上一个版本(可以使用–to-revision参数回滚到指定的版本,可通过history进行查看版本号)

5.1 查看当前升级版本的状态

[root@k8s-master ~]# kubectl rollout status deployment pod-controller -n dev
deployment "pod-controller" successfully rolled out
[root@k8s-master ~]# 

5.2 查看升级历史记录:

[root@k8s-master ~]# kubectl rollout history deployment pod-controller -n dev
deployment.apps/pod-controller 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

[root@k8s-master ~]# 

5.3 版本回退:

回退到最老的一个版本。回退的时候将当前版本的Pod数量降为0,然后将回退版本的Pod数量提升为目标数量

[root@k8s-master ~]# kubectl rollout undo deployment pod-controller --to-revision=1 -n dev
deployment.apps/pod-controller rolled back
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get deployment pod-controller -n dev -o wide
NAME             READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
pod-controller   3/3     3            3           43m   nginx        nginx:latest   app=nginx-pod
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get rs -n dev
NAME                        DESIRED   CURRENT   READY   AGE
pod-controller-5b899bbdb4   3         3         3       43m
pod-controller-5bdd9d95bf   0         0         0       38m
pod-controller-bcc5899bf    0         0         0       31m
[root@k8s-master ~]# 

6 金丝雀发布/灰度发布

Deployment支持更新过程中的控制,如暂停版本变更(pause)或继续版本变更操作(resume)

暂停版本变更操作,可以检查变更后的Pod能否正常提供服务。如不能则可以进行回退。如可以则继续版本变更操作

变更Deployment的版本,并配置暂停Deployment

[root@k8s-master ~]# kubectl get rs -n dev
NAME                        DESIRED   CURRENT   READY   AGE
pod-controller-5b899bbdb4   3         3         3       56m
pod-controller-5bdd9d95bf   0         0         0       51m
pod-controller-bcc5899bf    0         0         0       43m
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl set image deployment pod-controller nginx=nginx:1.20.2 -n dev && kubectl rollout pause deployment pod-controller -n dev
deployment.apps/pod-controller image updated
deployment.apps/pod-controller paused
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get rs -n dev
NAME                        DESIRED   CURRENT   READY   AGE
pod-controller-59d5b49ffd   1         1         1       54s
pod-controller-5b899bbdb4   3         3         3       56m
pod-controller-5bdd9d95bf   0         0         0       51m
pod-controller-bcc5899bf    0         0         0       43m
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pod -n dev
NAME                              READY   STATUS    RESTARTS   AGE
pod-controller-59d5b49ffd-tvqlt   1/1     Running   0          4m11s
pod-controller-5b899bbdb4-bvfjn   1/1     Running   0          18m
pod-controller-5b899bbdb4-vmbhb   1/1     Running   0          18m
pod-controller-5b899bbdb4-xcxxs   1/1     Running   0          19m
[root@k8s-master ~]# 

查看版本变更状态

[root@k8s-master ~]# kubectl rollout status deployment pod-controller -n dev
Waiting for deployment "pod-controller" rollout to finish: 1 out of 3 new replicas have been updated...

确保变更后的Pod没问题之后,继续更新

[root@k8s-master ~]# kubectl rollout resume deployment pod-controller -n dev
deployment.apps/pod-controller resumed
[root@k8s-master ~]#

7. 删除Deployment

Deployment管理的ReplicaSet和Pod也会一起被删除

[root@k8s-master ~]# kubectl delete -f pod-controller.yaml 
deployment.apps "pod-controller" deleted
[root@k8s-master ~]#
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: DeploymentPodKubernetes 中的两个重要概念。 DeploymentKubernetes 中用于管理 Pod 副本数量的资源对象,它定义了 Pod 副本的数量、Pod 模板以及更新策略等信息。Deployment 可以保证指定数量的 Pod 副本处于运行状态,并且可以在更新时提供滚动升级的策略,确保应用程序不会出现中断。 Pod 则是 Kubernetes 中最小的可部署对象,它是一组容器的集合,它们共享相同的网络命名空间和存储卷,并在同一节点上运行。Pod 可以包含一个或多个容器,这些容器可以共享文件系统、进程和网络命名空间等资源。PodKubernetes 中最基本的部署单元,而 Deployment 则用于管理 Pod 的生命周期和副本数量。 因此,可以将 Deployment 理解为管理 Pod 副本的控制器,而 Pod 则是 Deployment 管理的对象。在 Kubernetes 中,DeploymentPod 经常一起使用,以确保应用程序的高可用性和可靠性。 ### 回答2: DeploymentKubernetes中的一个资源对象,用于描述和管理应用程序在集群中的部署。它定义了应用程序的副本数量、位置和更新策略等信息。Deployment通过控制器模式监控和维护应用程序的状态,根据需要创建、更新或删除副本。当集群中的节点发生故障或应用程序需要进行水平扩展时,Deployment会自动调整副本的数量,确保应用程序的高可用性和稳定性。 PodKubernetes中的最小部署单元,它是一组容器的集合,可以共享网络和存储资源。Pod中的容器通常与应用程序的不同部分相关联,例如前端、后端、数据库等。Pod作为一个整体部署和运行,它具有自己的IP地址和网络空间,并且可以在同一节点或不同节点上运行。 Deployment通过管理Pod的创建、销毁和更新,为应用程序提供了一种方便的部署和管理方式。当创建一个Deployment时,Kubernetes会自动创建一个或多个Pod,并在集群中的节点上进行分发。Pod中的容器可以通过共享网络和存储资源来进行通信和数据交互,提供了良好的应用程序部署和扩展的基础。此外,Deployment还支持滚动更新策略,可以逐步将旧的Pod替换为新的Pod,实现应用程序的无缝更新和回滚。 总之,Deployment是管理应用程序在Kubernetes集群中部署和更新的资源对象,而Pod是最小的部署单元,用于运行和管理应用程序的容器。它们共同提供了一种高效、可靠的应用程序部署和管理方式。 ### 回答3: DeploymentKubernetes 中的一个资源对象,用于管理应用程序的部署和更新过程。它定义了应用程序的期望状态,并通过控制器来确保实际状态与期望状态一致。Deployment 可以方便地创建和管理 Pod,并提供了一种机制来平滑地升级和回滚应用程序。 PodKubernetes 中最小的可部署单元,由一个或多个容器共享网络和存储资源组成。Pod 中的容器紧密耦合,它们共享同一主机和 IP 地址,并且可以使用 localhost 进行同步和通信。Pod 提供了一种抽象层,使应用程序能够以一种相对无状态的方式运行,而不必担心底层基础设施的细节。 DeploymentPod 之间存在一定的关系。Deployment 可以管理多个 Pod 的部署和更新过程。通过定义 Deployment 资源,可以指定应该创建多少个 Pod,并在需要时自动创建或删除 PodDeployment 还可以指定 Pod 使用哪个容器镜像,并确保 Pod 的副本数符合期望的副本数。 总的来说,Deployment 是用来管理 Pod 的,它提供了一种声明式的方式来定义应用程序的运行方式,包括副本数、容器镜像等。而 Pod 则是实际运行应用程序的最小单元,它由一个或多个容器组成,并共享网络和存储资源。DeploymentPod 的结合可以实现应用程序的自动部署、水平扩展和版本控制等功能,使应用程序更加方便和可靠地运行在 Kubernetes 平台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值