云原生 云原生系列之:Deployment(六)

少年 · 2022年08月16日 · 最后由 少年 回复于 2022年08月18日 · 6785 次阅读

专题合集

《云原生系列专题分享合集》

目录

ReplicaSet

前面讲到,Container 类似进程的概念,而 Pod 类似进程组的概念。

那么 Controller 就是管理 Pod 这样的进程组的存在,Deployment 就是一种常见的 Controller。

现在我们来看一个常见的 Deployment 部署文件。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: jmeter
  namespace: default
  labels:
    k8s-app: jmeter
spec:
  selector:
    matchLabels:
      k8s-app: jmeter
  replicas: 2
  template:
    metadata:
      labels:
        k8s-app: jmeter
        name: jmeter
    spec:
      containers:
        - name: jmeter
          image: shaonianyr/jmeter:demo
          imagePullPolicy: Always
          ports:
            - name: port
              containerPort: 60000
              protocol: TCP

我们使用这个 Deployment Controller,使得 Jmeter App 保持在两个 Pod 副本数,开启了 ImagePullPolicy Always 的策略,并暴露了 60000 端口。

Always 会保证,就算 Image 不发生更改,也会强制拉取同步一次最新的镜像,相应的代价就是让容器重启的时间变得更长。

一般看到这个 Deployment 我们脑子里的画面是这样的:

然而 Deployment 操作的对象并不是 Pod,而是 ReplicaSet,所以对应关系其实是这样的。

Deployment 通过 ReplicaSet 间接去管理每个 Pod 所属的版本,并维护 Pod 的数量。

当 Pod Running 状态的数量与 Replicas 设置不一样时,就会发生对应的水平伸缩。

Rollout

所以,结合上面那张图,我们再来理解 Deployment 的滚动更新就不难了。

Deployment 会新建一个 ReplicaSet 去增加 Pod 的数量,并减少旧 ReplicaSet Pod 的数量。

这个增减的过程会保持总数恒定在 Replicas 的值,也就是我们的滚动更新。

旧的 ReplicaSet 缩减完毕后,并不会删除,方便做回滚。

查看 Deployment 的历史版本:

kubectl rollout history deployment/jmeter

回滚到指定的版本:

kubectl rollout undo deployment/jmeter --to-revision=v1

讲到这里,一个有意思的问题就出现了。

Replicas=1 的 Deployment 跟 1 个 Pod 有什么区别呢?

当 Pod 异常重启的时候,只会在原来被调度的 Node 上重启,哪怕这个 Node 宕机。

而 Deployment 会在 Pod 异常重启的时候,根据策略去选择最优的 Node 节点调度,哪怕 Replicas 只有 1 个。

......

未完待续,有空就开更。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞
少年 云原生系列专题分享合集 中提及了此贴 08月16日 10:34

今天也是认真阅读半懵的一天🐷

” Deployment 会新建一个 ReplicaSet 去增加 Pod 的数量,并减少旧 ReplicaSet Pod 的数量。

这个增减的过程会保持总数恒定在 Replicas 的值,也就是我们的滚动更新。

旧的 ReplicaSet 缩减完毕后,并不会删除,方便做回滚。“

有以下几个问题没太明白:
1、图中的虚框想表达什么意思呢,例如:是 POD 节点有问题了,如重启了,实际上可能不存在么
2、“Deployment 会新建一个 ReplicaSet ” ,Deployment 在什么情况下会新建 ReplicaSet
3、如果所有的 POD 都失效了,ReplicaSet 会自动检测到,然后值为 0 么

从上文理解,在 Deployment 与 POD 之间增加 ReplicaSet 就是为了灵活管理 POD,从而使云存储的选择更灵活,对用户来说更可靠,也更快。

简11 回复
  1. 虚框的 Pod 代表已被删除,因为这里 Replicas=2,所以新 ReplicaSet 增一个实框 Pod,旧 ReplicaSet 就会删一个 Pod,使得实框 Pod 的总数恒定为 2。
  2. Deployment 发生变更,ReplicaSet 是有个唯一 hash 做版本区分的。
  3. 失效多少个 Pod,ReplicaSet 就会自动拉起多少个 Pod。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册