一 . k8s高可用结合负载均衡介绍

配置高可用(HA)Kubernetes集群,有以下两种可选的etcd拓扑:

集群master节点与etcd节点共存,etcd也运行在控制平面节点上
使用外部etcd节点,etcd节点与master在不同节点上运行

在前面k8s学习中,围绕一个k8s的master节点操作,当此节点dowm掉后k8s将无法进行后续的部署管理工作。此时通过haproxy配置k8s master主机实现负载均衡,通过k8s三台master主机实现k8s集群高可用。

外部etcd拓扑
请添加图片描述

二. K8s高可用+负载均衡集群部署

项目准备:
准备7台虚拟机server5-server10,server1:

server1 : harbor仓库
server5/server6:k8s高可用集群提供haproxy负载均衡
server7/server8/server9:k8s高可用集群master节点
server10:k8s woker 测试节点
请添加图片描述

1.pacemaker+haproxy的高可用+负载均衡部署

server5/6安装pacemaker相关组件,设置开机自启

先在server5,6配置repo源

cd /etc/yum.repos.d/
vim dvd.repo

[dvd]
name=dvd
baseurl=http://172.25.9=0.250/rhel7.6
gpgcheck=0

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.0.254/rhel7.6/addons/HighAvailability
gpgcheck=0

请添加图片描述
server5,6上安装服务,并设置开机启动

yum install -y pacemaker pcs psmisc policycoreutils-python
systemctl  enable  --now pcsd.service 

请添加图片描述

请添加图片描述
修改server5/6 的hacluster用户密码为westos

passwd  hacluster 

请添加图片描述

在server5:pcs注册认证server5 server6
创建集群命名mycluster,server5/6为成员,集群成员也可以后续添加

pcs cluster  auth server5 server6
 pcs cluster  setup  --name mycluster server5 server6

请添加图片描述
设置集群服务启动并开机自启

pcs cluster  start  --all
pcs cluster  enable  --all

请添加图片描述

集群检测,发现报错,解决它:
设置stonith-enabled=false,再次检测不再报错

crm_verify -L -V
pcs  property  set stonith-enabled=false
crm_verify -L -V

请添加图片描述

查询pcs状态将无Warning

pcs status

请添加图片描述

设置vip 172.25.0.100,用于故障无缝切换

 pcs resource  create  vip ocf:heartbeat:IPaddr2 ip=172.25.3.100 op  monitor interval=30s

请添加图片描述

查看集群状态 vip位于server5,Online: [ server5 server6 ]

 pcs status 

请添加图片描述

可以看到vip在server5上,我们查看server5的Ip

ip addr

请添加图片描述

server5和6安装haproxy

yum install -y haproxy

请添加图片描述

安装之后,配置haproxy.cfg,启动服务查看端口6443

cd /etc/haproxy/
vim haproxy.cfg
修改如下:
listen stats *:80
     stats uri /status
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:6443
    mode tcp
    default_backend             app

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    mode tcp
    server  k8s1 172.25.0.7:6443 check
    server  k8s2 172.25.0.8:6443 check
    server  k8s3 172.25.0.9:6443 check

请添加图片描述``

请添加图片描述

将配置文件传至server6,启动服务
查看端口6443

scp haproxy.cfg  server6:/etc/haproxy/

systemctl start haproxy

netstat -antlp

请添加图片描述

请添加图片描述

请添加图片描述

访问 172.25.0.5/status,此时k8s节点未建立,还是红色
请添加图片描述

然后将server5,6的haproxy服务停止

systemctl stop haproxy.service

请添加图片描述

请添加图片描述

haproxy服务放入pcs集群

pcs resource  create  haproxy systemd:haproxy op monitor interval=60s

请添加图片描述

查看集群状态 vip在server5 haproxy 在server6

pcs status 

请添加图片描述
建立group:hagroup 成员 vip ,haproxy,查看状态,二者同步,位于一台主机

pcs resource  group  add hagroup  vip haproxy 
pcs status 

请添加图片描述

请添加图片描述
pacemaker+haproxy的高可用+负载均衡部署成功
接着部署k8s

2. k8s高可用集群部署

server7/server8/server9安装k8s高可用集群:
配置docker.repo,并传递到部署docer主机server7/8/9

cd /etc/yum.repos.d/
vim docker.repo

[docker]
name= docker
baseurl=http://172.25.0.250/docker-ce
gpgcheck=0


