Keepalived服务健康检查器及与K8S的集成案例
Keepalived服务支持四种健康检查器
- TCP_CHECK: 通过非阻塞/带超时时间的TCP连接进行常规检查。如果远程服务器未回复此请求(超时),则测试错误,服务器将从服务器池中移除
- HTTP_GET: 对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果此总和与预期值不匹配,则测试错误,服务器将从服务器池中移除
- SSL_GET: 与HTTP_GET相同,但使用SSL连接到远程Web服务器
- MISC_CHECK: 允许用户定义的脚本作为运行状况检查程序运行。结果必须为0或1
前三种太简单了, 第四种由于是通过用户自定义的脚本作为检查结果, 它的扩展性是最强的, 所以本文只说第四种
案例1
先写一个简单的自定义脚本文件/etc/keepalived/check_api_server.sh
, 内容像这样:
1
2
3
4
5
6
|
# 如果 /etc/keepalived/down文件存在, 停止脚本,且退出码为1, 不存在则退出码为0
if [[ -f /etc/keepalived/down ]];then
exit 1
else
exit 0
fi
|
假设我有两台服务器192.168.21.120
与192.168.21.122
,他们的配置文件/etc/keepalived/keepalived.conf
分别像下面这样:
192.168.21.120
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
# 预定义一个用户自定义脚本实例
vrrp_script chk_apiserver {
script "/etc/keepalived/check_api_server.sh" # 脚本的路径
interval 5 # 脚本的执行间隔时间, 以秒为单位
weight -20 # 当脚本执行结果为1时(未达到预期), 使用当前脚本的vrrp实例权重(priority)减20分
fail 2 # 连续失败2次, 才停止当前主机的VIP(虚拟IP)服务
rise 1 # 只要成功1次, 立即重启当前主机的VIP(虚拟IP)服务
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 255
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.21.119
}
# track_script 标志着当前vrrp实例, 是通过自定义脚本的方式进行健康检查
track_script {
chk_apiserver # chk_apiserver 是上面预定义的vrrp_script的名称
}
}
|
192.168.21.121
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_api_server.sh"
interval 5
weight -20
fail 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 255
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.21.119
}
track_script {
chk_apiserver
}
}
|
有一个问题, 为什么 vrrp_script chk_apiserver
退出码为1时, 权重要减去20呢?
这是因为Master节点预定义的分数是100, Backup节点预定义的分数是80, 要想在自定义脚本执行失败时, Master节点能够"自动辞职", 它的分数必须低于Backup节点,所以weight
的值设置为-20
, 把它设置为-11
也是可以的, 因为100-11=89
同样低于Backup的权重分数
vrrp_instance
的priority
与vrrp_script
的weight
都是可以自行定义的,只要保证在需要节点"自动辞职"时, 他的分数低于其他"备选节点"的分数即可
K8S集成案例
为K8S部署高可用服务时, 通常要求至少3个控制面板, 确保一个控制面板是否可用的条件是节点上的kube_api_server
能够正常访问, 所以vrrp_script
应该是这样写的:
1
2
3
4
5
6
7
8
9
10
11
12
|
APISERVER_VIP=192.168.21.119
APISERVER_DEST_PORT=6443
{
curl --silent --max-time 2 --insecure https://localhost:$APISERVER_DEST_PORT/ -o /dev/null
if ip addr | grep -q $APISERVER_VIP; then
curl --silent --max-time 2 --insecure https://$APISERVER_VIP:$APISERVER_DEST_PORT/ -o /dev/null
fi
exit 0
} || {
exit 1
}
|
这段脚本中包含两个检测, 一个是当节点本身没有VIP时, 通过访问localhost:6443
来确保api_server
能够正常访问, 能正常访问就可以启动VIP服务;
另一个是当节点本身已经启用VIP时, 如果不能通过VIP正常访问api_server
, 就必须停止VIP服务, “禅让"给其他备用节点