RKE2 高可用叢集(HA)
1. 架構說明(Architecture Overview)
RKE2 官方建議部署至少 3 台 Control-Plane(含 etcd),並使用固定註冊端點(Fixed Registration Address)供所有節點加入叢集。
1.1 範例拓撲
| 節點 | 角色 | IP |
|---|---|---|
| cp-1 | control-plane + etcd | 192.168.1.10 |
| cp-2 | control-plane + etcd | 192.168.1.20 |
| cp-3 | control-plane + etcd | 192.168.1.30 |
| worker-1 | worker | 192.168.1.40 |
| VIP / LB | 固定註冊端點 | 192.168.1.100 |
1.2 Fixed Registration Address(固定註冊端點)
RKE2 官方強調第二台 server 與所有 agent 都必須使用相同的固定註冊端點:
可使用以下方法建立:
- Layer 4 Load Balancer(最推薦)
- Round-robin DNS
- Virtual IP(Keepalived)
- Elastic IP
此端點提供:
- 9345:RKE2 Supervisor(節點加入)
- 6443:Kubernetes API Server
Load Balancer 必須同時轉發這兩個 Port。
2. 啟動第一台 Server Node(Primary Server)
第一台 server:
- 建立整個 HA cluster 的 etcd
- 建立 cluster token(若未手動提供)
- 生成 TLS 憑證
2.1 安裝 RKE2
curl -sL https://get.rke2.io | INSTALL_RKE2_VERSION=v1.27.12+rke2r1 sh
2.2 建立設定檔
RKE2 config 檔會 不自動生成,需自行建立。
路徑:
/etc/rancher/rke2/config.yaml
token: my-shared-secret
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- 192.168.1.100 # VIP
2.3 token 自動建立(若未指定)
若未指定 token,RKE2 會自動建立:
/var/lib/rancher/rke2/server/node-token
2.4 必須加入 tls-san(官方重點)
避免 TLS x509 SAN mismatch,需要在第一台 server 加入 LB / VIP / Domain。
2.5 啟動 RKE2 Server
systemctl enable rke2-server
systemctl start rke2-server
3. 啟動額外的 Server Nodes(2nd、3rd、5th)
加入 HA cluster 的 Server Nodes 需指定:
- 相同的 token
- server= 固定註冊端點
- 完全相同的 critical configuration(重要)
3.1 設定檔
server: https://my-kubernetes-domain.com:9345
token: my-shared-secret
tls-san:
- my-kubernetes-domain.com
- another-kubernetes-domain.com
- 192.168.1.100
3.2 必須一致的 Critical Config Values(官方警告)
以下設定若與第一台 server 不一致會報錯:
failed to validate server configuration:
critical configuration value mismatch
必須一致的參數包含:
- cluster-cidr
- service-cidr
- cluster-dns
- kube-apiserver-arg
- node-taint
- flannel-backend
- 調度 / 網路 / pod CIDR 相關參數
3.3 啟動
systemctl enable rke2-server
systemctl start rke2-server
3.4 etcd 資料已存在時的特例
若節點本機已有 etcd 資料:
/var/lib/rancher/rke2/server/db/
則 server: <URL> 將被忽略。
(這是官方文件特別提到的行為。)
4. 可選:為 Control Plane 設定 Taints(官方建議)
預設 RKE2 Server Nodes 可排程;即 workloads 會被分配到 server。
如想讓 control-plane 專職 API / etcd,請加入 taint:
node-taint:
- "CriticalAddonsOnly=true:NoExecute"
官方注意事項:
- 若所有 server 都加入此 taint,而你尚未加入 agent nodes
→ Metrics Server / Ingress 會 pending
→ 直到有 untainted agent 加入
5. 加入 Agent Nodes(Workers)
加入 worker 與單 server cluster 完全相同:
5.1 安裝
curl -sL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh
5.2 設定檔
/etc/rancher/rke2/config.yaml:
server: https://my-kubernetes-domain.com:9345
token: my-shared-secret
5.3 啟動
systemctl enable rke2-agent
systemctl start rke2-agent
6. Load Balancer(HAProxy + Keepalived)
6.1 Keepalived(提供 VIP)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 55
priority 200
advert_int 1
virtual_ipaddress {
192.168.1.100
}
}
6.2 HAProxy(轉發 6443 / 9345)
frontend k8s_api
bind *:6443
default_backend api_backend
backend api_backend
balance roundrobin
server cp1 192.168.1.10:6443 check
server cp2 192.168.1.20:6443 check
server cp3 192.168.1.30:6443 check
frontend supervisor
bind *:9345
default_backend supervisor_backend
backend supervisor_backend
balance roundrobin
server cp1 192.168.1.10:9345 check
server cp2 192.168.1.20:9345 check
server cp3 192.168.1.30:9345 check
7. 叢集驗證(官方建議指令)
7.1 檢查所有 nodes
kubectl get nodes -o wide
7.2 檢查所有 namespaces 的 Pods
kubectl get pods -A
7.3 etcd 成員狀態
/var/lib/rancher/rke2/bin/etcdctl --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/rke2/server/tls/etcd/server.crt --key=/var/lib/rancher/rke2/server/tls/etcd/server.key member list
8. Troubleshooting(官方 + 實務)
❗ 問題 1:connection refused 127.0.0.1:2379
原因:etcd 尚未啟動
查看:
journalctl -u rke2-server -f
❗ 問題 2:x509: certificate is valid for ... not VIP
需加入:
tls-san:
- <VIP>
- <LB-domain>
❗ 問題 3:Worker 無法加入
LB 必須同時處理:
- 6443
- 9345
❗ 問題 4:etcd quorum lost
三台 control-plane 至少要有兩台存活。
檢查:
etcdctl endpoint health