1、在三台 master 节点上安装

yum -y install keepalived

2、配置文件

抢占模式

        在抢占模式中,keepalived的某台机器挂了之后VIP漂移到了备节点,当主节点恢复后主会将VIP再次抢回,这就是keepalive的抢占模式。keepalived默认工作在抢占模式下。在抢占模式中,主节点的state设为MASTER,备节点的state设为BACKUP,主节点的优先级要比备节点的优先级要高。
        抢占模式 取决于优先级,哪个优先级高,谁就是master,和启动顺序无关。

master-1:
cat /etc/keepalived/keepalived.conf
global_defs {
  router_id master-1   # 一般是主机名称,通过hostname获取
}

#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld"  # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}

# 定义主机信息
vrrp_instance VI_1 {
 state MASTER  # 主机填写MASTER
 interface ens192  # 设置实例绑定的网卡
 garp_master_delay 1
 virtual_router_id 10  # 虚拟路由器id号。主从必须一致
 priority 100  # 定义优先级,数字越大,优先级越高
 advert_int 1  # 心跳频率

unicast_src_ip 192.168.32.61 # 本机ip
unicast_peer {
 192.168.32.65 # 对端ip
 192.168.32.66 # 对端ip
}

authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100  # 虚拟 ip(vip)
}

#执行上面定义的脚本
track_script {
 chk_mysql
}
}

master-2:
cat /etc/keepalived/keepalived.conf
global_defs {
  router_id node-4 #一般是主机名称,通过hostname获取  
}

#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}

# 定义主机信息
vrrp_instance VI_1 {
 state BACKUP #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 90 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率

unicast_src_ip 192.168.32.65 #本机ip
unicast_peer {
 192.168.32.61 #对端ip
 192.168.32.66 #对端ip
}

authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100
}

#执行上面定义的脚本
track_script {
 chk_mysql
}
}

master-3:
cat /etc/keepalived/keepalived.conf
global_defs {
  router_id node-5 #一般是主机名称,通过hostname获取  
}

#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}

# 定义主机信息
vrrp_instance VI_1 {
 state BACKUP #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 80 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率

unicast_src_ip 192.168.32.66 #本机ip
unicast_peer {
 192.168.32.61 #对端ip
 192.168.32.65 #对端ip
}

authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100
}

#执行上面定义的脚本
track_script {
 chk_mysql
}
}

 非抢占模式

        两者的state都设为BUAKUP(官网说的),一个节点的优先级要比另一个节点的优先级要高,同时高优先级的节点设置nopreempt参数,该参数表示不抢占vip。这样,当高优先级的节点挂了之后,vip就会漂移到低优先级的节点上,但是当高优先级的节点再次恢复正常后再次起来后不会再抢回vip,因为它加了nopreempt参数。

        非抢占模式 取决于启动顺序,哪个先启动,谁就是master,和优先级无关。

master-1:
global_defs {
  router_id master-1 #一般是主机名称,通过hostname获取
}
 
#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}
 
# 定义主机信息
vrrp_instance VI_1 {
 state MASTER #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 nopreempt
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 100 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率
 
unicast_src_ip 192.168.32.61 #本机ip
unicast_peer {
 192.168.32.65 #对端ip
 192.168.32.66 #对端ip
}
 
authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100
}
 
#执行上面定义的脚本
track_script {
 chk_mysql
}
}

master-2:
global_defs {
  router_id node-4 #一般是主机名称,通过hostname获取  
}

#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}

# 定义主机信息
vrrp_instance VI_1 {
 state BACKUP #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 nopreempt
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 90 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率

unicast_src_ip 192.168.32.65 #本机ip
unicast_peer {
 192.168.32.61 #对端ip
 192.168.32.66 #对端ip
}

authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100
}

#执行上面定义的脚本
track_script {
 chk_mysql
}
}

master-3:
global_defs {
  router_id node-5 #一般是主机名称,通过hostname获取  
}

#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {
 script "killall -0 mysqld" #检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用
 interval 2
 weight -30
 fall 5
 rise 5
}

# 定义主机信息
vrrp_instance VI_1 {
 state BACKUP #主机填写MASTER
 interface ens192 #设置实例绑定的网卡
 garp_master_delay 1
 nopreempt
 virtual_router_id 10 #虚拟路由器id号。主从必须一致
 priority 80 #定义优先级,数字越大,优先级越高
 advert_int 1 #心跳频率

unicast_src_ip 192.168.32.66 #本机ip
unicast_peer {
 192.168.32.61 #对端ip
 192.168.32.65 #对端ip
}

authentication {
 auth_type PASS
 auth_pass zuanlan1437xi
}
virtual_ipaddress {
 #192.168.112.210 dev ens33 label ens33:0
 192.168.32.100
}

#执行上面定义的脚本
track_script {
 chk_mysql
}
}

3、启动并设置开机自启

service keepalived start
systemctl enable keepalived
systemctl status keepalived

4、修改 kubeadm-config 文件

kubectl edit cm -n kube-system kubeadm-config 
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        authorization-mode: Node,RBAC
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.28.0
    controlPlaneEndpoint: "192.168.32.100:6443"  # 写 vip 
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
kind: ConfigMap
metadata:
  creationTimestamp: "2025-04-17T16:35:06Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "4104721"
  uid: 63976c4a-5925-46be-b305-adcc337faecc

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