H__D  

k8s高可用(Keepalived + HAProxy)集群部署 

一、架构图

1.1、核心组件工作原理

组件作用关键机制
Keepalived 管理VIP漂移,监控节点健康 VRRP协议(虚拟路由冗余协议)
HAProxy 提供API Server的负载均衡和健康检查 TCP模式转发+HTTP层健康检查
VIP 对外提供唯一入口地址 ARP广播宣告IP所有权
  • 3个LB节点:相比传统2节点方案,避免"脑裂"同时提升吞吐量

  • VIP漂移优先级:建议设置优先级差(如100/95/90),确保快速收敛

二、高可用部署

  参考:k8s高可用集群安装-CSDN博客

  官方参考:kubeadm/docs/ha-considerations.md at main · kubernetes/kubeadm

  本例测试,直接将LB组件(Keepalived + HAProxy)安装在k8s上的master节点上了

      节点规划

节点名称IP规格部署组件
k8s-master1 192.168.1.181 2C4G Keepalived + HAProxy + ETCD + kube-apiserver等控制平面组件
k8s-master2 192.168.1.182 2C4G Keepalived + HAProxy +  ETCD + kube-apiserver等控制平面组件
k8s-master3 192.168.1.183 2C4G Keepalived + HAProxy +  ETCD + kube-apiserver等控制平面组件
k8s-node1 192.168.1.184 按需 kubelet + 工作负载

 

2.1 阶段1:基础环境准备(所有节点)

  参考:【K8S】k8s安装 步骤中的 环境准备

  写入hosts文件

cat >> /etc/hosts << EOF
192.168.1.181 k8s-master1
192.168.1.182 k8s-master2
192.168.1.183 k8s-master3
192.168.1.184 k8s-node1
EOF

2.2 阶段2:安装容器运行时(containerd)(所有节点)

  参考:【K8S】k8s安装 步骤中的 安装容器运行时(containerd)

2.3 阶段3:安装kubeadm/kubelet/kubectl

  参考:【K8S】k8s安装 步骤中的 安装 Kubernetes 组件

2.4 阶段4:安装 Keepalived + VIP 配置(所有Master节点)

   本例中 VIP(虚拟IP)是:192.168.1.180

1. 安装Keepalived
yum install -y keepalived 
2. 配置Keepalived(以k8s-master1为主节点)
# k8s-master1(priority 100)
cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived 全局定义部分 - 适用于所有实例的配置
global_defs {
    router_id LVS_DEVEL  # 定义当前节点的路由ID,用于标识节点,在集群中应唯一
}

! VRRP健康检查脚本定义 用于检查HAProxy服务是否正常运行
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # 检查haproxy进程是否存在的命令,killall -0只是检查不实际杀死进程
    interval 2                   # 检查间隔时间,单位为秒,每2秒执行一次检查
    weight 50                    # 权重值,如果检查失败优先级将减少该值,如果检查失败,优先级将减少50(可能导致主备切换)
}

