前言

k8s普通集群只有一个master节点,当此节点down掉后k8s将无法进行后续的部署管理工作。本文主要介绍K8S高可用架构模型,以及常用高可用组件介绍。

重要组件

keepalived

概念

Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。

它与HeartBeat实现类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供HA软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

工作原理

keepalived是以VRRP协议为实现基础的

VRRP

Virtual Router Redundancy Protocol
虚拟路由冗余协议
可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip

VIP

Virtual IP Address
虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip

master

会发组播,当backup收不到VRRP包时就认为master宕掉了
这时就需要根据VRRP的优先级,来选举一个backup当master
这样,就可以保证路由器的高可用了

HAProxy

概念

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

Haproxy特点

  1. 支持TCP与Http协议,工作在网络4层和7层
  2. 支持Session共享、Cookies引导
  3. 支持通过URL健康检测
  4. 支持8种负载均衡策略
  5. 支持心跳检测

说明:对于Http协议,Haproxy处理效率比Nginx高。所以,没有特殊要求的时候或者一般场景,建议使用Haproxy来做Http协议负载!但如果是Web,那么建议使用Nginx!总之,大家可以结合各自使用场景的特点来进行合理地选择!

Haproxy与keepalived


Haproxy集群利用keepalived组件实现高可用

K8S高可用

根据K8s官方文档将HA拓扑分为两种,Stacked etcd topology(堆叠ETCD)和External etcd topology(外部ETCD)

堆叠ETCD

每个master节点上运行一个apiserver和etcd, etcd只与本节点apiserver通信。

外部ETCD

etcd集群运行在单独的主机上,每个etcd都与apiserver节点通信。

官方文档主要是解决了高可用场景下apiserver与etcd集群的关系。
3个master节点防止单点故障。但是集群对外访问接口不可能将三个apiserver都暴露出去,一个挂掉时还是不能自动切换到其他节点。
官方文档只提到了一句“使用负载均衡器将apiserver暴露给工作程序节点”,而这恰恰是生产环境中需要解决的重点问题。

部署架构

以下是我们在生产环境所用的部署架构:

  1. 由外部负载均衡器提供一个vip,流量负载到keepalived master节点上。
  2. 当keepalived节点出现故障, vip自动漂到其他可用节点。
  3. haproxy负责将流量负载到apiserver节点。
  4. 3个apiserver会同时工作。注意k8s中controller-manager和scheduler只会有一个工作,其余处于backup状态。我猜测apiserver主要是读写数据库,数据一致性的问题由数据库保证,此外apiserver是k8s中最繁忙的组件,多个同时工作也有利于减轻压力。而controller-manager和scheduler主要处理执行逻辑,多个大脑同时运作可能会引发混乱。