作者:手机用户2602910191_702 | 来源:互联网 | 2023-05-19 14:23
使用阿里云SLB使master节点高可用服务器是在阿里云上的,17年的时候vpc网络是有HAVIP的,就可以使用haproxy+keepalived.今年阿里云可能关闭了这个功能,需要对应的客户经
使用阿里云SLB使master节点高可用
服务器是在阿里云上的,17年的时候vpc网络是有HAVIP的,就可以使用haproxy+keepalived.今年阿里云可能关闭了这个功能,需要对应的客户经理去申请开通,只能使用VPC内的SLB
监听配置
使用tcp 4层负载均衡,不使用7层,跳过证书验证的环节,tcp 4层不能关闭健康检查
80 |
8080 |
8080 |
443 |
6443 |
6443 |
配置hosts
ip fqdn
注意:阿里云的负载均衡是四层TCP负责,不支持后端ECS实例既作为Real Server又作为客户端向所在的负载均衡实例发送请求。因为返回的数据包只在云服务器内部转发,不经过负载均衡,所以在后端ECS实例上去访问负载均衡的服务地址是不通的。什么意思?就是如果你要使用阿里云的SLB的话,那么你不能在apiserver节点上使用SLB(比如在apiserver 上安装kubectl,然后将apiserver的地址设置为SLB的负载地址使用),因为这样的话就可能造成回环了,所以简单的做法是另外用两个新的节点做HA实例,然后将这两个实例添加到SLB 机器组中。
使用haproxy+keepalived实现
安装配置haproxy
下载
wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.9.tar.gz
tar -xf haproxy-1.8.9.tar.gz -C /usr/local/src/
编译安装haproxy
yum install gcc gcc-c++ autoconf automake -y
cd /usr/local/src/haproxy-1.8.9/
make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
> /usr/local/haproxy/sbin/haproxy -v
HA-Proxy version 1.8.9-83616ec 2018/05/18
Copyright 2000-2018 Willy Tarreau
创建相关目录,默认配置文件
mkdir /etc/haproxy
cat > /etc/sysconfig/haproxy <
systemd unit服务启动脚本
cat > /usr/lib/systemd/system/haproxy.service <
haproxy的配置
cat > /etc/haproxy/haproxy.cfg <
haproxy日志
Haproxy默认不会直接输出文件日志,需要借助Linux的rsyslog输出日志。
在haproxy.cfg
配置文件中global和defaults域中添加如下字段:
global
......
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
......
defaults
......
log global
......
global中的配置,是将info级别及以上的日志输出到rsyslog的local0接口,将warn级别及以上的日志输出到rsyslog。 info会打印每个请求的日志,生产环境中建议将日志级别设置为notice
为ryslog添加haproxy日志的配置/etc/rsyslog.d/haproxy.conf
mkdir /var/log/haproxy
cat > /etc/rsyslog.d/haproxy.conf <
修改ryslog的启动参数/etc/sysconfig/rsyslog:
SYSLOGD_OPTIOnS="-c 2 -r -m 0"
重启rsyslog:
systemctl restart rsyslog
启动haproxy
systemctl daemon-reload
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
然后我们可以通过上面9000端口监控我们的haproxy的运行状态(192.168.16.245:9000/stats):
另外一台也这样安装配置
安装配置keepalived
192.168.16.245 |
Master |
192.168.16.246 |
Backup |
192.168.16.247 |
Vip |
下载
wget http://www.keepalived.org/software/keepalived-1.4.4.tar.gz
tar -xf keepalived-1.4.4.tar.gz -C /usr/local/src/
编译安装keepalived
yum install libnl-devel libnfnetlink-devel openssl-devel -y
cd /usr/local/src/keepalived-1.4.4/
./configure --prefix=/usr/local/keepalived
make -j 4 && make install
注册为系统服务
安装完成后在/usr/lib/systemd/system/keepalived.service
自动生成
/usr/local/src/keepalived-1.4.4/keepalived/keepalived.service
配置keepalived
ln -sf /usr/local/keepalived/etc/keepalived/ /etc/keepalived
cd /etc/keepalived
mv keepalived.conf keepalived.conf.default
Master
cat > /etc/keepalived/keepalived.conf <
Backup
cat > /etc/keepalived/keepalived.conf <
haproxy检查脚本
cat /etc/keepalived/chk_haproxy_master.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
systemctl start haproxy
sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
systemctl stop keepalived
fi
fi
chmod +x /etc/keepalived/chk_haproxy_master.sh
启动keepalived服务
systemctl enable keepalived
systemctl start keepalived
2: ens192: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:98:2e:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.16.245/24 brd 192.168.16.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 192.168.16.247/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::822:4c72:993b:a056/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::6450:5694:d6c3:b30e/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
另外节点也这样安装
后面验证下vip漂移就ok
kube-controller-manager 和kube-scheduler 的高可用
Kubernetes 的管理层服务包括kube-scheduler
和kube-controller-manager
。kube-scheduler
和kube-controller-manager
使用一主多从的高可用方案,在同一时刻只允许一个服务处以具体的任务。Kubernetes中实现了一套简单的选主逻辑,依赖Etcd实现scheduler和controller-manager的选主功能。如果scheduler和controller-manager在启动的时候设置了leader-elect参数,它们在启动后会先尝试获取leader节点身份,只有在获取leader节点身份后才可以执行具体的业务逻辑。它们分别会在Etcd中创建kube-scheduler和kube-controller-manager的endpoint,endpoint的信息中记录了当前的leader节点信息,以及记录的上次更新时间。leader节点会定期更新endpoint的信息,维护自己的leader身份。每个从节点的服务都会定期检查endpoint的信息,如果endpoint的信息在时间范围内没有更新,它们会尝试更新自己为leader节点。scheduler服务以及controller-manager服务之间不会进行通信,利用Etcd的强一致性,能够保证在分布式高并发情况下leader节点的全局唯一性。整体方案如下图所示:
当集群中的leader节点服务异常后,其它节点的服务会尝试更新自身为leader节点,当有多个节点同时更新endpoint时,由Etcd保证只有一个服务的更新请求能够成功。通过这种机制sheduler和controller-manager可以保证在leader节点宕机后其它的节点可以顺利选主,保证服务故障后快速恢复。当集群中的网络出现故障时对服务的选主影响不是很大,因为scheduler和controller-manager是依赖Etcd进行选主的,在网络故障后,可以和Etcd通信的主机依然可以按照之前的逻辑进行选主,就算集群被切分,Etcd也可以保证同一时刻只有一个节点的服务处于leader状态。