第23节 Kubeconfig && token


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

前言

提示

在前面安装k3s & k8s 中,我们认识了 kubeconfig,但是我们依旧对这个东西很陌生

或许,我们必须熟悉他才可以做更多有意义的work

在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证open in new window,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式。

针对一次 Kubeconfig 问题的记录
赵丽颖
 今天 中午 12:18
Ladies and gentlemen, after the agent node deployment, my k3s prompts such an error. What is the cause




23 条回复
新增功能


icsy7867
  26 分钟前
It shouldn't be talking to port 8080.  But 6443.  This usually means kubectl doesn't have access to the yaml conf.
同时发送至频道


赵丽颖
  25 分钟前
Sorry, I don't quite understand the k3s configuration, which files should I modify?


icsy7867
  25 分钟前
Did you move the config to the location you specified?


icsy7867
  25 分钟前
And check the permissions
仅对你可见


Slackbot
  24 分钟前
/etc/rancher/k3s/config.yaml非有效命令。在 Slack 中,所有以 "/" 字符开始的消息都被解析为命令。
如果你尝试发送消息而不是运行命令,请尝试在 "/" 前加空格。


赵丽颖
  24 分钟前
/etc/rancher/k3s/config.yaml 


赵丽颖
  24 分钟前
This is the position?


icsy7867
  20 分钟前
Or k3s.yaml.  not next to a computer


icsy7867
  19 分钟前
Or is it in that directory you specified?  If so try to export that path so kubectl knows where to look


赵丽颖
  19 分钟前
image.png
 
image.png




赵丽颖
  18 分钟前
I didn't use 'K3S_CONFIG_FILE' to specify it


赵丽颖
  18 分钟前
Where should it go?


赵丽颖
  16 分钟前
Even though I specify its location, it seems to be blank
image.png
 
image.png


icsy7867
  16 分钟前
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml


icsy7867
  16 分钟前
Try running this


icsy7867
  14 分钟前
And then kubectl get nodes


赵丽颖
  13 分钟前
Thank you very much for your answer. Are you the maintainer of the k3s community


icsy7867
  11 分钟前
Nope.  Just someone who has stumbled around playing with k3s and happened to see your message :微笑:


赵丽颖
  9 分钟前
Nice to meet you. What you met is a junior undergraduate student from China. There is an assignment about k3s


icsy7867
  5 分钟前
Neat!


icsy7867
  5 分钟前
Nice to meet you


icsy7867
  5 分钟前
And here's a good link
https://headworq.org/en/how-to-connect-to-kubernetes/
headworqheadworq
3 ways to connect to your K3s Kubernetes Cluster
In this article I'll show you three Kubernetes Clients – Kubectl, Lens and Kubenav.
2021118(557 kB)
https://headworq.org/en/how-to-connect-to-kubernetes/



icsy7867
  4 分钟前
The problem was kubectl was looking for a config file, couldn't find one and tried a basic setup.


赵丽颖
  < 1 分钟前
yep, great article, thanks so much for your help

命令参数

kubectl config SUBCOMMAND

选项
      --kubeconfig="": 使用特定的配置文件。

继承自父命令的选项
      --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。
      --api-version="": 和服务端交互使用的API版本。
      --certificate-authority="": 用以进行认证授权的.cert文件路径。
      --client-certificate="": TLS使用的客户端证书路径。
      --client-key="": TLS使用的客户端密钥路径。
      --cluster="": 指定使用的kubeconfig配置文件中的集群名。
      --context="": 指定使用的kubeconfig配置文件中的环境名。
      --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。
      --kubeconfig="": 命令行请求使用的配置文件路径。
      --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。
      --log-dir="": 如果不为空,将日志文件写入此目录。
      --log-flush-frequency=5s: 刷新日志的最大时间间隔。
      --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。
      --match-server-version[=false]: 要求服务端和客户端版本匹配。
      --namespace="": 如果不为空,命令将使用此namespace。
      --password="": API Server进行简单认证使用的密码。
  -s, --server="": Kubernetes API Server的地址和端口号。
      --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。
      --token="": 认证到API Server使用的令牌。
      --user="": 指定使用的kubeconfig配置文件中的用户名。
      --username="": API Server进行简单认证使用的用户名。
      --v=0: 指定输出日志的级别。
      --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。

使用 kubeconfig 文件组织集群访问

使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份验证机制的信息。kubectl命令行工具使用 kubeconfig 文件来查找选择集群和与集群的 API 服务器通信所需的信息。

警告

**注意:**用于配置对集群的访问的文件称为kubeconfig 文件。这是引用配置文件的通用方式。这并不意味着有一个名为kubeconfig.

**警告:**仅使用来自可信来源的 kubeconfig 文件。使用特制的 kubeconfig 文件可能会导致恶意代码执行或文件暴露。如果您必须使用不受信任的 kubeconfig 文件,请先仔细检查它,就像检查 shell 脚本一样。

默认情况下,kubectl查找目录中命名config$HOME/.kube文件。KUBECONFIG您可以通过设置环境变量或设置 --kubeconfigopen in new window标志来指定其他 kubeconfig 文件。

支持多集群、多用户、多认证机制open in new window

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

  • 正在运行的 kubelet 可能会使用证书进行身份验证。
  • 用户可以使用令牌进行身份验证。
  • 管理员可能拥有他们提供给各个用户的证书集。

使用 kubeconfig 文件,您可以组织集群、用户和命名空间。您还可以定义上下文以在集群和名称空间之间快速轻松地切换。

kubectl config use-context 命令快速地在集群之间进行切换。

