赞
踩
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部署的方式主要有以下两种:
这里需要用到五台虚拟机:
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集群中只有一台master节点,当这唯一的master节点down掉后,整个集群将无法工作调度,因此我们需要建立多个master节点,并为多个master节点配置负载均衡,这样当某一台master节点down掉后,其他正常运行的master节点能够负责集群的调度控制,从而实现k8s集群的高可用。
在真正的生产环境中,负载均衡服务器应单独部署,这里我们是在一台电脑上开启多台虚拟机搭建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
在进一步搭建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部署完成
实验步骤:
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后端变绿
实验步骤:
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资源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。