往期精彩文章 :
什么是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基本使用
创建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
在这个例子中:
- 将创建一个名为
nginx-deployment
的 Deployment(部署),名称由.metadata.name
字段指定- 该 Deployment 将创建 3 个 Pod 副本,副本数量由
.spec.replicas
字段指定.spec.selector
字段指定了 Deployment 如何找到由它管理的 Pod。此案例中,我们使用了 Pod template 中定义的一个标签(app: nginx)。对于极少数的情况,这个字段也可以定义更加复杂的规则- .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
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
滚动更新
滚动更新介绍
滚动更新是一种自动化程度较高的发布方式,用户体验比较平滑,是目前成熟型技术组织所采用的主流发布方式,一次滚动发布一般由若干个发布批次组成,每批的数量一般是可以配置的(可以通过发布模板定义),例如第一批1台,第二批10%,第三批50%,第四批100%。每个批次之间留观察间隔,通过手工验证或监控反馈确保没有问题再发下一批次,所以总体上滚动式发布过程是比较缓慢的。
查看控制器策略
可以通过kubectl explain deploy.spec.strategy
查看控制器策略。如下图:
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 ...省略...
```shell
kubectl apply -f deploy-demo1.yaml
另一个窗口实时监控
kubectl get pods -w
输出的结果如下:
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/0554615f9a87fc14d1cbb6149c04c2dc.png)
详细deployment的使用可以参考如下
[介绍 Deployment](https://www.kuboard.cn/learning/k8s-intermediate/workload/wl-deployment/)
[Deployments](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/)
# CKA真题
1. 真题截图
![](https://ucc.alicdn.com/images/user-upload-01/img_convert/78bdb5cfd32aca0073d8237a893e580b.png)
2. 中文解析
> 切换 k8s 集群环境:`kubectl config use-context k8s`
> Task
> 将`loadbalancer` 的 deployment 管理的 Pod 的副本数扩容成 6 个。
3. 参考文档
[Deployments](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/)
4. 解题作答
- 切换集群环境
```shell
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