使用 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 podkubectl apply -f ... 這類指令時,就會自動套用該 namespace,不需要每次都手動補上 -n dockertest

準備 kubeconfig 檔案

在這個範例中,~/.kube/config 是 Minikube 產生的主要 kubeconfig,裡面已經包含 minikube cluster、minikube user 與相關憑證。接著我們會新增一個 dockertest-config,只負責定義額外的 context。

先進入 ~/.kube 目錄,可以看到原本的 config,以及後續要加入的 dockertest-config

dockertest-config 的內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Config
# 這個檔案只替本機 minikube 額外定義一個 context。
# 使用時需搭配既有的 kubeconfig,讓 minikube 的 cluster、user
# 與憑證設定繼續由 $HOME/.kube/config 提供。
contexts:
- name: dockertest-context
context:
cluster: minikube
# 這個 user 必須已經存在於主要 kubeconfig 中。
user: minikube
namespace: dockertest

這份設定檔沒有重新定義 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 是 default
  • dockertest-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 或錯叢集的風險。