K3s 是一個輕量級的 Kubernetes 發行版,專為邊緣運算、物聯網和資源受限的環境設計。儘管其設計輕巧,K3s 依然提供了強大的功能,足以應對許多生產環境的需求。本篇文章將深入探討 K3s 的進階配置,特別是如何利用安裝腳本參數來客製化部署,以及如何建立一個高可用性 (High Availability, HA) 的 K3s 叢集。
透過本文,您將學習到:
讓我們開始探索 K3s 的進階世界吧!
K3s 的安裝過程極具彈性,主要透過 curl -sfL https://get.k3s.io | sh -s -
這條命令,並搭配環境變數或直接傳遞參數給 sh -s -
來實現客製化。這些參數允許您在安裝時精確控制 K3s 的行為和組件。
官方文件提供了詳細的配置指南:
其中,INSTALL_K3S_EXEC
環境變數允許您直接傳遞 K3s 執行檔的 CLI 參數,這對於細部調整 K3s Server 或 Agent 的行為至關重要:
在生產環境中,保持叢集組件的版本一致性是維護穩定性的關鍵。K3s 允許您在安裝時指定特定的版本,以避免自動更新可能帶來的兼容性問題。
INSTALL_K3S_VERSION
環境變數即可。export INSTALL_K3S_VERSION=v1.31.6+k3s1
curl -sfL https://get.k3s.io | sh -s -
這將確保您的 K3s 叢集安裝的是指定版本,有助於版本控制和環境的穩定性。
K3s 叢集由一個或多個伺服器節點 (Server Nodes) 和可選的代理節點 (Agent Nodes) 組成。伺服器節點負責運行 Kubernetes 控制平面組件,而代理節點則運行工作負載。
安裝伺服器節點: 預設情況下,K3s 安裝腳本會安裝一個伺服器節點。
# 在第一個伺服器節點 (e.g., node1) 上執行
curl -sfL https://get.k3s.io | sh -
獲取節點令牌 (Node Token): 伺服器節點啟動後,會生成一個用於代理節點加入叢集的令牌。
# 在伺服器節點上執行
sudo cat /var/lib/rancher/k3s/server/node-token
請妥善保管此令牌,它將用於代理節點的認證。
安裝代理節點: 代理節點需要知道伺服器節點的地址和令牌才能加入叢集。
# 在代理節點 (e.g., node2) 上執行
export K3S_TOKEN=<從伺服器節點獲取的令牌>
export K3S_URL=https://<伺服器節點 IP>:6443
export INSTALL_K3S_EXEC="agent"
curl -sfL https://get.k3s.io | sh -s -
透過這種方式,您可以輕鬆地擴展您的 K3s 叢集。
Kubernetes 服務 (Service) 類型中的 LoadBalancer
允許外部流量訪問叢集內的應用程式。然而,Kubernetes 本身並不提供負載平衡器的實現,這通常需要雲服務提供商或第三方解決方案。
K3s 針對本地部署環境提供了一個內建的 ServiceLB。
如果您計劃使用其他負載平衡器,例如 MetalLB,可以在安裝時禁用 K3s 內建的 ServiceLB:
curl -sfL https://get.k3s.io | sh -s - --disable=servicelb
在許多情況下,為了簡化部署和提高效率,我個人更傾向於直接讓 Ingress Controller 使用主機網路 (Host Network) 模式來暴露服務,這可以避免額外的負載平衡器配置。
Ingress Controller 負責管理對叢集內部服務的外部訪問。K3s 預設安裝了 Traefik Ingress Controller。
如果您有偏好的 Ingress Controller (例如 Nginx Ingress Controller 或 HAProxy Ingress Controller),可以在安裝 K3s 時禁用 Traefik:
curl -sfL https://get.k3s.io | sh -s - --disable=traefik
禁用後,您可以手動安裝和配置您選擇的 Ingress Controller。
預設情況下,K3s 採用單一伺服器/多代理節點的架構,這意味著如果單一伺服器節點發生故障,整個叢集的控制平面將會中斷。為了提高叢集的彈性,K3s 提供了基於嵌入式 etcd 的高可用性解決方案。
透過在安裝時添加 --cluster-init
參數,您可以初始化一個高可用性叢集:
curl -sfL https://get.k3s.io | sh -s - --cluster-init
這將允許您部署多個 K3s 伺服器節點,它們將共同維護叢集的狀態,從而實現控制平面的高可用性。
結合上述知識,我們現在將建立一個具備高可用性的 K3s 叢集。為了確保 Kubernetes API Server 的持續可用性,我們將使用 Keepalived 來配置一個虛擬 IP (VIP)。當任何一個伺服器節點發生故障時,VIP 將會自動漂移到另一個健康的伺服器節點,確保控制平面始終可達。
實驗環境設定:
在所有三個伺服器節點上安裝 Keepalived:
sudo apt update && sudo apt install -y keepalived
在所有三個伺服器節點的 /etc/keepalived/keepalived.conf
中添加以下配置。請注意,interface
需要根據您的實際網路介面名稱進行修改。
sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
enable_script_security
script_user root
}
vrrp_script chk_kube-api-server {
# check port 6443 is listening
script "lsof -i :6443"
interval 2 # 每 2 秒執行一次檢查
fall 2 # 連續失敗 2 次後才觸發降級
rise 1 # 連續成功 1 次後恢復正常優先級
init_fail
}
vrrp_instance haproxy-vip {
interface enp0s8 # 請根據您的實際網路介面名稱修改
state BACKUP # 初始狀態為 BACKUP,MASTER 將由優先級決定
priority 100 # 優先級,數值越高優先級越高,MASTER 節點應設定更高優先級
virtual_router_id 51 # VRRP 實例的唯一 ID,所有節點必須相同
virtual_ipaddress {
192.168.56.100/24 # 設定虛擬 IP 地址和子網路遮罩
}
track_script {
chk_kube-api-server
}
}
EOF
設定說明:
global_defs
: 全局設定,enable_script_security
和 script_user root
確保腳本可以以 root 權限執行。vrrp_instance haproxy-vip
: 定義一個 VRRP 實例。
interface
: 監聽 VRRP 廣播的網路介面。state
: 節點的初始狀態。在多個節點中,優先級最高的節點將成為 MASTER
。priority
: 節點的優先級。virtual_router_id
: VRRP 實例的唯一標識符,所有參與 HA 的節點必須使用相同的 ID。virtual_ipaddress
: 虛擬 IP 地址,這是外部流量將訪問的地址。在所有伺服器節點上重啟 Keepalived 服務,並檢查虛擬 IP 是否已成功配置。
sudo systemctl restart keepalived
# 在任一伺服器節點上檢查網路介面,確認 VIP 已綁定
ubuntu@node1:~$ ip a show dev enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:4b:9e:3d brd ff:ff:ff:ff:ff:ff
inet 192.168.56.101/24 brd 192.168.56.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet 192.168.56.100/24 scope global secondary enp0s8 # 虛擬 IP 應該會顯示在這裡
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe4b:9e3d/64 scope link
valid_lft forever preferred_lft forever
您應該會看到 192.168.56.100/24
作為輔助 IP 地址出現在網路介面上。
現在,我們將在三個伺服器節點上安裝 K3s,並配置它們以高可用性模式運行。
第一個伺服器節點 (初始化叢集):
在第一個伺服器節點上,使用 --cluster-init
參數來初始化 K3s 叢集。同時,我們禁用 Traefik 並設定 kubeconfig
檔案的權限,並將 VIP 加入 TLS SAN 列表,以便透過 VIP 訪問 API Server。
# 在第一個伺服器節點上執行 (e.g., node1)
export INSTALL_K3S_VERSION=v1.32.5+k3s1
export INSTALL_K3S_EXEC="server --disable=traefik --write-kubeconfig-mode 644 --cluster-init --tls-san=192.168.56.100"
curl -sfL https://get.k3s.io | sh -s -
安裝完成後,獲取 node-token
,這將用於其他伺服器節點加入叢集。
sudo cat /var/lib/rancher/k3s/server/node-token
其他伺服器節點 (加入叢集):
在其他兩個伺服器節點上,使用 --server
參數指定第一個伺服器節點的 IP 地址(或 VIP),並使用 --token
參數提供 node-token
。同樣,禁用 Traefik 並將 VIP 加入 TLS SAN 列表。
# 在第二個和第三個伺服器節點上執行 (e.g., node2, node3)
export INSTALL_K3S_VERSION=v1.32.5+k3s1
export INSTALL_K3S_EXEC="server --disable=traefik --write-kubeconfig-mode 644 --server https://192.168.56.100:6443 --tls-san=192.168.56.100"
export K3S_TOKEN=<從第一個伺服器節點獲取的令牌>
curl -sfL https://get.k3s.io | sh -s -
注意: --server
參數可以指向任何一個已啟動的 K3s 伺服器節點的 IP 地址,或者直接指向 Keepalived 的 VIP (192.168.56.100)。使用 VIP 可以確保即使第一個伺服器節點暫時不可用,其他節點也能成功加入。
所有伺服器節點安裝完成後,您可以透過以下命令驗證叢集狀態:
# 在任一伺服器節點上執行
kubectl get nodes
您應該會看到所有三個伺服器節點都處於 Ready
狀態。嘗試關閉其中一個伺服器節點,然後再次檢查 kubectl get nodes
,您會發現叢集仍然正常運行,因為 Keepalived 已經將 VIP 漂移到另一個健康的伺服器節點。
透過本文的介紹,您已經掌握了 K3s 的進階安裝參數,並成功建立了一個高可用性的 K3s 叢集。高可用性是生產環境中不可或缺的一環,它確保了叢集控制平面的穩定性和可靠性。
在下一篇文章中,我們將繼續探討 K3s 叢集建立後的一些基本配置,包括 Ingress Class、Storage Class 和 CNI (Container Network Interface) 等,這些都是構建完整 Kubernetes 環境的關鍵組件。
本文同步發表自 k3s install advance 1