当前位置:网站首页>vivo大规模 Kubernetes 集群自动化运维实践
vivo大规模 Kubernetes 集群自动化运维实践
2022-06-13 10:11:00 【InfoQ】
一、背景
- 需要人工黑屏化集群运维操作,存在操作失误和集群配置差异。
- 部署脚本工具没有具体的版本控制,不利于集群的升级和配置变更。
- 部署脚本上线需要花费大量的时间验证,没有具体的测试用例和CI验证。
- ansible任务没有拆分为模块化安装,应该化整为零。具体到K8s、etcd、addons的等角色的模块化管理,可以单独执行ansible任务。
- 主要是通过二进制部署,需要自己维护一套集群管理体系。部署流程繁琐,效率较低。
- 组件的参数管理比较混乱,通过命令行指定参数。K8s的组件最多有100以上的参数配置。每个大版本的迭代都在变化。
二、集群部署实践
2.1 集群部署介绍
- Bootstrap OS
- Preinstall step
- Install Docker
- Install etcd
- Install Kubernetes Master
- Install Kubernetes node
- Configure network plugin
- Install Addons
- Postinstall setup
- 【可维护性】当组件参数超过50个以上时配置变得难以管理。
- 【可升级性】对于升级,版本化配置的参数更容易管理。因为社区一个大版本的参数没有变化。
- 【可编程性】可以对组件(JSON/YAML)对象的模板进行修补。如果你启用动态kubelet配置选项,修改参数会自动生效,不需要重启服务。
- 【可配置性】许多类型的配置不能表示为key-value形式。
- 使用kubeadm对K8s集群的生命周期管理,减少自身维护集群的成本。
- 使用kubeadm的证书管理,如证书上传到secret里减少证书在主机拷贝的时间消耗和重新生成证书功能等。
- 使用kubeadm的kubeconfig生成admin kubeconfig文件。
- kubeadm其它功能如image管理、配置中心upload-config、自动给控制节点打标签和污点等。
- 安装coredns和kube-proxy addons。
- 使用ansible自带模块处理部署逻辑。
- 避免使用hostvars。
- 避免使用delegate_to。
- 启用–limit 模式。
- 等等。
2.2 CI 矩阵测试
- ansible-lint
- shellcheck
- yamllint
- syntax-check
- pep8
- 部署集群
- 扩缩容控制节点、计算节点、etcd
- 升级集群
- etcd、Docker、K8s和addons参数变更等
- 检查kube-apiserver是否正常工作
- 检查节点之间网络是否正常
- 检查计算节点是否正常
- K8s e2e测试
- K8s conformance 测试
- 其他测试
- 在K8s集群部署gitlab-runner,并对接GitLab仓库。
- 在K8s集群部署Containerized-Data-Importer (CDI)[4]组件,用于创建pvc的存储虚拟机的映像文件。
- 在K8s集群部署kubevirt,用于创建虚拟机。
- 在代码仓库编写gitlab-ci.yaml[5], 规划集群测试矩阵。

- 开发人员提交PR。
- 触发CI自动进行ansible语法检查。
- 执行ansible脚本去创建namespace,pvc和kubevirt的虚拟机模板,最终虚拟机在K8s上运行。这里主要用到ansible的K8s模块[6]去管理这些资源的创建和销毁。
- 调用ansible脚本去部署K8s集群。
- 集群部署完进行功能验证和性能测试等。
- 销毁kubevirt、pvc等资源。即删除虚拟机,释放资源。

- 提供标准的K8s API,通过ansible的K8s模块就可以管理这些资源的生命周期。
- 复用了K8s的调度能力,对资源进行了管控。
- 复用了K8s的网络能力,以namespace隔离,每个集群网络互相不影响。
三、Kubernetes-Operator 实践
3.1 Operator 介绍
- kubernetes controller
- 部署或者管理一个应用,如数据库、etcd等
- 用户自定义的应用生命周期管理
- 部署
- 升级
- 扩缩容
- 备份
- 自我修复
- 等等
3.2 Kubernetes-Operator CR 介绍

3.3 Kubernetes-Operator 架构

- 其它的业务集群可以承载故障集群的业务,kubernetes-operator不需要执行任何操作。
- 如果其他业务集群不能承载故障集群的业务。容器平台开始预估资源,调用kubernetes-operator创建集群,即创建clusterDeployment从备机池里选择物理机器,观测到当前需要操作机器的IP地址生成对应的inventory和变量,创建configmap并挂载给job。执行集群安装的ansible脚本, 集群正常部署完成后开始业务的迁移。
3.4 Kubernetes-Operator 执行流程

- 集群管理员或者容器平台触发创建ClusterDeployment的CR,去定义当前集群的操作。
- ClusterDeployment控制器感知到变化进入控制器。
- 开始创建machineSet和关联machine 资源。
- ClusterInstall 控制器感知ClusterDeployment和Machineset的变化,开始统计machine资源,创建configmap和job,参数指定操作的ansible yml入口,执行扩缩容、升级和安装等操作。
- 调度器感知到job创建的pod资源,进行调度。
- 调度器调用K8s客户端更新pod的binding资源。
- kubelet感知到pod的调度结果,创建pod开始执行ansible playbook。
- job controller感知job的执行状态,更新ClusterDeployment状态。一般策略下job controller会去清理configmap和job资源。
- NodeHealthy感知K8s的node是否为ready,并同步machine的状态。
- addons 控制器感知集群是否ready,如果为ready去执行相关的addons插件的安装和升级。
四、总结
边栏推荐
猜你喜欢
多线程 从UE4的无锁队列开始 (线程安全)
Knowledge points of silicon steel sheet
C# 11 新特性:接口中的静态抽象成员
Tree and binary tree: operation and storage structure of tree
信息文档管理与配置管理
Write pytoch model in five minutes
ASCII码值是怎么计算的,怎么计算arccos的值
Memory management -- Viewing memory space from the perspective of executing programs and processes
一篇文章读懂:Spark运行模式
WIN7无法被远程桌面问题
随机推荐
低代码开发一个基础模块
[51nod p3058] Xiao ming'ai set [set]
GPIO of hardware schematic diagram
The rise of cloud computing enterprises and the shaking of Oracle database market dominance
微信小程序客服自动回复——PHP实现
Node-RED系列(二五):集成高德地图并实现3d地图和轨迹回放
Interrupt handling mechanism
C Oracle multi table query
了解RPC和REST
C# Oracle 多表查询
Thingsboard tutorial (21): save data after processing using message types and data processing nodes
C# 11 新特性:接口中的静态抽象成员
How to calculate ASCII code value and how to calculate arccos value
Memory management -- Viewing memory space from the perspective of executing programs and processes
Trees and binary trees: Construction of binary trees
Redis初始安装和使用【玩转华为云】
[Luogu p1090, ssl1040] merged fruit [pile]
LeetCode 2016. Maximum difference between incremental elements
VGA common resolution and calculation method
全栈开发实战|SSM框架整合开发