高可用架构
kubernetes高可用集群通常由3或5个节点组成高可用集群,需要保障各个节点的高可用性
- etcd 内置集群机制,保障数据持久存储
- kube-apiserver 无状态api服务,有负载均衡调度器做负载分发,如haproxy或nginx
- kube-scheduler 内置选举机制,保障调度器高可用,确保同个时刻一个leader节点工作,其他处于阻塞,防止脑裂
- kube-controller-manager 内置的选举机制保障控制器高可用,机制和kube-scheduler一致。
如下图所示:

从上图可以得出:有多个worker node,那计算节点就是高可用。而master节点上面,由于etcd、scheduler、controller-manager由k8s系统自身实现了高可用。所以需要高用可的是apiserver这个组件。以下是以keepalived+haproxy实现apiserver的高可用。
环境准备
由于条件有限,拿三台机器实现master的高可用。环境如下:
| 名称 | IP | 系统版本 | 角色 | 安装软件 |
|---|---|---|---|---|
| k8s01 | 192.168.1.90 | centos 7.7 | master | kubeadm、kubelet、kubectl、docker、haproxy、keepalived |
| k8s02 | 192.168.1.91 | centos 7.7 | master | kubeadm、kubelet、kubectl、docker、haproxy、keepalived |
| k8s03 | 192.168.1.92 | centos 7.7 | master | kubeadm、kubelet、kubectl、docker |
| VIP | 192.168.1.99 |
三台都准备安装kubelet、kubeadm、kubectl、docker,前一篇文章里面的 准备工作 都需要运行。
HA高可用
安装软件
在k8s01、k8s02直接使用yum安装 keepalived以及haproxy这2个软件。
1 | yum install -y keepalived haproxy |
keepalived配置
/etc/keepalived/keepalived.conf的配置如下:
1 | ! Configuration File for keepalived |
注意router_id、virtual_router_id以及state这几个配置项。virtual_router_id必须不一样,值越高,其优先级越高。
haproxy配置
/etc/haproxy/haproxy.cfg配置如下:
1 | global |
haproxy配置主要估了2个事情:
- 监听6444端口,对应后端为三台master节点的6443端口
- 开启
/haproxy/stats状态查看后端服务是否有正常
完成之后,启动服务。观察VIP是否在master节点上,访问 http://192.168.1.99/haproxy/stats;如果正常,将keepalived停止,再访问URL,如果正常就继续下一步操作。
1 | systemctl enable keepalived && systemctl start keepalived |
初始化master节点
- 使用
kubeadm config print init-defaults 2>/dev/null >kubeadm-init.yaml生成配置,再修改相应的配置如下。主要是controlPlaneEndpoint配置192.168.1.99:6444,这个VIP加haproxy监听的端口。
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
- 下载镜像,每一台都需要操作:
1 | [root@k8s-1 ~]# kubeadm config images pull --config kubeadm-init.yaml |
- 在k8s01上面做初始化
1 | [root@k8s01 ~]# kubeadm init --config kubeadm-init.yaml |
上面有2个 kubeadm join ,之前在单主模式下,只会出现worker node的加入命令。
- 需要上传证书到其他的机器上,脚本参考了官方文档:
1 | [root@k8s01 ~]# cat upload_cert.sh |
- 必须保证证书已经上传到了节点,然后在
k8s02 k8s03进行join的操作。
1 | kubeadm join 192.168.1.99:6444 --token abcdef.0123456789abcdef \ |
- 在k8s01上面查看状态:
1 | [root@k8s01 ~]# kubectl get nodes |
- 在k8s01上面安装网络组件calico:
1 | #https://docs.projectcalico.org/getting-started/kubernetes/quickstart |
- 查看状态
1 | [root@k8s01 ~]# k get nodes |
看到三个节点都是master时,说明部署已经成功了。