# 一、实验介绍
要想实现kubernetes集群的高可用,也就是实现控制面组件的高可用:
1. **etcd**:
- **高可用需求**:etcd 是 Kubernetes 集群的分布式键值存储系统,存储着集群的状态信息,因此需要保证其高可用性。
- **实现方式**:可以通过部署多个 etcd 实例,使用 `Raft` 协议进行数据复制和选举,确保即使部分节点故障,集群仍然能够正常运行。同时,建议将 etcd 部署在独立的节点上,避免与其他 Kubernetes 组件共享节点。
2. **API Server**:
- **高可用需求**:API Server 是 Kubernetes 集群的入口,负责接收和处理 API 请求,需要保证其高可用性。
- **实现方式**:可以通过部署多个 API Server 实例,并在负载均衡器后面进行负载均衡,以实现请求的分发和高可用性。同时,建议采用证书签名和认证等机制加强 API Server 的安全性。
3. **Controller Manager 和 Scheduler**:
- **高可用需求**:Controller Manager 负责维护集群中各种资源(如 Pod、Replication Controller 等)的状态,Scheduler 负责将 Pod 调度到合适的节点上,两者都需要保证高可用性。
- **实现方式**:可以通过部署多个 Controller Manager 和 Scheduler 实例,并使用 leader 选举机制确保只有一个实例处于活跃状态,其他实例处于备份状态。这样即使活跃实例出现故障,其他备份实例可以接管工作。
本文使用 Keepalived 和 HAproxy 实现 API Server 的高可用,架构如下图所示。

# 二、实验环境
| 主机编号 | 主机名 | IP地址 | 角色 | OS | 服务 |
| :------: | :-------: | :------------: | :---------:| :--------: | :------------------: |
| 1 | master-01 | 192.168.17.110 | 控制面-01 | CentOS 7.9 | master,etcd |
| 2 | master-02 | 192.168.17.120 | 控制面-02 | CentOS 7.9 | master,etcd |
| 3 | master-03 | 192.168.17.130 | 控制面-03 | CentOS 7.9 | master,etcd |
| 4 | worker-01 | 192.168.17.140 | 数据面-01 | CentOS 7.9 | worker |
| 5 | lb-01 | 192.168.17.150 | 高可用-主 | CentOS 7.9 | HAproxy & Keepalived |
| 6 | lb-02 | 192.168.17.160 | 高可用-备 | CentOS 7.9 | HAproxy & Keepalived |
| | | 192.168.17.200 | 虚拟 IP | | |
请注意,在本示例中,Keepalived 和 HAproxy 没有安装在任何主节点上。但您也可以这样做,并同时实现高可用。
然而,配置两个用于负载均衡的特定节点(您可以按需增加更多此类节点)会更加安全。这两个节点上只安装 Keepalived 和 HAproxy,以避免与任何 Kubernetes 组件和服务的潜在冲突。
如果将负载设备和控制面安装在同一台主机上,需要将haproxy的端口监听在非6443端口。
# 三、配置负载均衡
**lb-01 && lb-02**
##### 1. 安装HAproxy
```shell
yum -y install haproxy keepalived psmisc
```
##### 2. 编辑HAproxy的配置文件
```shell
以下是一个配置文件模板
cat /etc/haproxy/haproxy.cfg
```
```shell
global
log /dev/log local0 warning
chroot &n