首页 > 其他分享 >k8s kubeconfig配置文件

k8s kubeconfig配置文件

时间:2023-08-02 19:23:18浏览次数:52  
标签:kubectl k8s 配置文件 -- kubeconfig context kube config

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/

标签:kubectl,k8s,配置文件,--,kubeconfig,context,kube,config
From: https://www.cnblogs.com/wangguishe/p/17600637.html

相关文章

  • k8s 学习笔记之 Pod——Pod 的配置
    Pod的配置先研究pod.spec.containers属性,这也是pod配置中最为关键的一项配置。[root@k8s-master01~]#kubectlexplainpod.spec.containersKIND:PodVERSION:v1RESOURCE:containers<[]Object>#数组,代表可以有多个容器FIELDS:name<string>#容器名......
  • k8s 学习笔记之 Pod——Pod 的生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:pod创建过程运行初始化容器(initcontainer)过程运行主容器(maincontainer)容器启动后钩子(poststart)、容器终止前钩子(prestop)容器的存活性探测(livenessprobe)、就绪性探......
  • k8s 学习笔记之 Pod——Pod 的介绍
    Pod的介绍Pod的结构每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:可以以它为依据,评估整个Pod的健康状态可以在根容器上设置Ip地址,其它容器都此Ip(Pod......
  • 个人VSCode Vim基础配置文件
    基础配置项vscode-vim插件由于是一款模拟器,所以它的配置文件是放在settings.json文件中,而不是vimrc文件中,个人也并不推荐将配置放在vimrc文件中,因为这会导致多端同步变的复杂,尽管这款插件可以支持从vimrc文件中读取配置。下面是一些我会在使用vscode-vim插件时配置的vim选项,直接......
  • wix 配置文件,卸载时不删除,安装时不覆盖
    <ComponentId="owc8F8EF6E5A501D48A35E94BCA167BD924"Permanent="yes"NeverOverwrite="yes"Guid="68d6eb14-aca9-ac59-9db7-05e5d7203cbc"><FileId="owf8F8EF6E5A501D48A35E94BCA167BD924......
  • KubeSphere 3.4.0 发布:支持 K8s v1.26
    2023年07月26日,KubeSphere开源社区激动地向大家宣布,KubeSphere3.4.0正式发布!让我们先简单回顾下之前三个大版本的主要变化:KubeSphere3.1.0新增了“边缘计算”、“计量计费”等功能,将Kubernetes从云端扩展至边缘;KubeSphere3.2.0新增了对“GPU资源调度管理”......
  • k8s 学习笔记之基础实战入门
    NamespaceNamespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的n......
  • k8s 学习笔记之资源管理方式
    三种管理方式命令式对象管理:直接使用命令去操作k8s资源kubectlrunnginx-pod--image=nginx:1.17.1--port=80命令式对象配置:通过命令配置和配置文件操作k8s资源kubectlcreate/patch-fnginx-pod.yaml命令式声明配置:通过apply命令和配置文件操作k8s资源kubectl......
  • k8s 学习
    标签(空格分隔):k8s学习一.什么是k8s自动化的容器运维工具。二.k8s的相关概念cluster集群Master主控KubernetesAPIService(k8sAPI服务)--对外KubernetesControllerManager(k8s控制管理器)--管理和自动修复KubernetesScheduler(k8s调度器)--调度pod到节点Etcd(保存集群的所有网络配置......
  • java 自定义读取properties配置文件属性
    把属性存到一个map里,并提供get方法,如果没有获取到值,则重新加载一遍配置文件,重新赋值,从而刷新数packagecom.aaa.demo.testProperties;importjava.io.IOException;importjava.io.InputStream;importjava.util.Enumeration;importjava.util.HashMap;importjava.util.Map;......