Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【TKE团队】Kubernetes 服务部署最佳实践(二) 如何提高服务可用性

【TKE团队】Kubernetes 服务部署最佳实践(二) 如何提高服务可用性

原创
作者头像
imroc
发布于 2020-06-19 13:50:00
发布于 2020-06-19 13:50:00
1.2K0
举报

引言

上一篇 文章我们围绕如何合理利用资源的主题做了一些最佳实践的分享,这一次我们就如何提高服务可用性的主题来展开探讨。

怎样提高我们部署服务的可用性呢?K8S 设计本身就考虑到了各种故障的可能性,并提供了一些自愈机制以提高系统的容错性,但有些情况还是可能导致较长时间不可用,拉低服务可用性的指标。本文将结合生产实践经验,为大家提供一些最佳实践来最大化的提高服务可用性。

如何避免单点故障?

K8S 的设计就是假设节点是不可靠的。节点越多,发生软硬件故障导致节点不可用的几率就越高,所以我们通常需要给服务部署多个副本,根据实际情况调整 replicas 的值,如果值为 1 就必然存在单点故障,如果大于 1 但所有副本都调度到同一个节点了,那还是有单点故障,有时候还要考虑到灾难,比如整个机房不可用。

所以我们不仅要有合理的副本数量,还需要让这些不同副本调度到不同的拓扑域(节点、可用区),打散调度以避免单点故障,这个可以利用 Pod 反亲和性来做到,反亲和主要分强反亲和与弱反亲和两种。

先来看个强反亲和的示例,将 dns 服务强制打散调度到不同节点上:

代码语言:txt
AI代码解释
复制
affinity:
 podAntiAffinity:
   requiredDuringSchedulingIgnoredDuringExecution:
   - labelSelector:
       matchExpressions:
       - key: k8s-app
         operator: In
         values:
         - kube-dns
     topologyKey: kubernetes.io/hostname
  • labelSelector.matchExpressions 写该服务对应 pod 中 labels 的 key 与 value,因为 Pod 反亲和性是通过判断 replicas 的 pod label 来实现的。
  • topologyKey 指定反亲和的拓扑域,即节点 label 的 key。这里用的 kubernetes.io/hostname 表示避免 pod 调度到同一节点,如果你有更高的要求,比如避免调度到同一个可用区,实现异地多活,可以用 failure-domain.beta.kubernetes.io/zone。通常不会去避免调度到同一个地域,因为一般同一个集群的节点都在一个地域,如果跨地域,即使用专线时延也会很大,所以 topologyKey 一般不至于用 failure-domain.beta.kubernetes.io/region
  • requiredDuringSchedulingIgnoredDuringExecution 调度时必须满足该反亲和性条件,如果没有节点满足条件就不调度到任何节点 (Pending)。

如果不用这种硬性条件可以使用 preferredDuringSchedulingIgnoredDuringExecution 来指示调度器尽量满足反亲和性条件,即弱反亲和性,如果实在没有满足条件的,只要节点有足够资源,还是可以让其调度到某个节点,至少不会 Pending。

我们再来看个弱反亲和的示例:

代码语言:txt
AI代码解释
复制
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: k8s-app
            operator: In
            values:
            - kube-dns
      topologyKey: kubernetes.io/hostname

注意到了吗?相比强反亲和有些不同哦,多了一个 weight,表示此匹配条件的权重,而匹配条件被挪到了 podAffinityTerm 下面。

如何避免节点维护或升级时导致服务不可用?

有时候我们需要对节点进行维护或进行版本升级等操作,操作之前需要对节点执行驱逐 (kubectl drain),驱逐时会将节点上的 Pod 进行删除,以便它们漂移到其它节点上,当驱逐完毕之后,节点上的 Pod 都漂移到其它节点了,这时我们就可以放心的对节点进行操作了。

有一个问题就是,驱逐节点是一种有损操作,驱逐的原理:

  1. 封锁节点 (设为不可调度,避免新的 Pod 调度上来)。
  2. 将该节点上的 Pod 删除。
  3. ReplicaSet 控制器检测到 Pod 减少,会重新创建一个 Pod,调度到新的节点上。

这个过程是先删除,再创建,并非是滚动更新,因此更新过程中,如果一个服务的所有副本都在被驱逐的节点上,则可能导致该服务不可用。

