Day14-Kubernetes 那些事 - Deployment 与 ReplicaSet(二)

前言

昨天的文章介绍了 Deployment 以及 ReplicaSet 的基本介绍後,接下来要介绍如何撰写以及建立,废话不多说马上开始 Deployment 系列文的第二篇吧!

Deployment 结合 ReplicaSet 写法

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  replica: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 60
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: helloworld
        image: w5151381guy/helloworld
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 8080

看到 Deployment 的设定是不是觉得跟之前文章提到的 Replication Controller 非常接近呢?其实 Deployment 只多了几个在滚动更新的设定以及加上 ReplicaSet 的设定而已,这边就稍微讲一下这几个设定值吧!

首先可以看到这次的 apiVersion 的值不是 v1 而是 apps/v1 了,由於 K8s 针对 DeploymentRollingUpdateReplicaSet 等等设立了新的 apiVersion 值,通常 apps/v1 都是用来设定跟应用程序有关的架设,所以在 Deployment 这边记得要用 apps/v1 而不是 v1 喔!

spec 的地方有看到 strategy 这个新的设定值,这个主要是用来设定 Deployment 更新的策略,这里的 strategy.type 有两种设定:

  • RollingUpdate

    预设值,先建立新的 ReplicaSet 并控制新内容的 Pod ,待新 Pod 也可以正常运作,才会通知 ReplicaSet 将现有的 Pod 移除,由於过程中会有新旧两种 Pod 同时上线,因此会有一段时间是新旧内容会随机出现的情形发生。

    这边可以看到除了 type 之外还写了 maxSurge 以及 maxUnavailable,这两个设定值为滚动更新的过程中,接下来就来讲一下这两个设定主要的功能!

    • maxSurge:代表 ReplicaSet 可以产生比 Deployment 设定档中的 replica 所设定数量还多几个出来,多增加 Pod 的好处为在滚动更新的过程可以减少旧内容显示在页面上的机率。
    • maxUnavailable:代表在滚动更新的过程中,可以允许多少的 Pod 无法使用,假如 maxSurge 设定非 0 ,maxUnavailable 也要设定非 0。
  • Recreate

    先通知当前 ReplicaSet 把砍掉旧有的 Pod 後再产生新的 ReplicaSet 并控制新内容的 Pod ,由於先砍掉 Pod 才建立新的 Pod ,所以中间会有一段服务器无法连线的时间。

    也因为 Recreate 会砍掉重建,因此 Recreate 就无法像 RollingUpdate 设定 maxSurge 以及 maxUnavailable


讲完 Deployment 的更新流程设定後,接下来讲 Deployment 完成更新後的设定,这边有两种设定: minReadySeconds 以及 revisionHistoryLimit

  • minReadySeconds

    minReadySeconds 代表当新的 Pod 建立好并且在运行的 container 并没有 crash 的情况下,最少需要多久时间可以开始接受 Request ,预设为 0 秒代表当 Pod 一被建立起来就可以开始接受 Request ,假如今天 container 在刚运行的时候需要花时间做初始化,这时候就可以利用 minReadySeconds 让此 Pod 不会马上接受到 Request,这个为选填的设定。

  • revisionHistoryLimit

    每次 Deployment 在进行更新的时候都会产生一个新的 ReplicaSet 用来进行版本控制,在 Deployment 中这个专有名词叫 revision,所以这个设定就是要设定最多只会有多少个 revision,这个为选填的设定。

建立 Deployment

建立 Deployment 一样也是用 apply 这个参数建立。

建立完後一样可以下 get 参数来查看。

由於 Deployment 直接管理 ReplicaSet ,因此我们也可以查看 ReplicaSet 是否有被建立起来,这边读者可以看到每个 ReplicaSet 後方都有一小段 hash ,这边是 Deployment 在建立 ReplicaSet 的时候加进去的,这样之後就可以很方便地利用 ReplicaSet 进行 rollback 的动作。

由於 ReplicaSet 会直接管理 Pod 因此我们也可以查看 Pod 是否有正确的被建立到正确的数量。

一样可以试试看删除 Pod 看 ReplicaSet 是否有正确的重新建立一个新的 Pod 以符合我们设定好的数量。

建立好的 Deployment 一样可以在浏览器测试 Hello World 是否有正确的显示出来。

最後想要把整个 Pod 以及 ReplicaSet 删除的话就直接把 Deployment 删除即可。

小结

今天介绍了 Deployment 是如何撰写以及建立,感觉上 Deployment 可以做到非常多事情了,但其实笔者一直没有谈到 Deployment 是如何更新旗下的 Pod。

接下来就是 Deployment 系列文的最後一篇了,如果对於文章有任何问题都欢迎留言给我,那我们就下篇文章见喽~


<<:  [Day 16 - 小试身手] 用HTML、CSS、JS打造个人网站 (3)

>>:  Day 16 | 第一个 Flutter 专案

【Day 05】 实作 - 设置初始环境於 AWS 建置个人的 WordPress 网站

想了很久要针对哪个主题进行资料分析实作,後来想来想去决定选择最常见的『网站』来进行资料分析的实作,那...

[day29] - Angular Component to Web Component

後来发现 , 之前说明了 Vue . React Component 如何变成 Web Compon...

从零开始的8-bit迷宫探险【Level 12】把迷宫涂上喜欢的颜色

刚踏入黑森林的第一步,就吹来一股寒风。 「究竟,这是座什麽样的森林呢?」 「不管了,我想成为第一个...

全端入门Day28_後端程序撰写之一点的Golang

昨天Go弄出了Hello World,今天就来解释怎麽写的。 Golang入门一点 先贴上昨天写的程...

企划实现(13)

GOOGLE登入 第一步:在firebase添加一个新的专案 第二步:选取android专案 第三步...