会议流程

一、背景

K8S集群不停机升级_K8S不停机升级

Kubernetes 社区保持 3 个月一个版本的高频发布节奏。但是线上环境业务长期运行,任何变更出错都可能带来巨大的经济损失,升级对企业来说是重量级操作,紧跟社区更是几乎不可能,因此高频发布和稳定生产之间的矛盾需要容器团队去衡量和取舍。珍爱团队的Kubernetes 集群从2019-3-11建设至今,没有做过升级操作。

1.1 集群EOS停止服务

珍爱业务总共使用了9套K8S集群系统,集群版本过老或太低,云产商已经对EOS停止服务。

1.2集群现状

名字

当前版本

目标版本


腾讯云

互联网-生产

1.10.5

1.26.1



互联网-预发布

1.10.5

1.26.1



crm-预发布k8s

1.12.4

1.26.1



crm-生产k8s

1.12.4

1.26.1



互联网-日志收集-生产K8S

1.14.3

1.26.1

该版本为最新版本

华为云

cce-app-test

v1.21

1.25



cce-app-pre

v1.19

1.25



cce-app

v1.17

1.25



cce-ops-prod

v1.25

1.25

该版本为最新版本

业务和技术团队发展过程中,除了部署已有业务外,还有新业务的上线也有部署在集群中。为了适应业务容器化,日益攀升的容器比例,对 大规模集群稳定性性能的增强 ,集群升级也处于迫在眉睫。仔细查看腾讯云TKE 华为云CCE各个版本间的ChangeLog后 ,集群升级将解决如下问题:

  • 新集群做了 安全增加 修复了低版本的漏洞
  • 在大规模场景下,高版本集群进行了优化,升级后解决一系列性能瓶颈问题。
  • 高版本集群引入的新特性,降低服务器成本同时提高集群利用率,从而实现降低成本、提高效率的目标。
  • 公司内部维护多个不同版本集群,升级后能够减少集群版本碎片化的问题。
  • 使用集群管理平台对的K8S进行跨云管理,提高集群管理水平降低运维成本

1.3 旧版本出现的问题

  1. CoreDNS-1.3.1导致集群网络故障 ,属于已知BUG,高版本已解决
  2. 版本不同导致java-client报调用K8S-API失败

二、升级方案

原地升级

原地升级的优点是自动化操作便捷,并且通过适当的修改能够很好的保证容器的生命周期连续性;缺点是集群升级中对系统组件要求高,升级中存在中间态,并且一个组件重启失败可能影响后续其他组件升级,原子性差。

新建集群升级

替换升级的优点是原子性更强,逐步升级各个集群,升级过程不存在中间态,对业务安全和稳定性更有保障;缺点是集群升级工作量较大,对 pod 重启敏感度高的应用、有状态应用、单副本应用来说不是很友好。

2.1 方案对比:原地升级?or 替换升级?

升级方案

优点

缺点

对业务的影响

原地升级

操作简单

1.跨4-8个大版本,需要升级4-8次

2.升级过程中,K8S正常使用受影响

升级过程业务无法访问,业务中断

新建集群迁移

1.用户没有感知

2.新集群提供了性能更强,降本增效

工作量较大,迁移期间会存在2套K8S集群

对业务无影响,或影响极低

结论:对比后, 替换升级 对业务影响更低

2.2 域名解析切换

DNS 缓存有过期时间,流量切换后需要等待 10 分钟左右才能生效。当在新集群中进行业务回滚时,这个方案有存在延迟,不推荐。

2.3 不停机切换

两个集群的节点加入到同一个 SLB 的同一个端口中,通过修改两个集群所占权重即可实现流量迁移。对于客户端来讲,访问的仍然是以前的 SLB ip 和 port,完全无感。推荐使用。

三、性能提升

3.1 组件升级

新组件coredns

  • 新域名解析组件coredns:1.14版本kube-dns升级为coredns。kube-dns 被弃用
  • coredns的3种解析场景,如下:


场景

链路

优点

缺点

是否自动生成解析

集群外解析

公网解析

链路长

适用公网

链路长

集群外解析

内网解析

链路较长

适用于内网

链路长

K8S集群内解析

源pod -> svc name -> 目标pod

1.解析记录自动注册到etcd中,适用于容器的服务调用

2. 架构精简链路短 的同时提升了网络性能。 | 无 | 是 |

CoreDNS的优势
  • CoreDNS 的优势有插件化、快速灵活、服务发现、简单等特点,同时比KubeDNS占用的内存更少 ,成为CNCF(云原生计算基金会)的毕业项目
  • 同时,CoreDNS的扩展性能够为不同规模和需求的K8s集群,使其更具弹性。

K8S集群不停机升级_K8S不停机升级_02

