跳至主要内容

Security - User Management with Kubernetes Context

Kubernetes Context 是什麼?

Context

Kubernetes Contextkubectl 用來管理多個 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-dataclient-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

解析各個部分

  1. clusters
    • 包含叢集的連線資訊,如 API 伺服器位址 (server) 和憑證資料 (certificate-authority-data)。
    • 這裡的叢集名稱是 gke_my-project_us-central1-a_my-cluster
  2. contexts
    • 定義了上下文(context),將 clusteruser 進行配對。這裡的 context 會與 gke_my-project_us-central1-a_my-cluster 相關聯。
  3. current-context
    • 這告訴 kubectl 目前使用的 context,確保 kubectl 指令會針對該叢集執行。
  4. users
    • 包含 gcp 驗證提供者設定,這些資訊來自 gcloud,並包括存取令牌 (access-token) 和令牌的有效期限。

gcloud container clusters get-credentials

首先,值得注意的是,gcloud container clusters get-credentials 會自動幫你設置叢集和使用者的設定,但如果你需要手動設定或更新 kubeconfig,可以使用 set-clusterset-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>

參數:

  • <CLUSTER_NAME>:GKE 叢集的名稱。
  • <ZONE>:叢集所在的區域或區域。
  • <PROJECT_ID>:Google Cloud 專案 ID。
  • <CA_FILE_PATH>:憑證授權的路徑,通常來自 certificate-authority-data
  • <API_SERVER_URL>:Kubernetes API 伺服器的 URL,通常以 https:// 開頭。

範例:

gcloud container clusters set-cluster my-cluster \
--zone us-central1-a \
--project my-project \
--certificate-authority ./ca.crt \
--server https://35.231.123.456

這個指令會將 my-cluster 叢集的連線資訊添加到 kubeconfig,包括 API 伺服器位址和憑證。


gcloud container clusters set-credentials

這個指令用來設定與 Kubernetes 叢集互動的使用者認證資訊,通常用於設定 OAuth 令牌、私密金鑰等。

語法:

gcloud container clusters set-credentials <USER_NAME> \
--project <PROJECT_ID> \
--zone <ZONE> \
--token <ACCESS_TOKEN>

參數:

  • <USER_NAME>:使用者名稱,用來與 Kubernetes 叢集進行認證。
  • <PROJECT_ID>:Google Cloud 專案 ID。
  • <ZONE>:叢集所在的區域。
  • <ACCESS_TOKEN>:授權的訪問令牌。

範例:

gcloud container clusters set-credentials developer \
--project my-project \
--zone us-central1-a \
--token ABCDEFGHIJKLMNOPQRSTUVWXYZ12345

這會將 developer 使用者的訪問令牌添加至 kubeconfig


結論

Kubernetes Context 提供了靈活的環境管理方式,使開發者與管理員能夠輕鬆切換不同叢集與用戶,提高操作效率並降低錯誤風險。