# 高可用

本文主要内容参考自: kubespray 实现高可用的方式 (opens new window)

Kuboard-Spray 基于 kubespray 实现 Kubernetes 集群安装,在 Kubernetes 集群中,如下组件需要提供高可用的访问端口:

  • etcd 集群
  • kube-apiserver 服务

后面的章节分别阐述基于 Kuboard-Spray 安装 k8s 集群时,这两个组件实现高可用的方式。

# ETCD

# ETCD 集群的高可用

ETCD集群的高可用 (opens new window) 由 etcd 集群本身保证。只要集群中的成员数量不低于规定的最小数量,集群就可以正常运作。如果因为网络故障导致集群成员的失联,etcd 可以在网络恢复以后自动恢复到正常的状态,并且通过 Raft 算法保证集群的一致性;如果因为集群节点的机器临时故障(例如断电)使某个 etcd 集群成员失效,在该集群成员重新启动后,该成员将读取日志中故障发生之前的交易,并重新加入集群;如果集群中的某个节点硬件发生永久性的故障,则可以直接将其从集群中移除,并加入新的节点以替换该故障节点。

对于 ETCD 集群,建议在集群中提供奇数个节点,下表显示了不同的节点数量时 ETCD 集群可以容忍的错误节点数量:

集群节点数 Majority 最大容错数
1 1 0
2 2 0
3 2 1
4 2 1
5 3 2
6 3 2
7 4 3
8 4 3
9 5 4

从表中可以看出,偶数节点集群(例如8节点集群)相比奇数节点集群(例如7节点集群)并不能带来更大的容错能力。相反,在出现网络分裂(network partition)时,奇数节点数的集群可以始终确保分割后的子集中,有一个子集中的节点数量大于另一个子集中的节点数量,并在网络恢复时,可以无争议地以节点数量大的集群子集中的数据作为有效数据。

# KuboardSpray 部署的 ETCD

在使用 KuboardSpray 部署 K8S 时,如果有多个 ETCD 节点,则这些节点就已经按照 ETCD 集群的方式做好配置。并且所有 ETCD 节点的访问端口都被配置到了 ETCD 客户端(例如 kube-api-server)中的 etcd 连接参数中。

# kube-apiserver

API-Server 是一个无状态服务,可以通过负载均衡,将请求轮发到集群中的任意一个 kube-apiserver 节点。Kuboard Spray (基于 kubespray 实现)在每个非控制节点上配置了一个 nginx 反向代理,作为负载均衡器使用。这种做法被称作 localhost 负载均衡。这种做法相比于使用一个独立的负载均衡器来给 kube-apiserver 分发请求,主要的优势在于简单和便捷,尤其当用户不便于提供外部的负载均衡器或者虚拟IP时非常有效。使用 KuboardSpray 安装 K8S 集群时,所有的非控制节点上的 kubelet / kube-proxy 组件都将通过此 localhost 负载均衡访问 kube-apiserver。

如下图所示: 本地负载均衡

master 节点(控制节点)上的 kubelet / kube-proxy / kube-scheduler / kube-controller-manager 等组件都将直接访问 kube-apiserver 的 localhost:8080 端口;而非控制节点上的 kubelet / kube-proxy 组件,则将访问该节点 nginx 反向代理的 localhost:443 端口,并由 nginx 反向代理进一步将请求轮发到某一个 master 节点(控制节点)上的 kube-apiserver 的 :6443 端口。

::: tip 外置的负载均衡

  • 如果您直接使用 kubespray 部署 K8S 集群,也可以为 kube-apiserver 配置一个外置的负载均衡器。但是KuboardSpray 暂时未开放此配置。

:::