kubernetes 中 kubeconfig 的用法

  • 2019 年 12 月 20 日
  • 筆記

用於配置集群訪問資訊的文件叫作 kubeconfig 文件,在開啟了 TLS 的集群中,每次與集群交互時都需要身份認證,生產環境一般使用證書進行認證,其認證所需要的資訊會放在 kubeconfig 文件中。此外,k8s 的組件都可以使用 kubeconfig 連接 apiserver,client-go 、operator、helm 等其他組件也使用 kubeconfig 訪問 apiserver。

一、kubeconfig 配置文件的生成

kubeconfig 的一個示例:

apiVersion: v1  clusters:  - cluster:      certificate-authority-data: xxx      server: https://xxx:6443    name: cluster1  - cluster:      certificate-authority-data: xxx      server: https://xxx:6443    name: cluster2  contexts:  - context:      cluster: cluster1      user: kubelet    name: cluster1-context  - context:      cluster: cluster2      user: kubelet    name: cluster2-context  current-context: cluster1-context  kind: Config  preferences: {}  users:  - name: kubelet    user:      client-certificate-data: xxx      client-key-data: xxx

apiVersion 和 kind 標識客戶端解析器的版本和模式,不應手動編輯。 preferences 指定可選(和當前未使用)的 kubectl 首選項。

1、clusters模組

cluster中包含 kubernetes 集群的端點數據,包括 kubernetes apiserver 的完整 url 以及集群的證書頒發機構。

可以使用 kubectl config set-cluster 添加或修改 cluster 條目。

2、users 模組

user 定義用於向 kubernetes 集群進行身份驗證的客戶端憑據。

可用憑證有 client-certificate、client-key、token 和 username/passwordusername/passwordtoken 是二者只能選擇一個,但 client-certificateclient-key 可以分別與它們組合。

可以使用 kubectl config set-credentials 添加或者修改 user 條目。

3、contexts 模組

context 定義了一個命名的cluster、user、namespace元組,用於使用提供的認證資訊和命名空間將請求發送到指定的集群。

三個都是可選的; 僅使用 cluster、user、namespace 之一指定上下文,或指定none

未指定的值或在載入的 kubeconfig 中沒有相應條目的命名值將被替換為默認值。 載入和合併 kubeconfig 文件的規則很簡單,但有很多,具體可以查看載入和合併kubeconfig規則

可以使用kubectl config set-context添加或修改上下文條目。

4、current-context 模組

current-context 是作為cluster、user、namespace元組的 key, 當 kubectl 從該文件中載入配置的時候會被默認使用。

可以在 kubectl 命令行里覆蓋這些值,通過分別傳入--context=CONTEXT、--cluster=CLUSTER、--user=USER 和 --namespace=NAMESPACE。 以上示例中若不指定 context 則默認使用 cluster1-context。

kubectl  get node --kubeconfig=./kubeconfig --context=cluster2-context

可以使用 kubectl config use-context 更改 current-context。

5、kubectl 生成 kubeconfig 的示例

kubectl 可以快速生成 kubeconfig,以下是一個示例:

$ kubectl config set-credentials myself --username=admin --password=secret  $ kubectl config set-cluster local-server --server=http://localhost:8080  $ kubectl config set-context default-context --cluster=local-server --user=myself  $ kubectl config use-context cluster-context  $ kubectl config set contexts.default-context.namespace the-right-prefix  $ kubectl config view

若使用手寫 kubeconfig 的方式,推薦一個工具 kubeval,可以校驗 kubernetes yaml 或 json 格式的配置文件是否正確。

二、使用 kubeconfig 文件配置 kuebctl 跨集群認證

kubectl 作為操作 k8s 的一個客戶端工具,只要為 kubectl 提供連接 apiserver 的配置(kubeconfig),kubectl 可以在任何地方操作該集群,當然,若 kubeconfig 文件中配置多個集群,kubectl 也可以輕鬆地在多個集群之間切換。

kubectl 載入配置文件的順序: 1、kubectl 默認連接本機的 8080 埠 2、從 $HOME/.kube 目錄下查找文件名為 config 的文件 3、通過設置環境變數 KUBECONFIG 或者通過設置去指定其它 kubeconfig 文件

# 設置 KUBECONFIG 的環境變數  export KUBECONFIG=/etc/kubernetes/kubeconfig/kubelet.kubeconfig  # 指定 kubeconfig 文件  kubectl get node --kubeconfig=/etc/kubernetes/kubeconfig/kubelet.kubeconfig  # 使用不同的 context 在多個集群之間切換  kubectl  get node --kubeconfig=./kubeconfig --context=cluster1-context

開篇的示例就是多集群認證方式配置的一種。

參考: https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/