简介
Kubernetes(简称k8s)凭借着其优良的架构,灵活的扩展能力,丰富的应用编排模型,成为了容器编排领域的事实标准,也是各大企业进行容器云平台建设的首选技术。无论是在公有云环境使用还是在私有云环境使用,k8s集群的高可用是一个不能回避的话题。k8s容器云平台的高可用的核心思想是让k8s master节点中的各类组件(etcd/kube-apiserver/kube-controller-manager/kube-scheduler)具备高可用性,不存在组件的单点故障。
部署策略及高可用原理
Kubernetes的节点角色分为master和node两种,node节点默认已经有高可用了,因为pod会分配到各 个node上,如果有node挂了,k8s就会将node置为Not Ready,随后到其他健康的node上新建pod,保证副本数为预期状态。因此要实现Kubernetes集群的高可用,实际上是要实现master节点的高可用。其中,etcd采用3节点实现高可用,etcd会保证所有的节点都会保存数据,并保证数据的一致性和正确性,在正常运行的状态下,集群中会有一个 leader,其余的节点都是 followers。通常情况下,如果是follower节点宕机,如果剩余可用节点数量超过半数,不影响集群正常工作。如果是leader节点宕机,那么follower就收不到心跳而超时,发起竞选获得投票,成为新的leader,继续为集群提供服务。
kube-apiserver、kube-scheduler和kube-controller-manager三个组件均以多实例模式运行。kube-apiserver是无状态的,一般可以采用以下两种方式实现高可用:
- 通过配置haproxy或nginx等负载均衡器进行代理访问kube-apiserver,从而保证kube-apiserver服务的高可用性,haproxy或nginx等负载均衡器自身使用keepalived绑定一个vip实现高可用(或者直接使用云厂商的LB工具进行负载均衡,如SLB、ELB等);
- 在每个master和node节点配置一个nginx,后端对接多个kube-apiserver实例,nginx对多个 kube-apiserver实例做健康检查和负载均衡,kubelet、kube-proxy、controller-manager、scheduler组件通过本地的nginx访问kube-apiserver,从而实现kube-apiserver的高可用。
kube-scheduler和kube-controller-manager是有状态的服务,多个实例会通过向apiserver中的 endpoint加锁的方式来选举产生一个leader实例,其它实例处于阻塞模式,当leader挂了后,会重新选举产生新的leader,从而保证服务的可用性。因此这两个组件采用多实例部署即可实现高可用。