Deployment是对ReplicaSet和Pod更高级的抽象。(抽象指的是把复杂的系统或对象简化成更高层次、更易于理解的表示方式)
它使Pod拥有多副本,自愈,扩缩容、滚动升级等能力。
ReplicaSet(副本集)是一个Pod的集合。
它可以设置运行Pod的数量,确保任何时间都有指定数量的 Pod 副本在运行。
通常我们不直接使用ReplicaSet,而是在Deployment中声明。
什么是抽象?
抽象:Deployment 将所有这些操作封装在一个更简单的接口中。你只需要告诉 Deployment “我要运行 3 个副本的这个版本”,K8s 就会帮你自动创建、管理、更新和恢复 Pod。你不需要关心底层的 ReplicaSet 如何管理 Pod,也不用担心如何滚动更新或回滚,这些细节都被 Deployment “抽象”掉了。
用生活中的例子来理解“抽象”:
- 想象一下开车,“开车”这个行为可以被看作一个抽象。你只需要踩油门、刹车、打方向盘,而不用关心发动机、刹车系统等内部细节的运作方式——这些都是汽车制造商帮你“抽象”掉的,你只需要使用这些高层的功能就行。
总结
抽象的本质是简化和隐藏细节,只保留最核心、最有用的部分,让我们更方便地使用和理解系统或对象。这种抽象让复杂的系统变得更可控、更易于管理。
命令
创建deployment,部署3个运行nginx的Pod
#创建deployment,部署3个运行nginx的Pod
kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3
查看deployment
#查看deployment READY=3三个副本已经准备就绪 deployment可简写为deploy
kubectl get deployment
再看下pod 三Running
kubectl get pod
但是并不是由deployment直接控制Pod,是deployment控制副本集(replicaset)从而去控制pod的数量
可以看下副本集 replicaset可简写为rs
#查询副本集 replicaset可简写为rs
kubectl get replicaset
通过上方可以看出pod和副本集的字符是对应的都是nginx-deployment-79b458c974(副本集)下面又有三个pod(lxkzq 、8sbnz、stj44 )
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-79b458c974-lxkzq 1/1 Running 0 2m5s
nginx-deployment-79b458c974-8sbnz 1/1 Running 0 2m5s
nginx-deployment-79b458c974-stj44 1/1 Running 0 2m5s
测试自愈能力,将最后一个pod删除(stj44)
kubectl delete pod nginx-deployment-79b458c974-stj44
然后再查看下pod 发现pod发生变化 为:nginx-deployment-79b458c974-dwv9n
(deployment使pod具备自愈能力)
缩放
deployment还具备缩放能力
手动缩放 并观察 另开一个终端使用k8s内置watch参数 可以看到副本数量为3
#将副本数量调整为5 并看下deployment
kubectl scale deployment/nginx-deployment --replicas=5
kubectl get deploy
第二行开始期望副本数量变为5 当前副本也到5 最后就绪到5个副本(相反也是指手动缩容)
自动缩放
自动缩放通过增加和减少副本的数量,以保持所有 Pod 的平均 CPU 利用率不超过 75%。
自动伸缩需要声明Pod的资源限制,同时使用 Metrics Server 服务(k3s自带)
#自动缩放
kubectl autoscale deployment/nginx-auto --min=3 --max=10 --cpu-percent=75
#查看自动缩放
kubectl get hpa
#删除自动缩放
kubectl delete hpa nginx-deployment
滚动更新
#查看版本和Pod
kubectl get deployment/nginx-deployment -owide
查看到版本为nginx:1.22准备更新为1.23 更新前使用另外一个终端观察
更新容器镜像
#更新容器镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.23
watch观察到
创建新 ReplicaSet:Kubernetes 检测到新的镜像版本,创建了一个新的 ReplicaSet (nginx-deployment-5c87b6cf87
)。
逐步替换 Pod:新的 ReplicaSet 开始逐步增加 Pod 数量,同时旧的 ReplicaSet (nginx-deployment-79b458c974
) 逐步减少,保持期望的副本数。
完成更新:新 ReplicaSet 达到预期的 3 个副本,旧的 ReplicaSet 完全缩容到 0,滚动更新完成。
查看到现在的pod隶属与5c87b6cf87并非79b458c974
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-5c87b6cf87-q7z4d 1/1 Running 0 8m48s
nginx-deployment-5c87b6cf87-cltqg 1/1 Running 0 8m20s
nginx-deployment-5c87b6cf87-tjjw9 1/1 Running 0 7m54s
[root@k8s-master ~]#
版本回滚
#查看历史版本
kubectl rollout history deployment/nginx-deployment
查看到有两个版本 可以详细看下 增加–reversion=$即可(例如–revision=1)
当前副本集也为两个87为1.23
查看指定版本的信息,版本1为nginx:1.22 即回退1
#查看指定版本的信息
kubectl rollout history deployment/nginx-deployment --revision=1
回滚到历史版本
#回滚到历史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
已回退为1.22