Linux企业运维——K8s高可用集群架构搭建详解

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——K8s高可用集群架构搭建详解相关的知识,希望对你有一定的参考价值。

K8s高可用集群

一、K8s高可用集群架构原理

Kubernetes的存储层使用的是Etcd。Etcd是CoreOS开源的一个高可用强一致性的分布式存储服务,Kubernetes使用Etcd作为数据存储后端,把需要记录的pod、rc、service等资源信息存储在Etcd中。

Kubernetes的管理层服务包括kube-scheduler和kube-controller-manager。kube-scheduer和kube-controller-manager使用一主多从的高可用方案,在同一时刻只允许一个服务处以具体的任务。Kubernetes中实现了一套简单的选主逻辑,依赖Etcd实现scheduler和controller-manager的选主功能。利用Etcd的强一致性,能够保证在分布式高并发情况下保证leader节点的全局唯一性。

利用Etcd对K8s进行高可用HA部署的方式主要有以下两种:

  • 将etcd与Master节点组件部署在一起
  • 单独部署一个etcd集群

二、实验环境

这里需要用到五台虚拟机:
server1(172.25.19.1): 私有仓库,便于后续部署时拉取镜像
server5(172.25.19.5): k8s高可用集群master node + 负载均衡
server6(172.25.19.6): k8s高可用集群master node
server7(172.25.19.7): k8s高可用集群master node
server8(172.25.19.8): k8s高可用集群worker node
注意: 部署k8s集群时,三个master node各需要2G内存,2个Cpu

实验步骤:
1、准备三个新的虚拟机server5、server6、server7:创建硬盘、创建新虚拟机导入硬盘、修改主机名及IP

2、这里一共开启了4台虚拟机,还有一台是server1私有仓库

3、确认server1上的habbor仓库开启

4、为真实主机和所有开启的虚拟机配置域名解析

三、K8s高可用集群架构搭建

在之前的k8s集群配置中,整个k8s集群中只有一台master节点,当这唯一的master节点down掉后,整个集群将无法工作调度,因此我们需要建立多个master节点,并为多个master节点配置负载均衡,这样当某一台master节点down掉后,其他正常运行的master节点能够负责集群的调度控制,从而实现k8s集群的高可用。

3.1、负载均衡Loadbalancer部署—haproxy

在真正的生产环境中,负载均衡服务器应单独部署,这里我们是在一台电脑上开启多台虚拟机搭建K8s高可用集群,由于内存限制,所以我们可以将实现负载均衡的haproxy部署在k8s集群master node之一的server5上。

实验步骤:
1、在server5上添加一个进行负载均衡时对外的虚拟访问IP:172.25.19.100,也可以直接使用原有的IP,但最好独立出来

2、由于server5是封装好母盘的快照,所以其软件仓库中有yum源,使用yum源安装haproxy


3、编辑haproxy的主配置文件

设置其监听8443端口的tcp请求并负载均衡到k8s集群的三个master节点进行处理,为监控开启一个80端口
注意: k8s集群的master节点进行处理调度时使用的API模块的端口为6443,所以在监听时应使用6443端口,但由于我们的server5节点同时也是一台master,所以端口不能冲突,这里设置为8443

4、启动haproxy,查看80和8443端口处于监听状态

5、此时访问(主机IP/虚拟IP)/status可以看到监控页面,三个master后端都是标红的,这是因为三个master后端都还未部署k8s

3.2、Docker部署

在进一步搭建k8s集群前,我们需要在每个master上部署Docker。Docker是开源的应用容器引擎,k8s是在其基础上的容器集群管理系统。

实验步骤:
1、将server1上的docker源指向文件复制给server5、server6、server7

2、server5、server6、server7上安装docker-ce,安装完成后启动docker



3、在server5上docker的配置目录中编辑json配置文件:指定拉取镜像的仓库地址(指向私有仓库)、设置docker的cgroup驱动程序为systemd

4、配置内核参数解决docker网桥问题,sysctl --system应用内核参数配置

5、将配置好的json文件和内核参数配置文件复制给server6、server7


6、由于我们的私有仓库做了加密认证,这里还需要把sever1上私有仓库的证书复制给server5、server6、server7

7、重启server5、server6、server7的docker,注意server6和server7还要sysctl --system应用内核参数配置


8、此时在server5、server6、server7上docker info查看docker属性信息,可以看到所有配置设定成功且无网桥警告信息


9、这里还要注意,在设置了镜像拉取仓库为私有仓库后,还要在server5、server6、server7上为仓库配置域名解析

10、拉取镜像测试成功,docker部署完成

3.3、K8s集群部署

实验步骤:
1、在server5、server6、server7上部署k8s前,由于kube_proxy使用IPVS模式,需要先modprobe ip_vs加载对应的内核模块(这里可以安装ipvsadmin便于后续管理查看策略)



2、关闭server5、server6、server7的swap分区(否则后续集群部署会报错),编辑设备挂载策略文件注释掉相应的开机挂载策略




3、从服务器上下载k8s的管理软件压缩包并解压缩(也可以从网上下载)

将解压缩得到的管理软件目录发送给server5、server6、server7

4、切换到server5、server6、server7上的k8s管理软件目录中,安装所有管理软件



5、安装完成后在server5、server6、server7上启动kubelet服务,设置其为开机自启动