scp /etc/yum.repos.d/docker.repo  server7:/etc/yum.repos.d/docker.repo
scp /etc/yum.repos.d/docker.repo  server8:/etc/yum.repos.d/docker.repo
scp /etc/yum.repos.d/docker.repo  server9:/etc/yum.repos.d/docker.repo

请添加图片描述

server7/8/9安装docker-ce,开机自启

 yum install -y docker-ce
systemctl  enable  --now docker

请添加图片描述

请添加图片描述
切换docker cgroups:systemd,k8s需要在此环境基础才能运行,同时设置默认仓库地址为https://reg.westos.org
server7/8/9,配置文件

vim /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://reg.westos.org"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

请添加图片描述

改好后,发给server8,9

scp daemon.json server8:/etc/docker/
scp daemon.json server9:/etc/docker/

请添加图片描述


配置内核参数,解决docker网络通信问题创建文件/etc/sysctl.d/docker.conf,内容如下

vim /etc/sysctl.d/docker.conf 

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

改好了发给server8,9

scp docker.conf server8:/etc/sysctl.d
scp docker.conf server9:/etc/sysctl.d

请添加图片描述
配置生效命令sysctl --system,server7/8/9均执行此操作配置

sysctl --system

docker info查看是否变化

请添加图片描述

请添加图片描述

发送仓库认证目录certs.d到server7/8/9

scp  -r certs.d/ server7:/etc/docker/
scp  -r certs.d/ server8:/etc/docker/
scp  -r certs.d/ server9:/etc/docker/

请添加图片描述
然后将server7,8,9的本地解析加上reg.westos.org
请添加图片描述

将server7,8,9的docker重启

systemctl resatrt docker

测试:
在server7上拉取镜像

docker pull busybox
docker images

请添加图片描述在server7,8,9上
打开ipvs模块,kube_proxy使用IPVS模式,减少iptables的压力。

lsmod |grep ip_vs
modprobe ip_vs
lsmod |grep ip_vs

请添加图片描述

使用准备好的rpm包,安装k8s

tar zxf kubeadm-1.21.3.tar.gz
cd packages/
yum install -y *

请添加图片描述

或者可以配置repo源去外网下载,因为我需要指定特定的版本,所以用本地的包!!
请添加图片描述

将安装k8s的文件传给server8、server9
安装!

scp -r packages/ server8:
scp -r packages/ server9:
cd packages/
yum install -y *

请添加图片描述
7,8,9上启动kubelet服务

systemctl enable --now kubelet

请添加图片描述

编写kubeadm初始化文件

kubeadm config print init-defaults > kubeadm-init.yaml
vim kubeadm-init.yaml

localAPIEndpoint:
  advertiseAddress: 172.25.0.7
  bindPort: 6443
  
  name: server7
  
controlPlaneEndpoint: "172.25.0.100:6443" #监听端口提供给haproxy

imageRepository: reg.westos.org/k8s #镜像地址为本地仓库
kind: ClusterConfiguration
kubernetesVersion: 1.21.3
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16 # pod网段
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1  #使用IPVS模式
kind: KubeProxyConfiguration
mode: ipvs

请添加图片描述

请添加图片描述

请添加图片描述
拉取使用镜像

kubeadm config images pull --config kubeadm-init.yaml

请添加图片描述
在server7,8,9上都需要关闭swap分区

swapoff -a
vim /etc/fstab #注释掉swap分区开机自启的那一行

请添加图片描述

请添加图片描述
在server7上
k8s高可用集群初始化
–upload-certs更新证书!

kubeadm init   --config kubeadm-init.yaml --upload-certs

请添加图片描述
生成了token带回server8,9加入master需要用
请添加图片描述

添加环境变量,查看节点状态

export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get node
kubectl get pod -n kube-system

请添加图片描述
添加命令行补齐

echo "source <(kubectl completion bash)" >> ~/.bashrc
source .bashrc

请添加图片描述

发现有节点未成功Running,原因是未安装网络插件
部署flannel,提前准备flannel到harbor仓库

vim kube-flannel.yml 

Type: "host-gw"

请添加图片描述
拉起资源清单,再次查看节点,各个节点工作恢复正常

kubectl apply -f kube-flannel.yml
kubectl get pod -n kube-system

请添加图片描述

请添加图片描述

添加server8/server9进入server7的k8s高可用集群中

kubeadm join 172.25.0.100:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:3d242753e63f0f6642e47281b37dfbec436ec43d917fef1cbd9ebadee0c765ad \
	--control-plane --certificate-key cb848b21df0ca822301d9cfbe9c7395613b3c6fdd4c4e019bb5ce0f3ea9e0455

