| H__D |
|
||
k8s高可用(Keepalived + HAProxy)集群部署一、架構圖
1.1、核心組件工作原理
二、高可用部署官方參考:kubeadm/docs/ha-considerations.md at main · kubernetes/kubeadm 本例測試,直接將LB組件(Keepalived + HAProxy)安裝在k8s上的master節點上了 節點規劃
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. 安裝Keepalivedyum 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地址和子網掩碼 }# 跟蹤腳本配置 注意:網卡名稱可以使用ipconfig查看 3. 啟動服務systemctl enable --now keepalived 驗證 # 檢查VIP是否綁定到正確的節點 ip addr show ens33 # 查看實時日志 journalctl -u keepalived -f 2.5 階段5:安裝 HAProxy配置(所有Master節點)1. 安裝HAProxyyum install -y haproxy 2. 配置HAProxycat > /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. 配置kubectlmkdir -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 |
![]() |
|
|
博客園
|
|