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