网站首页 > 技术教程 正文
20大进阶架构专题每日送达
来源 | https://vflong.github.io/sre/k8s/2020/02/16/zero-downtime-server-updates-for-your-kubernetes-cluster.html
Kubernetes 集群的滚动更新
在 Kubernetes 集群的生命周期中的某个时候,您将需要对基础节点执行维护。这可能包括程序包更新、内核升级或部署新的 VM 镜像。在 Kubernetes 中,被视为“自愿中断”(Voluntary Disruption)。
这是一个分为 4 部分的博客系列的一部分:
本文
优雅地关闭 Pod
延迟关闭以等待 Pod 删除传播
使用 PodDisruptionBudge 避免中断
在本系列中,我们将介绍 Kubernetes 提供的所有工具,以实现集群中底层工作节点的零宕机时间更新。
说明问题
我们将从原生的方法开始,找出该方法的挑战和潜在风险,并逐步构建解决我们在整个系列中发现的每个问题。我们将完成一个配置,该配置利用生命周期钩子、就绪探针以及 Pod 中断预算来实现零停机时间部署。
首先,我们来看一个具体的例子。假设我们有一个两个节点的 Kubernetes 集群,该集群运行一个应用程序,其中两个 Pod 支持 Service 资源:
我们的起点是两个 Nginx Pod 和在两个节点 Kubernetes 集群上运行的 Service。
我们要先升级集群中两个底层工作程序节点的内核版本。我们该如何做?原生的方式是使用更新的配置启动新节点,然后在启动新节点后关闭旧节点。尽管这样可行,但是这种方法存在一些问题:
当关闭旧节点时,您将会同时将在旧节点上运行的 Pod 下线。如果 Pod 需要清理以正常关闭该怎么办?底层 VM 技术可能不会等待清理过程。
如果您同时关闭所有节点怎么办?将 Pod 重新启动到新节点时,您可能会短暂中断。
我们想要的是一种从旧节点上优雅迁移 Pod 的方法,以确保在对节点进行更改时,没有任何工作负载运行。或者,如实例中所示,如果要完全替换集群(例如替换 VM 镜像),我们希望将工作负载从旧节点迁移到新节点。在这两种情况下,我们都希望避免将新 Pod 调度到旧节点,并且将所有正在运行的 Pod 从其上逐出。我们可以使用 kubectl drain 命令实现它。
重新调度节点上的 Pod
Drain 操作实现了将所有 Pod 重新调度到其他节点的目的。在 drain 操作期间,该节点被标记为不可调度(NoSchedule
污点)。这样可以防止新的 Pod 被调度到该节点。之后,drain 操作开始从节点驱逐 Pod,通过将TERM
信号发送到 Pod 的底层容器来关闭当前在该节点上运行的容器。
尽管 kubectl drain
可以优雅处理 Pod 驱逐,但仍存在两个因素可能会在 drain 操作过程中导致服务中断:
您的应用程序服务需要能够优雅处理 TERM 信号。驱逐 Pod 时,Kubernetes 将
TERM
信号发送容器,然后在发出信号后将容器强制关闭之前等待可配置时间,以使用容器关闭。但是,如果您的容器无法正常处理信号,则在工作期间(例如提交数据库事务),您仍然可以不干净地关闭 Pod。您将失去为应用程序提供服务的所有 Pod。在新节点上启动新容器时,您的服务可能会停机,或者,如果未使用控制器部署 Pod,则它们可能永远无法重启。
避免宕机
为了最大程度地减少因 drain 节点等自愿性中断而导致的停机时间,Kubernetes 提供以下中断处理功能:
优雅终止
生命周期钩子
PodDisruptionBudgets
在本系列的其余部分中,我们将使用 Kubernetes 的这些功能来减轻驱逐时间对服务的干扰。为了使后续操作更容易,我们将在上面的示例中使用以下资源配置:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
targetPort: 80
port: 80
此配置是管理多个 Nginx Pod(在我们的示例中是两个)的 Deployment 资源的最小示例。该资源将用于维护集群中的两个 Nginx Pod。此外,配置将提供可用于访问集群中 Nginx Pod 的 Service 资源。
我们将在本系列的整个过程中逐步增加它,以构建最终配置,以实现 Kubernetes 提供的所有功能,以最大程度地减少维护操作期间的停机时间。这是我们的路线图:
优雅地关闭 Pod
延迟关闭以等待 Pod 删除传播
使用 PodDisruptionBudge 避免中断
继续阅读下一篇文章,了解如何利用生命周期钩子来优雅关闭 Pod。
原文地址:
https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33
之前,给大家发过三份Java面试宝典,这次新增了一份,目前总共是四份面试宝典,相信在跳槽前一个月按照面试宝典准备准备,基本没大问题。
《java面试宝典5.0》(初中级)
《350道Java面试题:整理自100+公司》(中高级)
《资深java面试宝典-视频版》(资深)
《Java[BAT]面试必备》(资深)
分别适用于初中级,中高级,资深级工程师的面试复习。
内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。
看到这里,证明有所收获
猜你喜欢
- 2024-10-13 nginx的集群原理与常用的调度算法
- 2024-10-13 自己动手在阿里云部署 K8S 集群(阿里云 slb k8s)
- 2024-10-13 Kubernetes集群的自动化部署和管理
- 2024-10-13 最新Minio+Docker+Nginx多机集群(多台nginx集群方案)
- 2024-10-13 基于 consul + nginx 的Spring boot微服务集群部署
- 2024-10-13 k8s集群中部署nginx(k8s nginx ingress)
- 2024-10-13 LVS+keepalived+nginx实现高性能高可用负载均衡集群--第二部分
- 2024-10-13 高级架构技术点之安装redis 集群(redis 安装配置)
- 2024-10-13 K8s Helm部署 ES集群 &Kibana 收集展示日志
- 2024-09-30 认识Kubernetes以及搭建Kubernetes集群
你 发表评论:
欢迎- 最近发表
-
- Oracle 在其新的 Linux 内核中引入了热补丁功能
- CentOS 7.6下安装Oracle 11.2.0.4
- ORACLE体系 - 2(oracle体系讲解)
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- Hadoop自学系列集(二) ---- CentOS下安装JDK
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 搭建Oracle数据库服务器(oracle服务器创建用户)
- OGG同步到Kafka(oggforbigdata到kafka)
- oracle是什么软件?(oracle是干什么用的)
- 脚本化修改Oracle用户的密码以及执行sql(增删改查等)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)