Kubernetes-集群的高可用部署、结合fence
目录一 . k8s高可用结合负载均衡介绍二. K8s高可用+负载均衡集群部署1.pacemaker+haproxy的高可用+负载均衡部署2. k8s高可用集群部署3. 测试三. haproxy集群引入fence1. 测试一 . k8s高可用结合负载均衡介绍配置高可用(HA)Kubernetes集群,有以下两种可选的etcd拓扑:集群master节点与etcd节点共存,etcd也运行在控制平面节点上
目录
一 . 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!!!!
更多推荐
所有评论(0)