上一节学习了Kubernetes集群的几种部署方式,推荐在生产环境使用二进制部署的方案。 使用二进制部署的最佳实践是,参考kubeadm对k8s集群的配置管理实践,开发一套ansible playbook,实现二进制k8s集群的自动化部署和配置管理。 本节将讨论一下这套二进制部署方案如何实现集群的高可用。

一个k8s集群里的Node分为control-plane和普通node两种角色。control-plane节点负责集群的控制和调度,node节点负责运行工作负载。 运行工作负载的node节点是可以随时加入新的节点,任意横向扩展的,那么k8s集群的高可用的重点就落在了控制平面control-plane节点上。 一个高可用k8s集群的需要部署多个control-plane节点,一般建议至少3个。

以下是K8S官方推荐的高可用集群部署拓扑图:

k8s-ha-topology.png

首先将k8s数据存储数据etcd以独立的高可用集群部署到k8s集群外部。

k8s的控制平面control-plane节点部署3个,这样控制平面的三个核心组件kube-apiserver, kube-controller-manager, kube-scheduler就都冗余了3个实例。

因为controller-manager和scheduler负责Pod的调度和各种资源对象的管理,所以同一时刻它们各自只能有一个实例工作,即它们要经过选举来决定谁作为leader进行工作。 kube-controller-manager, kube-scheduler它们都有一个启动参数--leader-elect默认为true,表示当它们以多副本运行时将启用选举并尝试获得leader的身份。

kube-apiserver提供k8s的API服务,是集群控制的入口,3个apiserver实例位于一个负载均衡器(load balancer)之后,不管是集群外部的客户端(kubectl, dashbaord, 其他客户端),还是集群内部的组件(controller-manager, scheduler)都配置apiserver负载均衡器的地址和端口来访问k8s的API。

最后说一下负载均衡器(load balancer)的选型,可以任何硬件或软件负载均衡器,例如阿里云的SLB,在bare metal环境下可以选择部署haproxy+keepalived。

参考链接