k8s | 深入理解 deployment 和 Replicaset
如果把k8s比喻成一个公司,那么 deployment
就像是公司的招聘主管,而 ReplicaSet
是 Deployment
的执行团队,ReplicaSet
负责确保所需的 Pod(员工) 数量和状态,它会根据 Deployment
中定义的副本数目和更新策略,持续监控和维护 Pod 的数量和状态。如果某个 Pod 失效了,ReplicaSet 会自动启动新的 Pod
来替代,以保证所需的副本数目。
ReplicaSet 是一个控制器,它用于确保指定数量的 Pod 副本在集群中运行。它的工作是根据定义的副本数和选择条件,监控现有的 Pod,并在需要时创建或删除 Pod,以保持副本数的一致性。
Deployment 用于管理应用程序的生命周期,它允许你指定所需的副本数、容器镜像、资源配置和更新策略等。Deployment 还支持滚动更新和回滚操作
工作原理
- 当创建一个
Deployment
,它会创建一个与之关联的ReplicaSet
,并根据 Deployment 的定义启动指定数量的 Pod 副本。 ReplicaSet
监控Pod
的状态,并确保始终有指定数量的Pod
在运行。- 更新
Deployment
的定义时(例如修改镜像版本或配置),Deployment
会创建一个新的 ReplicaSet,并逐步替换旧的 ReplicaSet 中的 Pod,以实现无缝的滚动更新。
通过 Deployment
和 ReplicaSet
的配合,Kubernetes 可以保证应用程序的高可用性和弹性,同时支持灵活的滚动更新和回滚操作,就像一个招聘公司的招聘主管和执行团队一样,共同合作完成招聘和执行任务
应用场景
Deployment 的 典型应用场景 包括:
- 定义 Deployment 来创建 Pod 和 ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续 Deployment
deployment
可以通过Rollout
,能够实现应用程序的无缝更新和回滚。它提供了对应用程序部署的控制和可靠性,确保新版本的应用程序能够平稳地部署和运行,同时具备灵活的回滚选项。
创建
通过 yaml
文件创建 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
执行命令
# —record 的 flag 设置为 true 可以在 annotation 中记录当前命令创建或者升级了该资源
kubectl create -f nginx-deployment.yaml --record
查看执行的结果
kubectl get deployments
开始的时候 current
为0,因为还在创建中,过一会就变成了3,创建成功
查看replicaset
和 pod
数量,都为3
kubectl get rs
kubectl get pods
更新
Deployment
的 rollout
当且仅当 Deployment
的 pod template
(例如 .spec.template
)中的 label
更新或者镜像更改时被触发。其他更新,例如扩容 Deployment 不会触发 rollout
更新 nginx 镜像的版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
使用 edit
命令来编辑 Deployment,修改 .spec.template.spec.containers[0].image
,将 nginx:1.7.9
改写成 nginx:1.9.1
kubectl edit deployment/nginx-deployment
查看 rollout 的状态
kubectl rollout status deployment/nginx-deployment
回退
假设我们在更新 Deployment 的时候犯了一个拼写错误,将镜像的名字写成了 nginx:1.91
,而正确的名字应该是 nginx:1.9.1
这个时候 Rollout 将会卡住,我们需要回退到稳定的 Deployment revision
检查升级记录。因为我们创建 Deployment 的时候使用了 —recored
参数可以记录命令,我们可以很方便的查看每次 revison 的变化。
kubectl rollout history deployment/nginx-deployment
# 查看单个版本的详细信息
kubectl rollout history deployment/nginx-deployment --revision=2
回退到历史版本
kubectl rollout undo deployment/nginx-deployment
# 也可以使用 --to-revision 参数指定某个历史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
扩容
使用以下命令扩容 Deployment
kubectl scale deployment nginx-deployment --replicas 10
暂停和恢复
以在触发一次或多次更新前暂停一个 Deployment,然后再恢复它
使用以下命令暂停 Deployment
kubectl rollout pause deployment/nginx-deployment
然后更新 Deployment 中的镜像
kubectl set image deploy/nginx nginx=nginx:1.9.1
查看rollout历史记录,没有启动新的rollout
kubectl rollout history deploy/nginx
评论区