请添加图片描述

请添加图片描述

查看node,均处于ready状态,部署成功

[root@server7 ~]# kubectl get node

可以看到,有三台master主机保持READY
请添加图片描述

我们还可以添加server10为k8s的work端
将server7或者8或者9的文件全部发给server10

scp -r packages/ server10:
cd /etc/yum.repos.d/
scp docker.repo server10:/etc/yum.repos.d/
cd /etc/docker/
scp -r daemon.json certs.d server10:/etc/docker/
cd /etc/sysctl.d/
scp dpcker.conf  server10:/etc/sysctl.d/


请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

在server10上安装服务:

yum install -y docker-ce
cd packages/
yum install -y *
swapoff -a
vi /etc/fstab

请添加图片描述

请添加图片描述

请添加图片描述

加入集群,此时是worker不是master的tocken看清楚!!
请添加图片描述

请添加图片描述

查看节点
请添加图片描述

然后再server7上运行一个容器

kubectl run demo --image=myapp:v1
kubectl get pod
kubectl get pod -o wide
curl ****

请添加图片描述

每个节点只有添加了环境变量才可以查看节点信息:

export KUBECONFIG=/etc/kubernetes/admin.conf

请添加图片描述
在server8上添加了环境变量之后,查看节点
请添加图片描述

3. 测试

将server7关机
poweroff
请添加图片描述

我们可以看到负载均衡的监控显示k8s1红了

请添加图片描述

在server8上查看pod节点,发现demo还在运行

kubectl get pod

然后将server8也关机
请添加图片描述

可以看到8,9都红了
请添加图片描述

此时在server9上查看pod节点,失败
因为master节点只剩一个了,所以就挂了!

export KUBECONFIG=/etc/kubernetes/admin.conf

kubectl get node
kubectl get pod

请添加图片描述

此时将7,8开机
在server9上再次查看pod发现可以看到了!
请添加图片描述

请添加图片描述

我们来测试haproxy节点
将server5的pcs停掉

pcs node standby

请添加图片描述

没关系,vip和haproxy都转移到了server6上

pcs status

请添加图片描述

那么server5的负载均衡掉了会对k8s集群有影响吗??
此时在server7上查看pod节点,没有任何影响,还在运行

请添加图片描述

可以看到vip在server6上

ip addr

请添加图片描述

重新将server5的pcs打开

pcs node unstandby

请添加图片描述
pcs status查看,发现server5启动后,vip和haproxy还在server6上,它不会转移到server5上,因为只要哪个或者就在那,节约资源!!
请添加图片描述

有个问题?
我们有两个负载均衡,server5,6
如果和刚才一样,server5挂了,会转到server6上!
但是如果server6也凉了呢?
是不是k8s集群就也凉了!

那么我们需要引用fence,检测心跳,将掉线的节点重新拉起:
比如server5掉了,那么就会重新启动server5,将所有的haproxy服务开启,加入集群!!

三. haproxy集群引入fence

在真机上打开服务

systemctl start fence_virtd
netstat -anulp | grep :1229

请添加图片描述

然后再server5,6上建立目录用来存放fence的密钥

mkdir /etc/fence

请添加图片描述

将真机的fence密钥发给server5,6

cd /etc/fence
scp fence_svm.key server5:/etc/cluster
scp fence_svm.key server6:/etc/cluster

请添加图片描述

在server5,6上安装fence服务,并查看服务

yum install -y fence-virt
stonith_admin -I

请添加图片描述

请添加图片描述
在server5上:
创建fence的检测,60s检测一次!

pvmk_host_map="server5:server5:server6:server6" op monitor interval=60s

请添加图片描述

将pcs的enabled打开

pcs property set stonith-enabled=true

请添加图片描述

查看pcs状态

pcs status

请添加图片描述

1. 测试

我们测试将server6的内核崩溃

echo c /proc/sysrq-trigger

请添加图片描述
然后在k8s集群中查看pod节点还在运行

kubectl get pod

请添加图片描述
但是vip,harpoxy都到了server5上

pcs status

请添加图片描述
注意:一般vmfence会在vip,haproxy的对端就是不会再同一个节点上,因为刚才server6的内核崩溃了,所以server6还处于关机状态。所以fence心跳检测会暂时呆在server5上,等server6重新开机之后,fence就会到server6上,而vip和haproxy还在server5上!!
目的是为了:当server5又挂了之后,vip和haproxy直接迁移到fence所在的机器上,即server6!!!!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