在日常維運工作中,手上同時管理多套 Kubernetes 叢集是再正常不過的事了。如果每次要操作不同環境的叢集,都得 SSH 連進對應的主機才能跑 kubectl,那效率真的很差。其實只要好好設定本機的 kubeconfig,就能用一台電腦輕鬆切換不同叢集,省下大把時間。
這篇文章會帶你從 kubeconfig 的結構開始理解,一步步新增多個叢集的連線設定,最後實現快速切換。

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
這時候你應該就能看到兩組叢集的連線設定了。

刪除設定(如果加錯了)
萬一設定有誤,可以用以下指令清除:
| 刪除目標 | 指令 |
|---|---|
| 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,體驗會更好。

發佈留言