1. 程式人生 > >Kubernetes之Kubeconfig實現多叢集、多使用者接入的組織、管理

Kubernetes之Kubeconfig實現多叢集、多使用者接入的組織、管理

概述

kubectl命令訪問叢集時,預設情況下在$HOME/.kube目錄下尋找名為config的配置檔案,配置檔案中包含叢集ip地址、埠號、使用者名稱、密碼、證書、名稱空間等資訊,kubectl據此建構訪問叢集的上下文。也可以通過KUBECONFIG環境變數或者--kubeconfig覆蓋預設配置檔案。在實際應用中,往往需要同時使用多套環境如開發、測試、顯示、生產等。一個kubectl客戶端需要使用多個使用者、多種認證授權機機制,訪問不同叢集、不同名稱空間。Kubernetes通過Kubeconfig為kubectl命令組織管理各種不同的接入場景。

場景

假設有兩個叢集,一個用於開發,稱為development叢集。另一個用於測試,稱為scrach叢集。在development叢集中,前端開發工作在fronted名稱空間下,儲存開發工作在storage名稱空間下。在scrach叢集中,預設工作在default名稱空間下,使用者可根據需要自行建立名稱空間。訪問development叢集使用證書進行身份認證,scrach叢集使用使用者名稱密碼。

定義叢集、使用者、上下文

建立config-exercise目錄,在目錄下建立檔案config-demo,加入如下內容:

apiVersion: v1
kind: Config
preferences: {}

clusters:
- cluster:
  name: development
- cluster:
  name: scratch

users:
- name: developer
- name: experimenter

contexts:
- context:
  name: dev-frontend
- context:
  name: dev-storage
- context:
  name: exp-scratch

以上內容涉及兩個叢集、兩個使用者、三種訪問上下文,它是組織管理多使用者多叢集接入的框架,只是定義了名稱,需要在後續操作中加入具體內容。

進入config-exercise目錄,新增與叢集有關的詳細資訊:

kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
kubectl config --kubeconfig=config-demo set-cluster scratch --server=https://5.6.7.8 --insecure-skip-tls-verify

新增使用者詳細資訊:

kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
kubectl config --kubeconfig=config-demo set-credentials experimenter --username=exp --password=some-password

新增上下文詳細資訊:

kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development --namespace=storage --user=developer
kubectl config --kubeconfig=config-demo set-context exp-scratch --cluster=scratch --namespace=default --user=experimenter

 直接開啟config-demo或者通過如下命令檢視修改後的檔案內容:

kubectl config --kubeconfig=config-demo view

其內容如下:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: fake-ca-file
    server: https://1.2.3.4
  name: development
- cluster:
    insecure-skip-tls-verify: true
    server: https://5.6.7.8
  name: scratch
contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: scratch
    namespace: default
    user: experimenter
  name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
  user:
    client-certificate: fake-cert-file
    client-key: fake-key-file
- name: experimenter
  user:
    password: some-password
    username: exp

 每個context是一個三元組:使用者、叢集、名稱空間。如dev-frontend上下文表述的意思是利用developer使用者的證書訪問development叢集中的fronted名稱空間。current-context欄位內容表示當前生效的上下文,目前為空,通過如下命令切換當前生效上下文:

kubectl config --kubeconfig=config-demo use-context dev-frontend

只檢視與當前上下文相關的配置:

kubectl config --kubeconfig=config-demo view --minify

 輸出:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: fake-ca-file
    server: https://1.2.3.4
  name: development
contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
current-context: dev-frontend
kind: Config
preferences: {}
users:
- name: developer
  user:
    client-certificate: fake-cert-file
    client-key: fake-key-file

如果想切換到scrach環境,則:

kubectl config --kubeconfig=config-demo use-context exp-scratch

 切換到development環境中的storage名稱空間:

kubectl config --kubeconfig=config-demo use-context dev-storage

在config-exercise目錄下建立另一個配置檔案config-demo-2,內容如上:

apiVersion: v1
kind: Config
preferences: {}

contexts:
- context:
    cluster: development
    namespace: ramp
    user: developer
  name: dev-ramp-up

 效果與在config-demo檔案加入新的context相同。

設定KUBECONFIG環境變數

在以上kubectl命令中,通過--kubeconfig選項指定配置檔案路徑。另一種方法是設定KUBECONFIG環境變數,列出配置檔案路徑,如:

export  KUBECONFIG=$KUBECONFIG:config-demo:config-demo-2

 在config-exercise目錄下執行:

kubectl config view

輸出結果為所有可用context的合集,如下:

contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: ramp
    user: developer
  name: dev-ramp-up
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: scratch
    namespace: default
    user: experimenter
  name: exp-scratch