跳至主要内容

RKE2 高可用叢集(HA)

1. 架構說明(Architecture Overview)

RKE2 官方建議部署至少 3 台 Control-Plane(含 etcd),並使用固定註冊端點(Fixed Registration Address)供所有節點加入叢集。

imag

1.1 範例拓撲

節點角色IP
cp-1control-plane + etcd192.168.1.10
cp-2control-plane + etcd192.168.1.20
cp-3control-plane + etcd192.168.1.30
worker-1worker192.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

參考文件