重学k8s: 04.Kubernetes集群高可用解析
2021-08-05
上一节学习了Kubernetes集群的几种部署方式,推荐在生产环境使用二进制部署的方案。 使用二进制部署的最佳实践是,参考kubeadm对k8s集群的配置管理实践,开发一套ansible playbook,实现二进制k8s集群的自动化部署和配置管理。 本节将讨论一下这套二进制部署方案如何实现集群的高可用。
一个k8s集群里的Node分为control-plane
和普通node
两种角色。control-plane
节点负责集群的控制和调度,node
节点负责运行工作负载。
运行工作负载的node
节点是可以随时加入新的节点,任意横向扩展的,那么k8s集群的高可用的重点就落在了控制平面control-plane
节点上。
一个高可用k8s集群的需要部署多个control-plane
节点,一般建议至少3个。
以下是K8S官方推荐的高可用集群部署拓扑图:
首先将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。