如何用Kubernetes完成零停机部署 How to archive zero downtime deployments in Kubernetes | Cozi

标签: | 发表时间:2022-01-15 16:38 | 作者:
出处:https://cozi.dev

当您需要等到深夜才能在生产中部署您的应用程序时,情况会更糟,因为当部署后发生短暂的停机时间时,您害怕破坏用户的体验。
经过漫长的工作日后,您应该睡个好觉,所以让我们找出解决方案。

对于正常的应用,我们只需要做 3 个简单的步骤:

  • 定义就绪探测
  • 添加容器生命周期 preStop 挂钩
  • 收听 SIGTERM 信号

定义就绪探测

kubelet 在您的容器运行后发送请求,但您的应用程序可能还没有准备好接收请求。如何告诉 kubelet 等到您的应用程序准备好或在您的应用程序关闭时停止发送请求。答案是 就绪探测,让我们查看您的部署的示例配置:

     ...
containers:
  - name: my_web_app
    readinessProbe:
      httpGet:
        path: /health # your health check api
        port: 8080 # your container port
      initialDelaySeconds: 5 # delay 5s before send first request to check
      periodSeconds: 2 # send check request every 2s
      successThreshold: 1 # success when the response has a status code greater than or equal to 200 and less than 400
      failureThreshold: 1 # otherwise failure
...

添加容器生命周期 preStop 挂钩

您应该等待 15 秒,让 kubelet 更新路由以将请求发送到另一个 pod。默认情况下,k8s 在强制杀死你的应用程序之前等待 30 秒,所以你应该使用带有选项的 preStop钩子: terminationGracePeriodSeconds

     ...
terminationGracePeriodSeconds: 60 # wait 60 seconds before force killing your app, increase it if you need more time
containers:
  - name: my_web_app
    ...
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 15"] # sleep 15 seconds before sending SIGTERM to container and let kubelet update routing
...

收听 SIGTERM 信号

最后,听 SIGTERM 信号完成当前请求,关闭你的应用程序和关闭数据库连接等。这是一个 golang 示例:

     ...
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)

<-quit // blocks util receive signal
// finish current requests
// close DB connection
// shutdown app

如何测试?

您可以安装 HTTP 测试工具,如 vegeta以及 jq以在终端中格式化报告

示例命令:

     jq -ncM 'while(true; .+1) | {method: "GET", url: "http://localhost:30000?delay=5"}' | \
  vegeta attack -rate=200/s -lazy -format=json -duration=30s | \
  tee results.bin | \
  vegeta report

my_web_app然后通过以下命令触发强制 k8s 更新部署:

     kubectl patch deployment my_web_app -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

您可能会收到这份报告:

     Requests      [total, rate, throughput]         3000, 100.03, 99.05
Duration      [total, attack, wait]             30.287s, 29.99s, 297.897ms
Latencies     [min, mean, 50, 90, 95, 99, max]  198.877ms, 363.615ms, 309.861ms, 381.551ms, 802.951ms, 1.988s, 2.692s
Bytes In      [total, mean]                     71244000, 23748.00
Bytes Out     [total, mean]                     0, 0.00
Success       [ratio]                           100.00%
Status Codes  [code:count]                      200:3000
Error Set:

结论

我希望你能找到一些有用的东西来简化你的日常部署任务。

参考

相关 [kubernetes how to] 推荐:

如何用Kubernetes完成零停机部署 How to archive zero downtime deployments in Kubernetes | Cozi

- -
当您需要等到深夜才能在生产中部署您的应用程序时,情况会更糟,因为当部署后发生短暂的停机时间时,您害怕破坏用户的体验. 经过漫长的工作日后,您应该睡个好觉,所以让我们找出解决方案. 对于正常的应用,我们只需要做 3 个简单的步骤:. 添加容器生命周期 preStop 挂钩. kubelet 在您的容器运行后发送请求,但您的应用程序可能还没有准备好接收请求.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

How to configure autoscaling on docker swarm? - Stack Overflow

- -
This will involve a lot of scripting but the idea is to monitor the cluster for CPU / Memory / Network usage (with.

Kubernetes学习(Kubernetes踩坑记)

- - Z.S.K.'s Records
记录在使用Kubernetes中遇到的各种问题及解决方案, 好记性不如烂笔头. prometheus提示 /metrics/resource/v1alpha1 404. 原因: 这是因为[/metrics/resource/v1alpha1]是在v1.14中才新增的特性,而当前kubelet版本为1.13.

kubernetes移除Docker?

- -
两周前,Kubernetes在其最新的Changelog中宣布1.20之后将要弃用dockershime,也就说Kubernetes将不再使用Docker做为其容器运行时. 这一消息持续发酵,掀起了不小的波澜,毕竟Kubernetes+Docker的经典组合是被市场所认可的,大量企业都在使用. 看上去这个“弃用”的决定有点无厘头,那么为什么Kubernetes会做出这样的决定.

读书笔记 - How Google Test Software

- - CSDN博客研发管理推荐文章
(《谷歌如何测试软件》)的确为神秘谷歌公司揭开一层面纱,讲到了谷歌的代码文化和测试文化,讲到了角色划分,职责划分,测试种类划分,讲到优秀的不同角色的人应该具有什么样子的,讲到测试的创新和工具,还有大量的人物访谈. 这里的笔记主要包含:个人感兴趣的,值得备忘的,需要后续关注的东西记录.

How To Be Successful (如何成功)- Sam Altman

- -
I’ve observed thousands of founders and thought a lot about what it takes to make a huge amount of money or to create something important. Everything here is easier to do once you’ve already reached a baseline degree of success (through privilege or effort) and want to put in the work to turn that into outlier success.

Kubernetes 完全教程

- - 午夜咖啡
经过一个阶段的准备,视频版本的 《Kubernetes 完全教程》出炉了. 课程一共分为七节,另外有一节 Docker 预备课,每节课大约一个多小时. 目标是让从没接触过 Kubernetes 的同学也能通过这个课程掌握 Kubernetes. 为什么要学习 Kubernetes. 在介绍课程之前,先说说为什么要学习 Kubernetes 以及什么人需要学习 Kubernetes.

Kubernetes 监控详解

- - DockOne.io
【编者的话】监控 Kubernetes 并不是件容易的事. 本文介绍了监控 Kubernetes 的难点、用例以及有关工具,希望可以帮助大家进一步了解监控 Kubernetes. 如果想要监控 Kubernetes,包括基础架构平台和正在运行的工作负载,传统的监控工具和流程可能还不够用. 就目前而言,监控 Kubernetes 并不是件容易的事.

Kubernetes 切换到 Containerd

- - bleem
由于 Kubernetes 新版本 Service 实现切换到 IPVS,所以需要确保内核加载了 IPVS modules;以下命令将设置系统启动自动加载 IPVS 相关模块,执行完成后需要重启. 重启完成后务必检查相关 module 加载以及内核参数设置:. 1.2、安装 Containerd. Containerd 在 Ubuntu 20 中已经在默认官方仓库中包含,所以只需要 apt 安装即可:.