Security - User Management with Kubernetes Context
Kubernetes Context 是什麼?
Kubernetes Context 是 kubectl 用來管理多個 Kubernetes 叢集與使用者身份的機制,使開發者能夠快速切換不同的環境。
Context 的組成
一個 Kubernetes Context 由以下幾個部分組成:
- Cluster:指向 Kubernetes 叢集的 API 伺服器地址(
server參數)。 - User:與該 Context 相關聯的用戶憑證,決定使用者身份與權限。
- Namespace:設定預設的命名空間,避免在
kubectl命令中手動指定。
可以使用 kubectl config get-contexts 來查看所有可用的 Context,並使用 kubectl config use-context <context-name> 切換至指定的 Context。
Context 的範例
kubectl.exe config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://kubernetes.docker.internal:6443
name: docker-desktop
contexts:
- context:
cluster: docker-desktop
user: docker-desktop
name: docker-desktop
current-context: docker-desktop
kind: Config
preferences: {}
users:
- name: docker-desktop
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
Context 重點整理
1. Clusters
- 定義 Kubernetes 叢集的連線資訊。
- 包含 certificate-authority-data (憑證) 及 server (API 伺服器位址)。
- 此處設定的叢集名稱為 docker-desktop,位於
https://kubernetes.docker.internal:6443。
2. Contexts
- 指定 Kubernetes 操作的預設環境。
- 由 cluster (叢集) 和 user (使用者憑證) 組成。
- 當前 context 為 docker-desktop,使用 docker-desktop 叢 集與對應的使用者。
3. Users
- 定義與 Kubernetes 互動的憑證資訊。
- 這裡的使用者 docker-desktop 透過 client-certificate-data 及 client-key-data 進行驗證。
建立與管理 Context
新增 Context
kubectl.exe config set-context my-context --cluster=my-cluster --user=my-user --namespace=default
---
Context "my-context" created.
查看可用 Context
kubectl.exe config get-contexts
---
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* docker-desktop docker-desktop docker-desktop
my-context my-cluster my-user default
切換 Context
kubectl.exe config use-context my-context
---
Switched to context "my-context".
刪除 Context
kubectl.exe config delete-context my-context
---
deleted context my-context from C:\Users\calvin\.kube\config
使用 Context 來管理不同環境
多個開發環境
Context 特別適用於管理多個 Kubernetes 叢集,例如:
- 開發環境(development)
- 生產環境(production)
假設你需要在開發環境與生產環境之間切換,可以設定多個 Context,如:
kubectl config set-context development --cluster=dev-cluster --user=developer --namespace=dev
kubectl config set-context production --cluster=prod-cluster --user=admin --namespace=prod
粗略的 kubeconfig
apiVersion: v1
clusters:
- cluster:
name: dev-cluster
- cluster:
name: prod-cluster
contexts:
- context:
cluster: dev-cluster
namespace: dev
user: developer
name: development
- context:
cluster: prod-cluster
namespace: prod
user: admin
name: production
current-context: development
kind: Config
preferences: {}
users:
- name: developer
- name: admin
當你將 kubectl 的 context 從 development 切換到 production 時,
會將目標叢集切換為 prod-cluster,命名空間變更為 prod,並且使用 admin 使用者的憑證來執行操作。
這樣一來,所有後續的 kubectl 指令將針對生產環境進行,確保在正確的環境中執行部署或管理工作,避免誤操作影響開發環境。
GKE 的 Cluster 和 User
由於我們在本地使用 docker-desktop,他只有提供我們一個 cluster,但實務上我們大多用雲端平台整理好的 kubernetes 服務,因此我們介紹 GKE 上的 Context 管理。
範例 GKE kubeconfig 檔案
當你成功使用 gcloud container clusters get-credentials 指令從 Google Kubernetes Engine (GKE) 叢集取得認證並更新你的 kubeconfig 檔案後,kubeconfig 會包含以下資訊:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://35.231.123.456
name: gke_my-project_us-central1-a_my-cluster
contexts:
- context:
cluster: gke_my-project_us-central1-a_my-cluster
user: gke_my-project_us-central1-a_my-cluster
name: gke_my-project_us-central1-a_my-cluster
current-context: gke_my-project_us-central1-a_my-cluster
kind: Config
preferences: {}
users:
- name: gke_my-project_us-central1-a_my-cluster
user:
auth-provider:
config:
access-token: <ACCESS_TOKEN>
cmd-args: config config-helper --format=json
cmd-path: gcloud
expiry: '2025-02-06T00:00:00Z'
expiration-time: '2025-02-06T00:00:00Z'
token-type: Bearer
name: gcp
解析各個部分
- clusters:
- 包含叢集的連線資訊,如 API 伺服器位址 (
server) 和憑證資料 (certificate-authority-data)。 - 這裡的叢集名稱是
gke_my-project_us-central1-a_my-cluster。
- 包含叢集的連線資訊,如 API 伺服器位址 (
- contexts:
- 定義了上下文(context),將
cluster與user進行配對。這裡的context會與gke_my-project_us-central1-a_my-cluster相關聯。
- 定義了上下文(context),將
- current-context:
- 這告訴
kubectl目前使用的 context,確保kubectl指令會針對該叢集執行。
- 這告訴
- users:
- 包含
gcp驗證提供者設定,這些資訊來自gcloud,並包括存取令牌 (access-token) 和令牌的有效期限。
- 包含
gcloud container clusters get-credentials
首先,值得注意的是,gcloud container clusters get-credentials 會自動幫你設置叢集和使用者的設定,但如果你需要手動設定或更新 kubeconfig,可以使用 set-cluster 和 set-credentials 指令。
gcloud container clusters set-cluster
這個指令用來將叢集的連接資訊加入到 kubeconfig,例如 API 伺服器位址、憑證、授權等。
語法:
gcloud container clusters set-cluster <CLUSTER_NAME> \
--zone <ZONE> \
--project <PROJECT_ID> \
--certificate-authority <CA_FILE_PATH> \
--server <API_SERVER_URL>