k8s kubeconfig配置文件

发布时间 2023-08-02 19:19:56作者: 小吉猫

kubeconfig配置文件

基于无状态协议HTTP/HTTPS的API Server需要验证每次连接请求中的用户身份,因而kube-controller-manager、kube-scheduler和kube-proxy等各类客户端组件必须能自动完成身份认证信息的提交,但通过程序选项来提供这些信息会导致敏感信息泄露。另外,管理员还面临着使用kubectl工具分别接入不同集群时的认证及认证信息映射难题。为此,Kubernetes设计了一种称为kubeconfig的配置文件,它保存有接入一到多个Kubernetes集群的相关配置信息,并允许管理员按需在各配置间灵活切换
默认情况下,kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。 你可以通过设置 KUBECONFIG 环境变量或者设置 --kubeconfig参数来指定其他 kubeconfig 文件。

支持多集群、用户和身份认证机制

假设你有多个集群,并且你的用户和组件以多种方式进行身份认证。比如:

  正在运行的 kubelet 可能使用证书在进行认证。
  用户可能通过令牌进行认证。
  管理员可能拥有多个证书集合提供给各用户。
使用 kubeconfig 文件,你可以组织集群、用户和命名空间。你还可以定义上下文,以便在集群和命名空间之间快速轻松地切换。

上下文(Context)

通过 kubeconfig 文件中的 context 元素,使用简便的名称来对访问参数进行分组。 每个 context 都有三个参数:cluster、namespace 和 user。 默认情况下,kubectl 命令行工具使用 当前上下文 中的参数与集群进行通信。

查看当前上下文

# kubectl config get-contexts --kubeconfig=$HOME/.kube/kube-dev.config 
CURRENT   NAME       CLUSTER       AUTHINFO       NAMESPACE
          exp-test   development   experimenter   default

切换当前上下文

# kubectl config use-context exp-test --kubeconfig=$HOME/.kube/kube-dev.config
CURRENT   NAME       CLUSTER       AUTHINFO       NAMESPACE
*         exp-test   development   experimenter   default

KUBECONFIG 环境变量

KUBECONFIG 环境变量包含一个 kubeconfig 文件列表。 对于 Linux 和 Mac,此列表以英文冒号分隔。对于 Windows,此列表以英文分号分隔。 KUBECONFIG 环境变量不是必需的。 如果 KUBECONFIG 环境变量不存在,kubectl 将使用默认的 kubeconfig 文件:$HOME/.kube/config。

如果 KUBECONFIG 环境变量存在,kubectl 将使用 KUBECONFIG 环境变量中列举的文件合并后的有效配置。

kubeconfig文件格式

kubeconfig文件中,各集群的接入端点以列表形式定义在clusters配置段中,每个列表项代表一个Kubernetes集群,并拥有名称标识;各身份认证信息(credentials)定义在users配置段中,每个列表项代表一个能够认证到某Kubernetes集群的凭据。将身份凭据与集群分开定义以便复用,具体使用时还要以context(上下文)在二者之间按需建立映射关系,各context以列表形式定义在contexts配置段中,而当前使用的映射关系则定义在current-context配置段中。

查看kubeconfig文件内容

kubectl config view命令能打印kubeconfig文件的内容,下面的命令结果显示了默认路径下的文件配置,包括集群列表、用户列表、上下文列表以及当前使用的上下文(current-context)等。
# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:6443
  name: cluster1
contexts:
- context:
    cluster: cluster1
    user: admin
  name: context-cluster1
current-context: context-cluster1
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

kubectl config的常用子命令