6、在server5上输出kubeadm初始化模板为初始化配置文件,编辑该文件

文件中主要修改如下:1)修改API终端地址为server5的IP;2)设置节点名称为主机名;3)设置对server5进行负载均衡控制的终端为之前在server5上建立的虚拟IP,并指定监听端口为8443;4)修改镜像仓库为私有仓库的地址(默认为谷歌官方仓库,拉取速度慢),修改k8s集群版本;5)指定worker node上部署pod的网络段;6)定义k8s使用IPVS模式


注意: 在修改k8s版本时,需要与私有仓库中已有的kube-apiserver镜像版本一致

7、根据我们在server5编辑的kubeadm初始化配置文件,预先拉取安装k8s需要的镜像

8、接着根据该初始化配置文件,初始化集群,添加--upload-certs参数可以在后续执行加入节点时自动分发同步证书文件

9、集群初始化成功后,由于当前我们是超级用户身份,可以直接执行下图命令使用集群
注意: 这种方式在机器重启后会失效,如果需要再次使用集群,需要再次执行这条命令

另外,在集群初始化成功的提示信息中,给出了当我们要在集群中添加master node或worker node时,需要分别执行的命令

10、执行提示命令使用集群,此时查看集群中的节点看到server5节点没有就绪,查看集群中的pod可以看到是因为coredns解析服务起不来,这是由于集群中缺少网络插件,为了解决这一问题,我们需要部署flannel网络插件

11、复制flannel网络插件的配置文件(可以从网络下载)给server5

编辑该配置文件:修改网络类型为host-gw主机直连;确认flannel网络插件的镜像版本与私有仓库中的镜像版本一致



12、编辑完成后应用这一配置文件(为了使用集群管理命令kubectl时操作方便,这里我们将相应的设置语句写入~/.bashrc文件中,读取该文件使设定生效,此时kubectl命令可以补齐)

13、此时查看集群中的pod可以看到所有pod成功运行就绪,再次查看集群中的节点看到server5节点已就绪

14、在server6、server7上执行初始化集群成功时添加master节点的提示命令,将server6、server7作为master节点添加到集群中


15、此时查看集群中的节点可以看到,集群中添加的三个master节点已就绪

16、三个master后端部署k8s完成,此时在浏览器中访问(主机IP/虚拟IP)/status可以看到监控页面中haproxy的三个master后端变绿

3.4、K8s集群添加worker节点

实验步骤:
1、创建运行一台新的虚拟机server8作为worker node部署到集群中


2、server8上的部署与之前类似,这里我们可以直接将server5节点上配置好的docker源指向文件、k8s管理软件目录复制发送给server8

3、在server8上安装docker-ce,安装完成后启动docker

切换到server8上的k8s管理软件目录中,安装所有管理软件

4、将server5上docker配置目录中的json配置文件、私有仓库的证书、内核参数配置文件复制给server8

5、在server8上sysctl --system应用内核参数配置

6、重启docker服务,由于设置了镜像拉取仓库为私有仓库,我们还要在server8上为仓库配置域名解析

7、docker info查看docker属性信息,可以看到docker的cgroup驱动程序为systemd的配置设定成功且无网桥警告信息


8、关闭server8的swap分区(否则后续集群部署会报错),编辑设备挂载策略文件注释掉相应的开机挂载策略

9、在server8上执行初始化集群成功时添加worker节点的提示命令,将server8作为worker节点添加到集群中

10、查看集群中的节点看到server8节点已就绪,使用v1版本的myapp镜像运行一个pod,查看pod信息可以看到pod成功运行,进一步查看pod的额外信息可以看到pod运行在新加入的worker节点server8上并得到其在集群中的IP,访问这一IP可以看到pod的发布页面

四、集群高可用性能测试

实验步骤:
1、在集群中的其余两个master节点server6、server7执行提示命令使用集群,同样可以查看集群中运行的资源

关闭任意一个master节点,这里关闭server7(由于我们同时在server5上部署了haproxy,因此不能关闭server5)

2、此时在浏览器中访问(主机IP/虚拟IP)/status可以看到监控页面中haproxy的master后端server7变红

3、在剩下的master节点查看pod信息可以看到pod仍能够成功运行,访问pod在集群内部的IP可以看到pod的发布页面

再次关闭一个master节点server6

4、此时在浏览器中访问(主机IP/虚拟IP)/status可以看到监控页面中haproxy的master后端server6也变红,即集群中只有一个master后端server5正常运行

5、在剩下的server5节点查看pod信息,系统提示请求超时,集群无法正常运行,这是因为k8s高可用集群中要保证至少有两个正常运行的master节点

6、重新开启master节点server6、server7

7、在server5节点查看pod信息可以看到pod再次成功运行

在重新开启的两个master节点server6、server7执行提示命令使用集群,可以再次查看到集群中运行的pod资源

以上是关于Linux企业运维——K8s高可用集群架构搭建详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——K8s高可用集群架构搭建详解

高可用kubernetes集群搭建

linux系统下对网站实施负载均衡+高可用集群需要考虑的几点

Linux运维需要懂什么web集群架构知识?

了解Linux运维要用到的web集群架构知识

(七)从零开始搭建k8s集群——使用KubeSphere管理平台创建一个高可用的Redis集群服务