目 录CONTENT

文章目录

k8s | 深入理解 deployment 和 Replicaset

RobKing
2023-07-19 / 0 评论 / 0 点赞 / 125 阅读 / 1,130 字

k8s | 深入理解 deployment 和 Replicaset

​ 如果把k8s比喻成一个公司,那么 deployment 就像是公司的招聘主管,而 ReplicaSetDeployment 的执行团队,ReplicaSet 负责确保所需的 Pod(员工) 数量和状态,它会根据 Deployment 中定义的副本数目和更新策略,持续监控和维护 Pod 的数量和状态。如果某个 Pod 失效了,ReplicaSet 会自动启动新的 Pod 来替代,以保证所需的副本数目。

ReplicaSet 是一个控制器,它用于确保指定数量的 Pod 副本在集群中运行。它的工作是根据定义的副本数和选择条件,监控现有的 Pod,并在需要时创建或删除 Pod,以保持副本数的一致性。

Deployment 用于管理应用程序的生命周期,它允许你指定所需的副本数、容器镜像、资源配置和更新策略等。Deployment 还支持滚动更新和回滚操作

工作原理

  1. 当创建一个 Deployment,它会创建一个与之关联的 ReplicaSet,并根据 Deployment 的定义启动指定数量的 Pod 副本。
  2. ReplicaSet 监控 Pod 的状态,并确保始终有指定数量的 Pod 在运行。
  3. 更新 Deployment 的定义时(例如修改镜像版本或配置),Deployment 会创建一个新的 ReplicaSet,并逐步替换旧的 ReplicaSet 中的 Pod,以实现无缝的滚动更新。

​ 通过 DeploymentReplicaSet 的配合,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,创建成功

查看replicasetpod 数量,都为3

kubectl get rs

kubectl get pods

更新

Deploymentrollout 当且仅当 Deploymentpod 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

参考链接

0

评论区