用户也可以在kubeconfig配置文件中按需自定义相关的配置信息,以实现使用不同的用户账户接入集群等功能。kubeconfig是一个文本文件,尽管可以使用文本处理工具直接编辑它,但强烈建议用户使用kubectl config及其子命令进行该文件的设定,以便利用其他自动进行语法检测等额外功能。
view:打印kubeconfig文件内容。
set-cluster:设定新的集群信息,以单独的列表项保存于clusters配置段。
set-credentials:设置认证凭据,保存为users配置段的一个列表项。
set-context:设置新的上下文信息,保存为contexts配置段的一个列表项。
use-context:设定current-context配置段,确定当前以哪个用户的身份接入到哪个集群之中。
delete-cluster:删除clusters中指定的列表项。
delete-context:删除contexts中指定的列表项。
get-clusters:获取clusters中定义的集群列表。
get-contexts:获取contexts中定义的上下文列表。
kubectl config命令的相关操作将针对加载的单个kubeconfig文件进行,它根据其优先级由高到低,依次搜索--kubeconfig选项指定的文件、KUBECONFIG环境变量指定的文件和默认的.HOME/.kube/config文件,以其中任何一种方式加载到配置文件后即可终止搜索过程。不过,kubectl config命令支持同时使用多个kubeconfig文件,以及将多个配置文件合并为一个。

X509数字证书身份凭据

生成私钥

# (umask 077; openssl genrsa -out mason.key 2048)

创建证书签署请求

-subj选项中CN的值将被API Server识别为用户名,O的值将被识别为用户组。
# openssl req -new -key mason.key -out mason.csr -subj "/CN=mason/O=developers"

签署证书请求

# openssl x509 -req -days 365 -CA /etc/kubernetes/ssl/ca.pem -CAkey /etc/kubernetes/ssl/ca-key.pem -CAcreateserial -in mason.csr -out mason.crt
Certificate request self-signature ok
subject=CN = mason, O = developers

查看证书信息

# ls
mason.crt  mason.csr  mason.key

自定义kubeconfig文件

添加集群配置

# kubectl config set-cluster developer --embed-certs=true --certificate-authority=/etc/kubernetes/ssl/ca.pem --server="https://127.0.0.1:6443" --kubeconfig=$HOME/.kube/kube-dev.config
Cluster "developer" set.

添加用户信息

# kubectl config set-credentials mason --embed-certs=true --client-certificate=mason.crt --client-key=mason.key --kubeconfig=$HOME/.kube/kube-dev.config
User "mason" set.

添加上下文信息

# kubectl config set-context developer --cluster=developer --namespace=default --user=mason --kubeconfig=$HOME/.kube/kube-dev.config
Context "developer" created.

查看kubeconfig文件信息

# kubectl config view --kubeconfig=$HOME/.kube/kube-dev.config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:6443
  name: developer
contexts:
- context:
    cluster: developer
    namespace: default
    user: mason
  name: developer
current-context: ""
kind: Config
preferences: {}
users:
- name: mason
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

设置当前上下文

# kubectl config use-context developer  --kubeconfig=$HOME/.kube/kube-dev.config
Switched to context "developer".

查看当前上下文

# kubectl config get-contexts --kubeconfig=$HOME/.kube/kube-dev.config 
CURRENT   NAME        CLUSTER     AUTHINFO   NAMESPACE
*         developer   developer   mason      default

使用上下文测试访问资源

# kubectl get ns/default --kubeconfig=$HOME/.kube/kube-dev.config
Error from server (Forbidden): namespaces "default" is forbidden: User "mason" cannot get resource "namespaces" in API group "" in the namespace "default"
虽然提示权限错误,但mason用户已被API Server正确识别,以上,我们通过创建自定义的数字证书,实现了将mason用户认证到API Server,并将该用户的身份凭据保存至kubeconfig文件中。

删除kubeconfig文件信息

要删除用户,可以运行 kubectl --kubeconfig=$HOME/.kube/kube-dev.config config unset users.<name>
要删除集群,可以运行 kubectl --kubeconfig=$HOME/.kube/kube-dev.config config unset clusters.<name>
要删除上下文,可以运行 kubectl --kubeconfig=$HOME/.kube/kube-dev.config config unset contexts.<name>

多kubeconfig文件与合并

合并 kubeconfig 文件时使用的规则