容器container

  • 使用container代替docker:1.24版本正式移除docker,containerd 在集群内调用链更短,组件更少,更稳定,占用节点资源更少。
  1. 镜像、容器的基本命令差异
  • 2.业务同学无需改动业务代码,可以无缝升级到container
  1. 容器日志的路径会修改为:
  • 容器日志路径变化:/var/lib/docker/containers/K8S集群不停机升级_K8S不停机升级_03CONTAINER_NAME`
  • 日志切割参数变化:log-opts
  • 日志盘挂载方式: /var/lib/docker -> /var/log/pods

3.2存储驱动升级

  • 1.存储驱动使用 overlay2 代替 过去的devicemapper
  • 在趣约会的实践过程中,业务有受到该驱动的影响。如:华为云docker 镜像存储驱动是 devicemapper,这个inodes 的大小受驱动、磁盘空间大小、文件格式限制,华为云的方式是为每一个pod 限制了10G的 空间大小,而且用的是 ext4的 ,inodes 数值只有655360。

3.3 更高效的内核转发

  • Kube-proxy代理模式:使用ipvs代替iptables,IPVS成为大规模集群场景下更优的方案选择。
  • 超过 1000 服务的规模下,kube-proxy 的 IPVS 模式会有更好的性能表现,相同的成本达到了更强大的性能,提高了集群的效率
  • iptables基于内核规则列表,service数量越多性能越差,ipvs使用hash表,同步规则的效率和网络吞吐量更高

ipvs和iptables的数据对比

通过 响应时间CPU消耗 的实验数据 数据对比


K8S集群不停机升级_K8S不停机升级_04

K8S集群不停机升级_K8S不停机升级_05

     

  • 平均响应时间:服务数量大于1000时,ipvs出现更好的性能表现
  • CPU消耗对比:服务数量大于10000个时,iptables消耗单核CPU的0.9,而ipvs仅为0.6

3.4 网络插件升级为VPC网络

我们目前网络插件为GlobalRouter,该网络插件在系统上进行网络转发,会利用内核和CPU转发会有性能消耗。新集群会用云产商的VPC网络能力,性能更强,损耗更低。

网络插件/现状

是否升级

性能提升

腾讯云

GlobalRouter

VPC-CNI 同比 GlobalRouter

有10%的性能提升

华为云

VPC网络


网络需求

  • 按照最少5倍的网络规模做的需求

环境

网络现状

新网络模型的IP需求

腾讯云TKE

预发布环境

255个IP

2550个IP

腾讯云TKE

生产环境

255个IP

7140个IP

环境

网络现状

新网络模型的IP需求

华为云CCE

测试环境

255个IP

4080个IP

华为云CCE

预发布环境

255个IP

2550个IP

华为云CCE

生产环境

255个IP

7140个IP

  • 当前 VPC-CNI 模式的子网不建议与其他云上资源共用(如云服务器、负载均衡等)。
  • 集群内的节点需要和子网处于相同可用区,如果节点可用区与容器子网不在相同可用区,Pod 将无法调度。
  • 节点上可调度的 VPC-CNI 模式的 Pod 数量受限于节点所支持插入弹性网卡能绑定 IP 的最大数量和网卡数量。配置越高的机器可插入的弹性网卡数量越多,可以通过查看节点的 Allocatable 来确认。

3.5 安全性加强

安全增强和调度优化

类别

优化项目

详情

安全增强

1. kube-scheduler 和 kube-controller-manager 暴露了非安全的健康检查端口

2. apiserver 不再监听非安全端口


调度优化

引入了新的调度器打分插件 NodeResourcesFit,用于代替 NodeResourcesLeastAllocatedNodeResourcesMostAllocatedRequestedToCapacityRatio 这三个插件。

NodeResourcesFit 基于资源的利用率来为节点计分,优选分配比率较高的节点。

调度优化

1. 优化调度均衡性,工作负载实例数缩容时仍保持跨AZ分布均衡。优化节点污点场景下负载调度的性能。

2. 遗留的调度器配置方式及相关参数 policy-config-file, policy-configmap, policy-configmap-namespace 和 use-legacy-policy-config 在 1.23 中被移除,必须使用 KubeSchedulerConfiguration 配置文件。

KubeSchedulerConfiguration 支持定制kube-scheduler的行为,可扩展性更好

3.6 新的功能

  1. startupProbe:启动探针,启动探针检测成功后才能继续执行存活检测。
  • 对于应用需要更长的启动时间,这时候既不想重启应用也不想让请求访问进来,可以设置启动探测给足够的启动时间保证应用启动成功。
  1. gGPU(GPU虚拟化能力):支持多个容器共享 GPU 卡并支持容器间算力和显存精细隔离,在精细切分 GPU 资源的基础上,在最大程度保证业务稳定的前提下,提高 GPU 使用率,帮助客户大幅度节约 GPU 资源成本。
  • 3.VPA(Vertical Pod Autoscaler):支持就地 pod 垂直扩展,可以在不重启 pod 的情况下调整 pod 的配置大小,特别是资源限制。(1.27 开始 )

3.7 成本效益

升级项

优点

性能提升

CoreDNS

内存占用更少,扩展性更好


Container

链路更短,性能提升,组件更少,占用节点资源更少

性能提升

存储驱动升级

overlay2

inodes数值更大

数值扩大5倍

ipvs内核转发

更优的性能方案

响应时间更短,单核CPU消耗更低

4ms->2ms,0.9->0.6

网络插件:VPC网络

少了一层网桥,网络转发性能更高

10%性能提升

新功能方案特性

qGPU

提高 GPU 使用率

成本更低

  • 综合3.1至3.6所述:通过提升集群资源使用率,降低服务器成本同时提高集群效率,达到降本增效的效果。

四、服务管理

  • 服务暴露方式过多,有nodeport、ingress、LoadBlancer、gateway等。升级完集群后,统一使用ingress;规划中

K8S集群不停机升级_K8S不停机升级_06

五、集群管理

K8S集群不停机升级_K8S不停机升级_07

  1. KubeSphere 提供了 Kubernetes 的多云与多集群管理,提供多云与多可用区的高可用
  • 2.运维角度:简化集群的持续集成、测试、审核、发布、升级与弹性扩缩容,提高集群管理水平
  • 3.开发角度:提供开箱即用的工具集,轻松上手K8S。所见即所得

成功案例