我们再来下什么情况下驱逐会导致服务不可用:

  1. 服务存在单点故障,所有副本都在同一个节点,驱逐该节点时,就可能造成服务不可用。
  2. 服务没有单点故障,但刚好这个服务涉及的 Pod 全部都部署在这一批被驱逐的节点上,所以这个服务的所有 Pod 同时被删,也会造成服务不可用。
  3. 服务没有单点故障,也没有全部部署到这一批被驱逐的节点上,但驱逐时造成这个服务的一部分 Pod 被删,短时间内服务的处理能力下降导致服务过载,部分请求无法处理,也就降低了服务可用性。

针对第一点,我们可以使用前面讲的反亲和性来避免单点故障。

针对第二和第三点,我们可以通过配置 PDB (PodDisruptionBudget) 来避免所有副本同时被删除,驱逐时 K8S 会 "观察" nginx 的当前可用与期望的副本数,根据定义的 PDB 来控制 Pod 删除速率,达到阀值时会等待 Pod 在其它节点上启动并就绪后再继续删除,以避免同时删除太多的 Pod 导致服务不可用或可用性降低,下面给出两个示例。

示例一 (保证驱逐时 nginx 至少有 90% 的副本可用):

代码语言:txt
AI代码解释
复制
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 90%
  selector:
    matchLabels:
      app: zookeeper

示例二 (保证驱逐时 zookeeper 最多有一个副本不可用,相当于逐个删除并等待在其它节点完成重建):

代码语言:txt
AI代码解释
复制
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: zookeeper

如何让服务进行平滑更新?

解决了服务单点故障和驱逐节点时导致的可用性降低问题后,我们还需要考虑一种可能导致可用性降低的场景,那就是滚动更新。为什么服务正常滚动更新也可能影响服务的可用性呢?别急,下面我来解释下原因。

假如集群内存在服务间调用:

当 server 端发生滚动更新时:

发生两种尴尬的情况:

  1. 旧的副本很快销毁,而 client 所在节点 kube-proxy 还没更新完转发规则,仍然将新连接调度给旧副本,造成连接异常,可能会报 "connection refused" (进程停止过程中,不再接受新请求) 或 "no route to host" (容器已经完全销毁,网卡和 IP 已不存在)。
  2. 新副本启动,client 所在节点 kube-proxy 很快 watch 到了新副本,更新了转发规则,并将新连接调度给新副本,但容器内的进程启动很慢 (比如 Tomcat 这种 java 进程),还在启动过程中,端口还未监听,无法处理连接,也造成连接异常,通常会报 "connection refused" 的错误。

针对第一种情况,可以给 container 加 preStop,让 Pod 真正销毁前先 sleep 等待一段时间,等待 client 所在节点 kube-proxy 更新转发规则,然后再真正去销毁容器。这样能保证在 Pod Terminating 后还能继续正常运行一段时间,这段时间如果因为 client 侧的转发规则更新不及时导致还有新请求转发过来,Pod 还是可以正常处理请求,避免了连接异常的发生。听起来感觉有点不优雅,但实际效果还是比较好的,分布式的世界没有银弹,我们只能尽量在当前设计现状下找到并实践能够解决问题的最优解。

针对第二种情况,可以给 container 加 ReadinessProbe (就绪检查),让容器内进程真正启动完成后才更新 Service 的 Endpoint,然后 client 所在节点 kube-proxy 再更新转发规则,让流量进来。这样能够保证等 Pod 完全就绪了才会被转发流量,也就避免了链接异常的发生。

最佳实践 yaml 示例:

代码语言:txt
AI代码解释
复制
        readinessProbe:
          httpGet:
            path: /healthz
            port: 80
            httpHeaders:
            - name: X-Custom-Header
              value: Awesome
          initialDelaySeconds: 10
          timeoutSeconds: 1
        lifecycle:
          preStop:
            exec:
              command: ["/bin/bash", "-c", "sleep 10"]

健康检查怎么配才好?

我们都知道,给 Pod 配置健康检查也是提高服务可用性的一种手段,配置 ReadinessProbe (就绪检查) 可以避免将流量转发给还没启动完全或出现异常的 Pod;配置 LivenessProbe (存活检查) 可以让存在 bug 导致死锁或 hang 住的应用重启来恢复。但是,如果配置配置不好,也可能引发其它问题,这里根据一些踩坑经验总结了一些指导性的建议:

  • 不要轻易使用 LivenessProbe,除非你了解后果并且明白为什么你需要它,参考 Liveness Probes are Dangerous
  • 如果使用 LivenessProbe,不要和 ReadinessProbe 设置成一样 (failureThreshold 更大)
  • 探测逻辑里不要有外部依赖 (db, 其它 pod 等),避免抖动导致级联故障
  • 业务程序应尽量暴露 HTTP 探测接口来适配健康检查,避免使用 TCP 探测,因为程序 hang 死时, TCP 探测仍然能通过 (TCP 的 SYN 包探测端口是否存活在内核态完成,应用层不感知)

