(共566篇)
全部分类

Keepalived服务健康检查器及与K8S的集成案例
[ Docker ] 

Keepalived服务健康检查器及与K8S的集成案例

Keepalived服务支持四种健康检查器

  1. TCP_CHECK: 通过非阻塞/带超时时间的TCP连接进行常规检查。如果远程服务器未回复此请求(超时),则测试错误,服务器将从服务器池中移除
  2. HTTP_GET: 对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果此总和与预期值不匹配,则测试错误,服务器将从服务器池中移除
  3. SSL_GET: 与HTTP_GET相同,但使用SSL连接到远程Web服务器
  4. 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.120192.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_instancepriorityvrrp_scriptweight都是可以自行定义的,只要保证在需要节点"自动辞职"时, 他的分数低于其他"备选节点"的分数即可

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服务, “禅让"给其他备用节点