CKA考生注意:这些Deployment要点能助你一臂之力!
创始人
2025-07-13 17:21:09
0

一、什么是Deployment

在Kubernetes中,Deployment是一种API对象,用于定义和管理Pod的部署方式。它提供了一种声明性的方法,允许您描述应用程序的期望状态,而不必关心具体的部署细节。Deployment的主要目标是确保所定义的Pod副本数一直运行在集群中,并支持滚动更新和回滚操作。以下是Deployment的关键特性和功能:

  • 声明式配置: 使用Deployment,您可以通过YAML文件描述应用程序的期望状态,包括Pod的数量、所使用的镜像、端口等。
  • 自动化的滚动更新: 当您需要更新应用程序时,可以通过修改Deployment的配置来实现。Deployment将负责逐步更新Pod,确保在整个过程中保持应用程序的可用性。
  • 副本集管理: Deployment使用副本集(ReplicaSet)来确保指定数量的Pod实例一直运行。如果有Pod失败或被删除,Deployment会启动新的Pod来替代它们。
  • 滚动回滚: 如果在更新中发现问题,您可以轻松地执行回滚操作,将Deployment回退到之前的版本,从而恢复到稳定状态。
  • 自动修复: Deployment会自动监测Pod的运行状况,并在出现故障时尝试自动修复。如果Pod失败,Deployment将启动新的Pod,以确保所需数量的副本一直在运行。

二、Deployment基本使用

1.创建Deployment

创建Deployment资源有两种方式,一种是书写资源清单方式,一种是通过kubectl命令行的方式创建。下面的 yaml 文件定义了一个 Deployment,该 Deployment 将创建一个有 3 个 nginx Pod 副本的 ReplicaSet(副本集):

apiVersion:apps/v1
kind:Deployment
metadata:
  name:nginx-deployment
  labels:
    app:nginx
spec:
  replicas:3
  selector:
    matchLabels:
      app:nginx
  template:
    metadata:
      labels:
        app:nginx
    spec:
      containers:
      -name:nginx
        image:nginx:1.7.9
        ports:
        -containerPort:80

在这个例子中:

(1) 将创建一个名为 nginx-deployment 的 Deployment(部署),名称由.metadata.name字段指定

(2) 该 Deployment 将创建 3 个 Pod 副本,副本数量由 .spec.replicas 字段指定

(3) .spec.selector 字段指定了 Deployment 如何找到由它管理的 Pod。此案例中,我们使用了 Pod template 中定义的一个标签(app: nginx)。对于极少数的情况,这个字段也可以定义更加复杂的规则

(4) .template 字段包含了如下字段:

  • .template.metadata.labels 字段,指定了 Pod 的标签(app: nginx)
  • .template.spec.containers[].image 字段,表明该 Pod 运行一个容器 nginx:1.7.9
  • .template.spec.containers[].name 字段,表明该容器的名字是 nginx执行命令以创建 Deployment执行命令以创建 Deployment

执行命令以创建 Deployment:

kubectl apply -f nginx-deployment.yaml

或者通过下面的命令创建:

kubectl create deploy  nginx-deployment --image=nginx:1.7.9 --port=80 --replicas=3

创建成功,可以通过下面的命令查询:

controlplane $ kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           10s
controlplane $ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-867765c857-24rdz   1/1     Running   0          54s
nginx-deployment-867765c857-6r86m   1/1     Running   0          54s
nginx-deployment-867765c857-xj7c5   1/1     Running   0          54s

2.Deploy扩容

通过修改 Deployment 的 spec.replicas 字段来指定期望的副本数。例如,现在需要把上述的nginx-deployment的副本数修改5。可以通过kubect edit deploy nginx-deployment进行修改。

把spec.replicas从原来的3修改成5。保存退出编辑。然后通过如下命令查看,nginx-deployment就成功的从3个副本数变成了5个。

controlplane $ kubectl get deployments.apps 
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   5/5     5            5           5m17s
controlplane $ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-867765c857-24rdz   1/1     Running   0          6m13s
nginx-deployment-867765c857-6r86m   1/1     Running   0          6m13s
nginx-deployment-867765c857-vfr55   1/1     Running   0          62s
nginx-deployment-867765c857-vrj4f   1/1     Running   0          62s
nginx-deployment-867765c857-xj7c5   1/1     Running   0          6m13s

或者也可通过下面的命令进行扩容:

controlplane $ kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled

3.滚动更新

(1) 滚动更新介绍

滚动更新是一种自动化程度较高的发布方式,用户体验比较平滑,是目前成熟型技术组织所采用的主流发布方式,一次滚动发布一般由若干个发布批次组成,每批的数量一般是可以配置的(可以通过发布模板定义),例如第一批1台,第二批10%,第三批50%,第四批100%。每个批次之间留观察间隔,通过手工验证或监控反馈确保没有问题再发下一批次,所以总体上滚动式发布过程是比较缓慢的。

(2) 查看控制器策略

可以通过kubectl explain deploy.spec.strategy查看控制器策略。如下图:

(3) deploy更新方式

  • 支持两种更新,Recreate和RollingUpdate
  • Recreate是重建式更新,删除一个更新一个

RollingUpdate 滚动更新,定义滚动更新的更新方式的,也就是pod能多几个,少几个,控制更新力度的。

①RollingUpdate

通过kubectl explain deploy.spec.strategy.RollingUpdate查看滚动更新帮助文档。如下图:

maxSurge(最大扩展的值)和maxUnavailable(最大不可用)用来控制滚动更新的策略,取值范围分为数值和百分比。

先来看百分比:

  • maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个
  • maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个

再来看数值:

  • maxUnavailable: [0, 副本数]
  • maxSurge: [0, 副本数]

②Recreate

把deploy更新策略变成Recreate:

apiVersion:apps/v1
kind:Deployment
metadata:
  name:nginx-deployment
  labels:
    app:nginx
spec:
  replicas:3
  strategy:
    type:Recreate
...省略...

通过以下命令更新:

kubectl apply -f deploy-demo1.yaml

#另一个窗口实时监控
kubectl get pods -w

输出的结果如下:

详细deployment的使用可以参考如下:

  • 介绍 Deployment[1]
  • Deployments[2]

三、CKA真题

1.真题截图

2.中文解析

切换 k8s 集群环境:kubectl config use-context k8s

Task:

将loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个。

3.参考文档

Deployments[3]

4.解题作答

切换集群环境:

kubectl config use-context k8s

检查现有的Pod数量:

kubectl get deploy loadbalancer  -o wide

扩容loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个:

kubelct scale deploy loadbalancer  --replicas=6

检查Pod的数量:

kubectl get pod

参考资料:

  • [1]介绍 Deployment: https://www.kuboard.cn/learning/k8s-intermediate/workload/wl-deployment/
  • [2]Deployments: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
  • [3]Deployments: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...