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资源
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Kubernetes(简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种便捷的方式来管理容器化应用程序的生命周期,包括自动化部署、弹性伸缩、负载均衡、自动恢复等功能。 Kubernetes的主要特点包括: 1. 自动化部署和扩展:Kubernetes可以根据应用程序的需求自动部署和扩展容器实例,以满足不同的负载需求。 2. 服务发现和负载均衡Kubernetes提供了内置的服务发现和负载均衡机制,使得应用程序可以方便地进行服务间通信和负载均衡。 3. 自我修复:Kubernetes可以监控容器实例的健康状态,并在出现故障时自动进行修复或替换。 4. 水平扩展:Kubernetes可以根据应用程序的负载情况自动进行水平扩展,以提供更好的性能和可用性。 5. 配置和存储管理:Kubernetes提供了灵活的配置管理和存储管理机制,使得应用程序可以方便地访问配置信息和持久化存储。 在Linux运维项目中使用Kubernetes可以带来以下好处: 1. 简化部署和管理:Kubernetes提供了一种统一的方式来部署和管理容器化应用程序,简化了应用程序的部署和管理流程。 2. 提高可用性和弹性:Kubernetes可以自动进行容器实例的故障恢复和负载均衡,提高了应用程序的可用性和弹性。 3. 提高资源利用率:Kubernetes可以根据应用程序的负载情况自动进行容器实例的扩展和收缩,提高了资源的利用率。 4. 简化配置和存储管理:Kubernetes提供了灵活的配置管理和存储管理机制,简化了应用程序的配置和存储管理流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值