参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
电脑桌面整理软件
腾讯桌面整理本来是腾讯电脑管家中的一款扩展应用,但是如今已经剥离出来可以单独下载了。软件本身十分轻量化,没有广告没有捆绑,功能也十分单一,就是给桌面图标分类。
季春二九
2023/03/22
2K0
电脑桌面整理软件
VisioPro2019下载及安装教程
下面我们详解安装最新版Visio: 首先,下载链接(百度网盘):pan.baidu.com/s/12Zd8zX_hostaz-SHdSZGcw
荣仔_最靓的仔
2021/02/02
2.7K1
VisioPro2019下载及安装教程
清理C盘非必要文件(从认识到C盘空间管理)
1:C盘与其它盘符的关系 C盘是计算机的硬盘分区之一,同我们计算机系统中可以看见的其它盘符一样,都可以进行存储数据。 说明一下D,E盘这些类似的盘符只是计算机系统中可见的盘,但是在实际的物理状态下是不存在的。都是逻辑上建立的分区,所谓逻辑不过就是虚拟出来的而已。 我们的电脑硬盘需要进行分区,才可以进行合理有效的利用。在分区的时候我们一般进行确定一个基本的主分区,然后就是扩展分区,扩展分区下面我们就进行逻辑划分,逻辑划分出来的就是D盘,E盘,F盘这些。 我们的目前的磁盘啊只能进行划分4个主分区,为什么呢?因为硬盘只提供分区表64个字节的存储空间,而每个分区的参数只占据16个字节,所以我们就只能最多划分4个主分区。然后扩展分区就是和主分区和不能大于四。当主分区划分满后,就没有扩展分区了。但是对于系统的设计效率,或者计算机及数据执行的效率而讲,我们这样做显然不明智。
兰舟千帆
2022/07/16
5.2K0
清理C盘非必要文件(从认识到C盘空间管理)
modelsim安装_Modelsim10.5安装教程
2. 打开解压后的文件夹,鼠标右击“modelsim-win64-10.5”,选择“以管理员身份运行”。
全栈程序员站长
2022/08/31
2.9K0
modelsim安装_Modelsim10.5安装教程
运维:C盘告急?一招让Chrome缓存搬家,小白也能轻松搞定!
本次迁移到D:\Program Files\Google 目录,迁移完成后,删除桌面的Google快捷方式,然后重新创建快捷方式。
小明互联网技术分享社区
2025/04/23
1530
运维:C盘告急?一招让Chrome缓存搬家,小白也能轻松搞定!
一个强迫症的电脑上(桌面篇)
这张好康的壁纸来自一个神奇的软件,wallpaper engine,想必绅士们都知道(咳咳咳,我的壁纸年龄分级从来都是大众级哈。)
小孙同学
2022/01/17
1.7K0
一个强迫症的电脑上(桌面篇)
禁止QQ轻聊版升级到TIM
大概是因为 QQ 轻聊版即将被抛弃,最近腾讯开始强制版本升级。即便在设置中选择了“有安全更新时提醒我,不自动安装”,QQ 轻聊版还是会自动下载 TIM 安装包并且自卸载升级到 TIM。reizhi 还是比较习惯轻聊版的手感,经过一番研究找到了禁止升级的方法,并且不需要任何第三方软件,也不需要更改路由器的设置。
reizhi
2022/09/26
1K0
禁止QQ轻聊版升级到TIM
电脑桌面图标点击打不开怎么办_双击桌面图标打开的是属性
大家好,又见面了,我是你们的朋友全栈君。 在网上我们经常会看到有人提问“怎样解决笔记本电脑双击桌面图标打不开”的问题,引发该问题的原因是exe文件的关联损坏了,当然系统中毒也可能导致此现象,那么我
全栈程序员站长
2022/09/21
3.1K0
电脑桌面图标点击打不开怎么办_双击桌面图标打开的是属性
MATLAB2019a
magnet:?xt=urn:btih:733DFBA6CCC23DB9FFD6287C169A15664897E78D
小文要打代码
2024/10/16
830
MATLAB2019a
程序员的强迫症–如何让电脑桌面变得非常干净?
作为一枚有强迫症的程序员是忍受不了这么乱的桌面,接下来教你们整理电脑桌面又不妨碍办公,还能装装逼,让电脑小白使用你的电脑不知如何下手。
忆想不到的晖
2020/07/15
2.3K0
程序员的强迫症–如何让电脑桌面变得非常干净?
Win11怎么把C盘分成几个盘?
很多Windows11用户会发现,系统默认只给电脑分配了一个C盘,而C盘不仅是系统盘,还是软件的默认安装位置,并且个人数据也是保存在C盘。这种情况下,电脑使用时间久了会遇到一个常见问题:C盘空间不足或是需要将C盘分成多个部分以便更好地管理文件和数据。本文将详细介绍如何在Win11系统中将C盘分成多个分区,帮助您轻松完成磁盘管理。
用户7704932
2024/09/04
3300
Win11怎么把C盘分成几个盘?
电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
大家平常为了方便经常会在桌面上保存各种各样的文件,有些桌面文件可能会比较大从而占用C盘的磁盘空间,而系统盘我们在分配的时候,一般只有60-100G左右,时间长了我们的系统盘就会出现磁盘容量不足的情况,其实我们可以将桌面的文件路径修改为其它的磁盘。
小明互联网技术分享社区
2022/04/07
2.4K0
电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
Project 2010 软件下载安装详细教程
Microsoft Project是一款由微软公司开发的项目管理类软件,适用于互联网、房地产、活动策划等各行各业。
软件小栈
2022/10/17
9370
Project 2010 软件下载安装详细教程
Win11 桌面快捷方式未全部显示的诡异现象及解决方法
最近在使用我的电脑时,开机后,桌面的快捷方式总感觉少了很多,怀疑是之前使用了 360 桌面助手导致的,但是我没有证据。现在已经没有使用了,还是这样,所以也不太确定。先来看看现在出现问题的情况,现在桌面上总共有 38 个项目(一列 14 个):
独立观察员
2023/03/08
2.9K0
Win11 桌面快捷方式未全部显示的诡异现象及解决方法
Windows10美化小记
1.需要的软件。 ①软媒魔方桌面,绿色版。(提供下载) ②水滴时钟桌面。(提供下载和时间皮肤) ③TransucentTB(透明任务栏,提供下载按需使用) ④Wallpaper Engine(动态壁纸软件,按需求下载,我是STEAM18软妹币入正的,所以不提供下载。可以去度娘搜索pj版本) ⑤Pure轻语图标包,这里使用了 【Pure 轻雨 图标包】 的图标文件。@森雨Plus ,希望大佬不要介意
叮当叮
2020/04/20
1.1K0
Windows10美化小记
Project 2013 软件下载安装详细教程
project2013官方版是一款由微软推出的多功能项目管理软件。microsoft project 2013中文版支持为任务分配资源、跟踪进度、管理预算和分析工作量等功能,能够协助项目经理发展计划。
软件小栈
2022/10/17
1.2K0
Project 2013 软件下载安装详细教程
苹果电脑桌面怎么清理 苹果电脑桌面文件太多怎么办
若想提高工作效率,必须做好桌面文件管理。苹果电脑桌面图标太多,文件排列杂乱无章,会严重影响用户的工作效率。桌面文件管理得当,节省了文件归档和检索的时间,工作效率自然会得到提高。有关苹果电脑桌面怎么清理,苹果电脑桌面文件太多怎么办的问题,本文将进行详细介绍。
逐梦岛
2024/08/13
1.2K1
苹果电脑桌面怎么清理 苹果电脑桌面文件太多怎么办
(图文)U盘安装原版WIN10系统
首先 我们先去下载好WIN10 64的原版系统 那么去哪里下呢 不用看 首选肯定是MSDN的了 直接百度MSDN 或者 I TELL YOU 都可以进入都官网 【这里直接提供一个镜像下载】:
Erwin
2019/12/31
1.2K0
ubuntu20.04安装pycharm2021.3.3_ubuntu镜像安装
https://www.jetbrains.com/pycharm/download/#section=linux 这里我下载的是社区开源免费版
全栈程序员站长
2022/09/27
6910
ubuntu20.04安装pycharm2021.3.3_ubuntu镜像安装
IntelliJ IDEA 2019软件下载和安装教程
IntelliJ IDEA 2019是一款非常好用的编程工具,拥有强大的静态代码分析和人体工程学设计,整合了智能代码助手、代码自动提示、J2EE支持、Ant、JUnit、CVS整合、代码审查等功能,帮助用户更加简单轻松地完成开发设计工作。
肉肉软件安装
2022/11/04
1.7K0
IntelliJ IDEA 2019软件下载和安装教程
推荐阅读
相关推荐
电脑桌面整理软件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档