1. 如果设置了 --kubeconfig 参数,则仅使用指定的文件。不进行合并。此参数只能使用一次。

   否则,如果设置了 KUBECONFIG 环境变量,将它用作应合并的文件列表。根据以下规则合并 KUBECONFIG 环境变量中列出的文件:

     忽略空文件名。
     对于内容无法反序列化的文件,产生错误信息。
     第一个设置特定值或者映射键的文件将生效。
     永远不会更改值或者映射键。示例:保留第一个文件的上下文以设置 current-context。 示例:如果两个文件都指定了 red-user,则仅使用第一个文件的 red-user 中的值。 即使第二个文件在 red-user 下有非冲突条目,也要丢弃它们。

     否则,使用默认的 kubeconfig 文件($HOME/.kube/config),不进行合并。

2. 根据此链中的第一个匹配确定要使用的上下文。

     如果存在上下文,则使用 --context 命令行参数。
     使用合并的 kubeconfig 文件中的 current-context。
   这种场景下允许空上下文。     

3. 确定集群和用户。此时,可能有也可能没有上下文。根据此链中的第一个匹配确定集群和用户, 这将运行两次:一次用于用户,一次用于集群。

     如果存在用户或集群,则使用命令行参数:--user 或者 --cluster。
     如果上下文非空,则从上下文中获取用户或集群。
   这种场景下用户和集群可以为空。     
     
4. 确定要使用的实际集群信息。此时,可能有也可能没有集群信息。 基于此链构建每个集群信息;第一个匹配项会被采用:

     如果存在集群信息,则使用命令行参数:--server、--certificate-authority 和 --insecure-skip-tls-verify。
     如果合并的 kubeconfig 文件中存在集群信息属性,则使用这些属性。
     如果没有 server 配置,则配置无效。     

5. 确定要使用的实际用户信息。使用与集群信息相同的规则构建用户信息,但对于每个用户只允许使用一种身份认证技术:

     如果存在用户信息,则使用命令行参数:--client-certificate、--client-key、--username、--password 和 --token。
     使用合并的 kubeconfig 文件中的 user 字段。
     如果存在两种冲突技术,则配置无效。

6. 对于仍然缺失的任何信息,使用其对应的默认值,并可能提示输入身份认证信息。

合并 kubeconfig 文件

kubectl config一次仅能使用单个kubeconfig文件。事实上,若将两个文件路径以冒号分隔并赋值给KUBECONFIG环境变量,也能够让kubectlconfig一次加载多个文件信息,优先级由高到低为各文件自左而右的次序。

设置环境变量

# export KUBECONFIG="$HOME/.kube/config:$HOME/.kube/kube-dev.config"

查看合并上下文

# kubectl config get-contexts
CURRENT   NAME               CLUSTER     AUTHINFO   NAMESPACE
*         context-cluster1   cluster1    admin      
          developer          developer   mason      default

调整合并上下文

# kubectl config use-context developer
Switched to context "developer".

再次查看合并上下文

# kubectl config get-contexts
CURRENT   NAME               CLUSTER     AUTHINFO   NAMESPACE
          context-cluster1   cluster1    admin      
*         developer          developer   mason      default

多个kubeconfig合并成一个文件

# kubectl config view --merge --flatten > $HOME/.kube/kube.config

查看合并kubeconfig文件

# kubectl config view --kubeconfig=$HOME/.kube/kube.config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:6443
  name: cluster1
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:6443
  name: developer
contexts:
- context:
    cluster: cluster1
    user: admin
  name: context-cluster1
- context:
    cluster: developer
    namespace: default
    user: mason
  name: developer
current-context: developer
kind: Config
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: mason
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

还原回管理员上下文

# kubectl config use-context context-cluster1
Switched to context "context-cluster1".

取消环境变量

# unset KUBECONFIG

验证结果

# kubectl config get-contexts
CURRENT   NAME               CLUSTER    AUTHINFO   NAMESPACE
*         context-cluster1   cluster1   admin  

参考文档

https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/