! 定义虚拟路由器实例
vrrp_instance VI_1 {
    state MASTER                 # 初始状态为MASTER(在备份节点上应改为BACKUP)
    interface ens33              # 使用eth0网卡进行VRRP通信,使用ifconfig确认名称
    
    virtual_router_id 51         # 虚拟路由ID,集群中所有节点必须相同,范围1-255
    priority 80                  # 初始优先级(备份节点设为90和80)
    advert_int 1                 # 广告间隔时间(秒)
    
    # 认证配置
    authentication {
        auth_type PASS           # 认证类型为密码认证
        auth_pass MySecretPass   # 认证密码,集群中所有节点必须相同
    }
    
    # 虚拟IP地址配置(VIP)
    virtual_ipaddress {
        192.168.1.180/24         # 定义的虚拟IP地址和子网掩码
    }# 跟踪脚本配置
track_script { chk_haproxy # 关联之前定义的haproxy检查脚本 } # 可选的高级配置(示例中被注释掉) # notify_master "/path/to/script.sh master" # notify_backup "/path/to/script.sh backup" # notify_fault "/path/to/script.sh fault" # 这些脚本会在状态改变时执行 } EOF # k8s-master2(priority 90)和k8s-master3(priority 80)需修改: # state BACKUP # priority 90/80

  注意:网卡名称可以使用ipconfig查看

3. 启动服务
systemctl enable --now keepalived

  验证

# 检查VIP是否绑定到正确的节点
ip addr show ens33

# 查看实时日志
journalctl -u keepalived -f 

  

   

2.5 阶段5:安装 HAProxy配置(所有Master节点)

1. 安装HAProxy
yum install -y haproxy
2. 配置HAProxy
cat > /etc/haproxy/haproxy.cfg <<EOF
# HAProxy 负载均衡配置 for Kubernetes API Server
# ================================================

# 全局配置 (影响整个HAProxy进程)
global
    log /dev/log local0           # 定义日志输出到/dev/log,使用local0设备
    maxconn 20000                 # 每个进程的最大连接数
    nbproc 4                      # 启动4个工作进程(建议与CPU核心数匹配)

# 默认参数配置 (所有frontend/backend继承这些设置)
defaults
    mode tcp                      # 默认使用TCP模式(第4层负载均衡)
    timeout connect 5s            # 连接后端服务器的超时时间
    timeout client 50s           # 客户端不活动超时时间
    timeout server 50s           # 服务器端不活动超时时间

# 前端配置 - Kubernetes API服务入口
frontend k8s-api
    bind *:6443                   # 监听所有IP的6443端口(K8s API默认端口)
    default_backend k8s-masters   # 默认转发到名为k8s-masters的后端组

# 后端配置 - Kubernetes Master节点集群
backend k8s-masters
    balance roundrobin            # 使用轮询负载均衡算法
    option tcp-check              # 启用TCP健康检查
    
    # Master节点服务器配置
    # 格式:server <名称> <IP:端口> [参数]
    server k8s-master1 192.168.1.181:16443 check inter 3s fall 3 rise 2
    # check        - 启用健康检查
    # inter 3s     - 每3秒检查一次,默认2s
    # fall 3       - 连续3次失败标记为不可用,默认3
    # rise 2       - 连续2次成功恢复为可用,默认2
    
    server k8s-master2 192.168.1.182:16443 check inter 3s fall 3 rise 2
    server k8s-master3 192.168.1.183:16443 check inter 3s fall 3 rise 2

# HAProxy统计页面配置
listen stats
    bind *:8404                   # 监控页面监听端口
    mode http                     # 使用HTTP模式
    stats enable                  # 启用统计页面
    stats uri /admin?stats        # 统计页面访问路径
    stats auth admin:SecurePass123 # 登录认证(用户名:密码)
    # 访问方式:http://<HAProxy-IP>:8404/admin?stats
EOF

  验证:

    查看监听端口:netstat -lntup|grep haproxy

  

    在k8s-master1上关闭haproxy服务,查看虚拟ip是否转移k8s-master2

    在k8s-master1上开启haproxy服务,查看虚拟ip是否回到k8s-master1

# 关闭 haproxy 服务
systemctl stop haproxy
ip addr show ens33

# 开启 haproxy 服务
systemctl start haproxy
ip addr show ens33

  

2.6 阶段6:初始化第一个Master节点(k8s-master1)

1. 创建kubeadm配置文件

  由于HAProxy与K8S的apiServer部署在同一个节点,对外想暴露默认端口6443,所有由HAProxy监听对外保留端口6443

  apiServer监听端口16443,由HAProxy将6443端口流量反向代理到apiServer的16443端口

cat > kubeadm-config.yaml <<'EOF'
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
controlPlaneEndpoint: "192.168.1.180:6443"  # VIP + HAProxy端口
apiServer:
  extraArgs:
    secure-port: "16443"  # 指定API Server监听端口
imageRepository: registry.aliyuncs.com/google_containers  # 添加镜像仓库
networking:
  podSubnet: "10.244.0.0/16"
etcd:
  local:
    dataDir: /var/lib/etcd
EOF
2. 初始化第一个Master节点
kubeadm init --config=kubeadm-config.yaml --upload-certs --ignore-preflight-errors=Port-6443

  

3. 配置kubectl
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2.7 阶段7:加入其他Master节点(k8s-master2、k8s-master3)

1. 加入其他Master节点

  由于本例修改了端口,命令中需要增加参数 --ignore-preflight-errors=Port-6443 ,用来忽略端口错误

# 使用初始化时输出的命令(包含--control-plane)
kubeadm join 192.168.1.180:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --control-plane \
  --certificate-key <cert-key>
kubeadm join 192.168.1.180:6443 --token g9jkd7.2fe2yz08kmf0idib \
--discovery-token-ca-cert-hash sha256:46509bfe894f14bfd414a9308451d91d18edbf1e68fabd3b05053664f7c64003 \
--control-plane --certificate-key c608c8d508553a7ec593b92357413c4b6267357c240ffbc1a483e9fc358b32a5 \
--ignore-preflight-errors=Port-6443
   
2. 配置kubectl
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.8 阶段8:加入Worker节点(k8s-node1)

1. 加入Worker节点

  由于本例修改了端口,命令中需要增加参数 --ignore-preflight-errors=Port-6443 ,用来忽略端口错误

# 使用初始化时输出的命令
kubeadm join 192.168.1.180:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>
kubeadm join 192.168.1.180:6443 --token g9jkd7.2fe2yz08kmf0idib \
    --discovery-token-ca-cert-hash sha256:46509bfe894f14bfd414a9308451d91d18edbf1e68fabd3b05053664f7c64003 \
    --ignore-preflight-errors=Port-6443

二、测试高可kubernetes集群

      在Kubernetes集群中创建一个pod,验证是否正常运行:

    在主节点执行命令

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get pod,svc  

  

   浏览器访问地址:http://NodeIP:Port  =》 http://192.168.1.181-193:31505  

  

 

 

 

 

 

  

 

posted on 2025-05-24 00:00  H__D  阅读(1165)  评论(0)    收藏  举报