上下文(Context)

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

kubectl config use-context

KUBECONFIG 环境变量

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

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

合并 kubeconfig 文件

要查看配置,输入以下命令:

[root@iZbp1evo5cnwagauz3w188Z ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://apiserver.cluster.local:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

如前所述,输出可能来自 kubeconfig 文件,也可能是合并多个 kubeconfig 文件的结果。

以下是 kubectl 在合并 kubeconfig 文件时使用的规则。

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

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

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

有关设置 KUBECONFIG 环境变量的示例,请参阅 设置 KUBECONFIG 环境变量open in new window

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

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

  1. 如果存在,使用 --context 命令行参数。
  2. 使用合并的 kubeconfig 文件中的 current-context

这种场景下允许空上下文:

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

  1. 如果存在,使用命令行参数:--user 或者 --cluster
  2. 如果上下文非空,从上下文中获取用户或集群。

这种场景下用户和集群可以为空:

确定要使用的实际集群信息。此时,可能有也可能没有集群信息。基于此链构建每个集群信息;第一个匹配项会被采用:

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

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

  1. 如果存在:--client-certificate--client-key--username--password--token,使用命令行参数。
  2. 使用合并的 kubeconfig 文件中的 user 字段。
  3. 如果存在两种冲突技术,则配置无效。
  4. 对于仍然缺失的任何信息,使用其对应的默认值,并可能提示输入身份认证信息。

文件引用

kubeconfig 文件中的文件和路径引用是相对于 kubeconfig 文件的位置。 命令行上的文件引用是相对于当前工作目录的。 在 $HOME/.kube/config 中,相对路径按相对路径存储,绝对路径按绝对路径存储。

kubeconfig 两种实现方式

  1. 创建 Kubeconfig 文件
    1. 申请证书
    2. 创建 kuberconfig 文件
    3. 验证 kuberconfig 文件
  2. 手动复制证书
    1. 集群环境
    2. 配置方法

代理

你可以在 kubeconfig 文件中,为每个集群配置 proxy-url 来让 kubectl 使用代理,例如:

apiVersion: v1
kind: Config

clusters:
- cluster:
    proxy-url: http://proxy.example.org:3128
    server: https://k8s.example.org/k8s/clusters/c-xxyyzz
  name: development

users:
- name: developer

contexts:
- context:
  name: development

定义集群,用户和 context

假设用户有两个集群,一个用于正式开发工作,一个用于其它临时用途(scratch)。 在 development 集群中,前端开发者在名为 frontend 的名字空间下工作, 存储开发者在名为 storage 的名字空间下工作。在 scratch 集群中, 开发人员可能在默认名字空间下工作,也可能视情况创建附加的名字空间。 访问开发集群需要通过证书进行认证。 访问其它临时用途的集群需要通过用户名和密码进行认证。

创建名为 config-exercise 的目录。在 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-demo 文件中含有描述两个集群、 两个用户和三个上下文的框架。

进入 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

**注意:**

将密码保存到 Kubernetes 客户端配置中有风险。 一个较好的替代方式是使用凭据插件并单独保存这些凭据。 参阅 client-go 凭据插件open in new window

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

::: tip说明:

  • 要删除用户,可以运行 kubectl --kubeconfig=config-demo config unset users.<name>
  • 要删除集群,可以运行 kubectl --kubeconfig=config-demo config unset clusters.<name>
  • 要删除上下文,可以运行 kubectl --kubeconfig=config-demo config unset contexts.<name> :::

生成kubeconfig的配置步骤

定义变量:

export KUBE_APISERVER="https://172.20.0.2:6443" 

设置集群参数:

kubectl config set-cluster kubernetes   --certificate-authority=/etc/kubernetes/ssl/ca.pem   --embed-certs=true   --server=${KUBE_APISERVER}   #可以指定路径kubeconfig=/root/config.conf

说明:集群参数主要设置了所需要访问的集群的信息。使用 set-cluster 设置了需要访问的集群,如上为 kubernetes--certificate-authority设置了该集群的公钥;--embed-certstrue 表示将 --certificate-authority 证书写入到 kubeconfig 中;--server则表示该集群的 kube-apiserver 地址。

设置客户端认证参数:

kubectl config set-credentials admin   --client-certificate=/etc/kubernetes/ssl/admin.pem   --embed-certs=true   --client-key=/etc/kubernetes/ssl/admin-key.pem #可以指定路径kubeconfig=/root/config.conf

说明:用户参数主要设置用户的相关信息,主要是用户证书。如上的用户名为admin,证书为:/etc/kubernetes/ssl/admin.pem,私钥为:/etc/kubernetes/ssl/admin-key.pem。注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证,如kubelet的 TLS Boostrap机制下的bootstrapping使用的就是token认证方式。

设置上下文参数:

kubectl config set-context kubernetes   --cluster=kubernetes   --user=admin #可以指定路径kubeconfig=/root/config.conf

说明:上下文参数将集群参数用户参数关联起来。如上面的上下文名称为kubenetes,集群为kubenetes,用户为admin,表示使用admin的用户凭证来访问kubenetes集群的default命名空间,也可以增加--namspace来指定访问的命名空间。

设置默认上下文

kubectl config use-context kubernetes  #可以指定路径kubeconfig=/root/config.conf

说明:最后使用kubectl config use-context kubernetes来使用名为kubenetes的环境项来作为配置。如果配置了多个环境项,可通过切换不同的环境项名字来访问到不同的集群环境。

默认生成的 kubeconfig 被保存到 ~/.kube/config 文件

END 链接