一、背景
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 旧版本出现的问题
- CoreDNS-1.3.1导致集群网络故障 ,属于已知BUG,高版本已解决
- 版本不同导致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集群,使其更具弹性。
容器container
- 使用
container
代替docker:1.24版本正式移除docker,containerd 在集群内调用链更短,组件更少,更稳定,占用节点资源更少。
- 2.业务同学无需改动业务代码,可以无缝升级到container
- 容器日志的路径会修改为:
- 容器日志路径变化:/var/lib/docker/containers/CONTAINER_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消耗 的实验数据 数据对比
- 平均响应时间:服务数量大于1000时,ipvs出现更好的性能表现
- CPU消耗对比:服务数量大于10000个时,iptables消耗单核CPU的0.9,而ipvs仅为0.6
3.4 网络插件升级为VPC网络
我们目前网络插件为GlobalRouter,该网络插件在系统上进行网络转发,会利用内核和CPU转发会有性能消耗。新集群会用云产商的VPC网络能力,性能更强,损耗更低。
云 | 网络插件/现状 | 是否升级 | 性能提升 |
腾讯云 | 是 | VPC-CNI 同比 GlobalRouter 有10%的性能提升 | |
华为云 | 否 |
网络需求
- 按照最少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 基于资源的利用率来为节点计分,优选分配比率较高的节点。 |
调度优化 | 1. 优化调度均衡性,工作负载实例数缩容时仍保持跨AZ分布均衡。优化节点污点场景下负载调度的性能。 2. 遗留的调度器配置方式及相关参数 policy-config-file, policy-configmap, policy-configmap-namespace 和 use-legacy-policy-config 在 1.23 中被移除,必须使用 KubeSchedulerConfiguration 配置文件。 | KubeSchedulerConfiguration 支持定制 |
3.6 新的功能
- startupProbe:启动探针,启动探针检测成功后才能继续执行存活检测。
- 对于应用需要更长的启动时间,这时候既不想重启应用也不想让请求访问进来,可以设置启动探测给足够的启动时间保证应用启动成功。
- gGPU(GPU虚拟化能力):支持多个容器共享 GPU 卡并支持容器间算力和显存精细隔离,在精细切分 GPU 资源的基础上,在最大程度保证业务稳定的前提下,提高 GPU 使用率,帮助客户大幅度节约 GPU 资源成本。
- 3.VPA(Vertical Pod Autoscaler):支持就地 pod 垂直扩展,可以在不重启 pod 的情况下调整 pod 的配置大小,特别是资源限制。(1.27 开始 )
3.7 成本效益
升级项 | 优点 | 性能提升 |
CoreDNS | 内存占用更少,扩展性更好 | |
Container | 链路更短,性能提升,组件更少,占用节点资源更少 | 性能提升 |
存储驱动升级 overlay2 | inodes数值更大 |
|
ipvs内核转发 | 更优的性能方案 | 响应时间更短,单核CPU消耗更低
|
网络插件:VPC网络 | 少了一层网桥,网络转发性能更高 |
|
新功能方案特性 qGPU | 提高 GPU 使用率 | 成本更低 |
- 综合3.1至3.6所述:通过提升集群资源使用率,降低服务器成本同时提高集群效率,达到降本增效的效果。
四、服务管理
- 服务暴露方式过多,有nodeport、ingress、LoadBlancer、gateway等。升级完集群后,统一使用ingress;规划中
五、集群管理
- KubeSphere 提供了 Kubernetes 的多云与多集群管理,提供多云与多可用区的高可用
- 2.运维角度:简化集群的持续集成、测试、审核、发布、升级与弹性扩缩容,提高集群管理水平
- 3.开发角度:提供开箱即用的工具集,轻松上手K8S。所见即所得