← 返回上一頁
Kubernetes

設定 kubectl 連接多個 Kubernetes 叢集:kubeconfig 結構解析與實戰操作

本頁目錄
Kubernetes 多叢集管理示意圖

在日常維運工作中,手上同時管理多套 Kubernetes 叢集是再正常不過的事了。如果每次要操作不同環境的叢集,都得 SSH 連進對應的主機才能跑 kubectl,那效率真的很差。其實只要好好設定本機的 kubeconfig,就能用一台電腦輕鬆切換不同叢集,省下大把時間。

這篇文章會帶你從 kubeconfig 的結構開始理解,一步步新增多個叢集的連線設定,最後實現快速切換。

Kubernetes 多叢集管理示意圖

kubeconfig 檔案結構拆解

部署好一個 K8s 叢集後,在 master 節點上預設的 kubeconfig 位置是:

cat ~/.kube/config

它的內容其實和 /etc/kubernetes/admin.conf 一模一樣。整個檔案可以拆成三大區塊:

區塊 用途 關鍵欄位
clusters 定義要連接的叢集資訊 server(API Server 位址)、certificate-authority-data(CA 憑證)
users 定義使用者身份驗證資訊 client-certificate-data(客戶端憑證)、client-key-data(私鑰)
contexts 將 cluster + user + namespace 綁在一起 cluster、user、namespace

另外還有一個重要欄位 current-context,它標記了目前正在使用哪一組 context。

context 範例

contexts:
- context:
    cluster: kubernetes
    namespace: default
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes

cluster 範例

clusters:
- cluster:
    certificate-authority-data: ********
    server: https://apiserver.cluster.local:6443
  name: kubernetes

user 範例

users:
- name: kubernetes-admin
  user:
    client-certificate-data: ********
    client-key-data: ********

深入理解:cluster 區塊的 certificate-authority-data

這個 CA 資料是用來「驗證 K8s 叢集身分」的。整個流程大致如下:

步驟 說明
1 kubectl 發送請求給 API Server
2 API Server 回傳伺服端憑證(即 /etc/kubernetes/pki/apiserver.crt
3 kubectl 用 certificate-authority-data 驗證該憑證是否合法
4 驗證通過後,後續通訊使用 apiserver.crt 進行加密
5 API Server 端使用 apiserver.key 解密

簡單說,apiserver.crt 就是公鑰,apiserver.key 就是私鑰。如果你在 kubectl 啟用了 --insecure-skip-tls-verify=true,那就算 CA 資料是錯的也能連,但這在正式環境不建議使用。

深入理解:user 區塊的雙向加密

上面說了 kubectl 傳送給 API Server 的訊息會用伺服端公鑰加密,那反方向呢?API Server 回傳給 kubectl 的資料當然也需要加密。

這時候用的就是 user 區塊裡的 client-certificate-data(客戶端公鑰),而 client-key-data 就是 kubectl 這邊的私鑰,用來解密收到的回應。

想查看憑證資訊可以用以下指令:

openssl x509 -in apiserver.crt -noout -text

也可以先把 user 的 client-certificate-data 用 base64 解碼後存成 .crt 檔來解析,裡面會包含使用者資訊——CN 代表 user name,O 代表 group。

例如預設的管理員憑證,使用者是 kubernetes-admin,群組是 system:masters。而 system:masters 這個群組透過 ClusterRoleBinding 綁定了 cluster-admin 角色,擁有所有資源的完整權限:

kubectl get clusterrolebinding cluster-admin -o yaml
kubectl get clusterrole cluster-admin -o yaml

實戰:新增其他叢集的 Context

了解完結構後,接下來實際操作。先備份一下現有設定:

cd ~/.kube
cp config config.bak

步驟一:新增 cluster 資訊

先把 base64 格式的 CA 憑證解碼並儲存:

echo "********" | base64 -d > sit.ca

然後執行新增:

kubectl config --kubeconfig=config set-cluster sit \
  --server=https://10.250.x.x:6443 \
  --certificate-authority=sit.ca

步驟二:新增 user 資訊

同樣先把憑證和金鑰解碼存檔:

echo "********" | base64 -d > sit-admin.crt
echo "********" | base64 -d > sit-admin.key

執行新增使用者:

kubectl config --kubeconfig=config set-credentials sit-admin \
  --client-certificate=sit-admin.crt \
  --client-key=sit-admin.key

步驟三:新增 context 資訊

最後把 cluster 和 user 組合成一個 context:

kubectl config --kubeconfig=config set-context sit \
  --cluster=sit \
  --namespace=default \
  --user=sit-admin

完成後用以下指令確認:

kubectl config view

這時候你應該就能看到兩組叢集的連線設定了。

kubectl get-context 列出多個叢集

刪除設定(如果加錯了)

萬一設定有誤,可以用以下指令清除:

刪除目標 指令
cluster kubectl --kubeconfig=config config unset clusters.sit
user kubectl --kubeconfig=config config unset users.sit-admin
context kubectl --kubeconfig=config config unset contexts.sit

切換與測試

設定完成後,可以透過 --context 參數指定要連到哪個叢集:

kubectl --context sit get nodes

不過每次都要加 --context 也挺麻煩的。可以直接把某個 context 設為預設:

kubectl config use-context sit

這樣之後所有 kubectl 指令預設就會連到 sit 叢集了。想切回來也是一樣的操作:

kubectl config use-context kubernetes-admin@kubernetes

進階技巧:常用的 context 管理指令

指令 用途
kubectl config get-contexts 列出所有 context(目前使用的會標 *)
kubectl config current-context 顯示目前使用中的 context
kubectl config use-context <name> 切換預設 context
kubectl config view --minify 僅顯示目前 context 的設定

小結

設定好 kubeconfig 之後,管理多套 K8s 叢集變得輕鬆許多。不用再頻繁 SSH 切換主機,一台筆電就能搞定所有叢集的日常操作。整個設定邏輯很清楚:先加 cluster、再加 user、最後組合成 context,三步驟搞定。

如果你管理的叢集更多,也可以考慮使用 kubectx 這類工具來更快速地切換 context,搭配 kubens 還能快速切換 namespace,體驗會更好。

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料