手把手教你搭建Kubernetes高可用集群-外部负载均衡器篇

0
185

前面我们已经介绍过Kubernetes的高可用实际上就是ApiServer和ETCD的高可用。ETCD会以Static Pod的方式运行Kubernetes Master上。ApiServer我们总结过有三种方案:

  • 使用外部负载均衡器
  • 网络层做负载均衡
  • Node节点上使用反向代理

而本文就是向大家介绍使用外部负载均衡器来搭建Kubernetes的高可用集群。

负载均衡器的选择

负载均衡这个话题,我相信大家一定不会陌生。而负载均衡的搭建方案我选择大家最耳熟能详的Haproxy+Keepalived。

Haproxy是一个提供高可用、负载均衡和基于HTTP/TCP应用代理的解决方案。

Keepalived是用C编写的路由软件,主要目标是为Linux系统及基于Linux的设施提供强大的高可用性和负载均衡。

在本文中,Haproxy我们用来做ApiServer的HA+LB方案,Keepalived用来做HAProxy的HA方案。

机器资源

我这里一共使用了6台机器,3台master1台worker2台Haproxy,具体配置如下

系统 节点IP 节点类型 CPU Memory Hostname
centos7.1 192.168.3.10 master 2C 4G master1.k8s.mifaw.com
centos7.1 192.168.3.11 master 2C 4G master2.k8s.mifaw.com
centos7.1 192.168.3.12 master 2C 4G master3.k8s.mifaw.com
centos7.1 192.168.3.13 node 2C 4G worker.k8s.mifaw.com
centos7.1 192.168.3.14 Haproxy 2C 2G ha1.k8s.mifaw.com
centos7.1 192.168.3.15 Haproxy 2C 2G ha2.k8s.mifaw.com

Kubernetes配置

重要:以下所有步骤,需要在所有的master和node节点上执行

因为在Kubernetes集群中,各节点的主机名必须唯一,所以需要给每台主机配置一个不重复的主机名。

关闭防火墙,否则各种网络访问会让你头疼

关闭selinux,除非你是非常专业的运维可以不关闭selinux,否则你可能会被它折腾得怀疑人生

配置一下系统参数

安装docker

关闭swap,Kubernetes不希望swap来打扰它

安装kubeadm工具,kubeadm是官方推荐创建 Kubernetes 集群的最佳实践“快速路径”,配合以下几个组件共同使用:

  • kubeadm: 部署集群用的命令工具
  • kubelet: 每台机器上都要运行的组件,负责管理pod、容器的生命周期等
  • kubectl: 集群管理工具

重要:以上所有步骤,需要在所有的master和node节点上执行

这样集群的基础配置就已搭建好,确保所有节点执行了以上步骤,就可以开始高可用的搭建了。

高可用及负载均衡

先在ha1上安装haproxy

然后在ha2上搭建haprxoy,步骤、配置和在ha1节点上一模一样

这样Kubernetes的负载均衡就配置好了(但此时还未生效,因为集群我们还没搭建),而且为了高可用,我们分别在两台机器上各搭建了haproxy,也算是高可用了

但大家想想,这真的是高可用吗,如果我们就这样配置,Kubernetes在连接ApiServer的时候指定其中一个haproxy,当这个haproxy挂掉了怎么办,那整个集群也瘫痪了。所以真正的高可用,还要保证haproxy不单点故障才行,接下来就是keepalived出场了。

在ha1上安装keepalived

这里还需要配置一个VIP(虚拟IP),本文使用:192.168.3.100

在ha2上安装keepalived

注意:如果是公有云环境,keepalived的操作应该都不需要了,因为公有云一般是不支持自定义VIP, 可以购买稳中有各公有云的负载均衡产品。

这样一套相对完备的高可用环境已经搭建好,接下来就需要配置Kubernetes集群了

配置Kubernetes集群

首先选择一台master,本文使用的master1主机

  • control-plane-endpoint:填写刚刚搭建好高可用负载均衡ip和端口
  • upload-certs:在集群之间共享证书
  • ubernetes-version:指定kubernetes的版本,要和安装kubeadm的版本保持一致
  • pod-network-cidr:配置集群子网络,注意不要和集群现有网络有冲突

执行成功之后,配置一下运行环境,这是为了方便后续使用kubelet相关命令行

第一个master节点配置成功,继续加入另外两个master节点

在kubeadm init执行成功之后,界面上会打印两条kubeadm join命令,第一条kubeadm join是用于其他master节点配置高可用,第二条则是用于worker节点加入集群

在master2节点执行

在master3节点执行

每个master加入的时候,会在每个master节点上启动一个etcd的pod,并将多台master上的etcd组成集群

master节点配置完之后,我们可以查看一下各节点信息

可以发现每个节点的状态都是NotReady,这是因为还没有为集群配置cni网络,整个集群都处于无法通讯的状态

安装cni插件,本文选择calico,其他的因为懒,暂时未研究

首先从官网下载calico的配置文件

下载完成后修改CALICO_IPV4POOL_CIDR的value,和kubeadm init时pod-network-cidr指定的值,部署calico

等待一会儿,需要下载镜像、运行容器、配置网络,可以通过命令行看一下状态

当所有的STATUS都为Running,说明整个集群已经部署成功了

最后就可以加入worker节点了,还记得kubeadm init的第二条kubeadm join命令吗,没错,在worker节点上执行

在master节点上查看节点状态

当worker节点的STATUS变为Ready,说明worker节点已经部署成功了,其他worker节点加入步骤一模一样

至此,使用外部负载均衡器搭建高可用的Kubernetes集群已经搭建完成了。其实整个过程还是比较简单的,这其中可能最大的难点是如果不能科学上网相关的镜像的下载,这个可以借助国内各大厂商的镜像仓库或者直接通过离线包导入。

当然,到这一步只是将集群基础框架搭建起来,要真正使用起来我们还需要安装一些其他的组件,比如dashboard、ingress等,后期我会继续向大家介绍如何搭建一个完整可用的Kubernetes集群。

留下一个答复

请输入你的评论!
请在这里输入你的名字

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据