使用 kubectl context 管理 Kubernetes 操作環境
在操作 Kubernetes 時,kubectl 會透過 kubeconfig 取得叢集連線資訊、使用者憑證與目前要操作的 context。當只有一個本機測試叢集時,直接使用預設的 ~/.kube/config 通常就足夠;但如果同一個叢集需要切換不同 namespace,或是同一台機器要管理多個環境,就很容易在指令中反覆加上 -n <namespace>,甚至因為操作錯 namespace 而造成誤用。
這篇文章會示範如何替本機 Minikube 額外建立一個 context,讓 kubectl 預設操作 dockertest namespace。範例會保留既有 Minikube 的 cluster 與 user 設定,只新增一份輕量的 kubeconfig,用來管理不同操作情境。
什麼是 kubectl context?
在 kubeconfig 中,context 可以理解成一組「要用哪個叢集、哪個使用者、哪個 namespace」的操作設定。它通常由三個欄位組成:
| 欄位 | 說明 |
|---|---|
cluster |
指向要連線的 Kubernetes 叢集 |
user |
指向連線時使用的憑證或身分 |
namespace |
指定預設操作的 namespace |
當目前 context 已經帶有 namespace 時,執行 kubectl get pod、kubectl apply -f ... 這類指令時,就會自動套用該 namespace,不需要每次都手動補上 -n dockertest。
準備 kubeconfig 檔案
在這個範例中,~/.kube/config 是 Minikube 產生的主要 kubeconfig,裡面已經包含 minikube cluster、minikube user 與相關憑證。接著我們會新增一個 dockertest-config,只負責定義額外的 context。
先進入 ~/.kube 目錄,可以看到原本的 config,以及後續要加入的 dockertest-config。
dockertest-config 的內容如下:
1 | apiVersion: v1 |
這份設定檔沒有重新定義 cluster 與 user,而是引用主要 kubeconfig 中既有的 minikube 設定。也就是說,它只補上一個新的 context:dockertest-context,並且把預設 namespace 指向 dockertest。
合併多個 kubeconfig
kubectl 預設會讀取 ~/.kube/config。如果要同時讀取多個 kubeconfig,可以透過 KUBECONFIG 環境變數指定檔案清單。
在 Linux 或 macOS 環境中,多個 kubeconfig 路徑使用冒號 : 分隔:
1 | export KUBECONFIG=~/.kube/config:~/.kube/dockertest-config |
如果希望每次登入 shell 後都自動套用這個設定,可以將它加入 ~/.bashrc。
設定完成後重新登入 shell,或執行下列指令讓目前 shell 重新載入設定:
1 | source ~/.bashrc |
檢查目前可用的 context
完成 KUBECONFIG 設定後,可以使用 kubectl config get-contexts 檢查目前合併後的 context 清單。
1 | kubectl config get-contexts |
畫面中可以看到兩個 context:
minikube:原本的預設 context,namespace 是defaultdockertest-context:新加入的 context,namespace 是dockertest
切換目前使用的 context
確認 dockertest-context 已經出現在清單後,就可以使用 kubectl config use-context 切換目前 context。
1 | kubectl config use-context dockertest-context |
切換完成後,再次執行 kubectl config get-contexts,可以看到 CURRENT 欄位的星號已經移到 dockertest-context。
如果只想確認目前使用中的 context 名稱,可以執行:
1 | kubectl config current-context |
輸出結果會是目前作用中的 context:
1 | dockertest-context |
查看目前 context 的完整設定
kubectl config view --minify 可以只顯示目前 context 相關的設定。這在確認 namespace、cluster 與 user 是否正確套用時很實用。
1 | kubectl config view --minify |
從輸出可以看到,目前 context 的 namespace 已經是 dockertest,cluster 與 user 則仍然使用 Minikube 原本的設定。
驗證預設 namespace 是否生效
最後可以透過一般的 kubectl 查詢指令確認 namespace 是否正確生效。因為目前 context 已經指定 dockertest namespace,所以執行 kubectl get all 時,不需要額外加上 -n dockertest。
1 | kubectl get all |
如果 dockertest namespace 內已經有部署資源,就會直接看到該 namespace 下的 Pod、Service、Deployment 與 ReplicaSet。
常用 context 管理指令整理
以下整理幾個管理 context 時常用的 kubectl config 指令:
| 指令 | 用途 |
|---|---|
kubectl config get-contexts |
查看目前 kubeconfig 中所有 context |
kubectl config current-context |
顯示目前正在使用的 context |
kubectl config use-context <context-name> |
切換目前使用的 context |
kubectl config view --minify |
只顯示目前 context 相關設定 |
kubectl config set-context <context-name> --cluster=<cluster-name> --user=<user-name> --namespace=<namespace-name> |
建立或更新 context 設定 |
kubectl config set-context <context-name> --namespace=<namespace> |
修改指定 context 的預設 namespace |
kubectl config rename-context <old-name> <new-name> |
重新命名 context |
kubectl config delete-context <context-name> |
刪除指定 context |
如果只是想替既有 context 修改預設 namespace,也可以直接執行:
1 | kubectl config set-context minikube --namespace=dockertest |
建立、重新命名與刪除 context
除了切換 context 之外,kubectl config 也可以直接建立、重新命名或刪除 context。建立 context 時,需要指定要引用的 cluster、user 與預設 namespace:
1 | kubectl config set-context <新context-名稱> --cluster=<cluster-名稱> --user=<user-名稱> --namespace=<namespace-名稱> |
如果 context 名稱需要調整,可以使用 rename-context:
1 | kubectl config rename-context <舊名稱> <新名稱> |
不再需要的 context 則可以用 delete-context 移除:
1 | kubectl config delete-context <context-名稱> |
不過在需要保留原本 minikube context,又想額外建立不同 namespace 操作入口時,使用獨立 kubeconfig 定義新的 context 會更清楚,也比較容易管理。
小結
kubectl context 可以讓我們把「叢集、使用者、namespace」整理成可切換的操作環境。透過額外 kubeconfig 定義 dockertest-context,再用 KUBECONFIG 將它與原本的 ~/.kube/config 合併,就能在不複製憑證設定的情況下,建立一個預設操作 dockertest namespace 的工作情境。
這種方式很適合用在本機開發、測試 namespace 切換,或是需要同時管理多組 Kubernetes 操作環境的情境。只要先確認目前 context,再執行部署或查詢指令,就能降低操作錯 namespace 或錯叢集的風險。