Kubernetes kubeconfig配置文件详细解读

news/2024/11/24 0:04:29/

 

kubeconfig配置文件


 

在node节点上可以执行kubectl命令吗?


[root@k8s-node1 ~]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

localhost:8080 这个端口是k8s api(kube-apiserver非安全端口)的端口,在master上面可以执行成功其实走的是配置文件。但是在node上连接的是本地的非安全端口。

其实还有一个对外端口是6443,这个是kube-apiserver监听的,masterip:6443安全端口

[root@k8s-master ~]# netstat -tpln | grep 6443
tcp6       0      0 :::6443                 :::*                    LISTEN      92617/kube-apiserve 

 

 

什么叫安全端口,什么叫非安全端口


kube-apiserver两个端口:

  • - localhost:8080  非安全端口(不需要认证,没有加入认证机制),是kubectl默认先连接8080,如果你配置kubeconfig(.kube/config)就直接走这个配置连接的安全端口(在master上没有8080端口,走的是kubeconfig)
  • - masterip:6443  安全端口 ,提供了内部授权的机制,比如登入网站想要输入用户名密码才能登入。

kubeadm安装的默认禁用了8080端口,二进制安装默认是启用的,他们两个区别在于有没有加入身份认证,即鉴权。这个文件在这个目录下面,在root家目录下面。这个配之文件是在安装最后一步拷贝过来的

[root@k8s-master ~]# ls .kube/
cache  config

最后,拷贝连接k8s集群的认证文件到默认路径下

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

可以看到读取到的是该配置文件 

[root@k8s-master .kube]# ls
cache  config
[root@k8s-master .kube]# mv config config.bak
[root@k8s-master .kube]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?[root@k8s-master .kube]# mv config.bak config
[root@k8s-master .kube]# kubectl get node
NAME         STATUS   ROLES    AGE    VERSION
k8s-master   Ready    master   3d7h   v1.19.0
k8s-node1    Ready    <none>   3d6h   v1.19.0
k8s-node2    Ready    <none>   3d6h   v1.19.0

关闭8080端口就是希望你使用配置文件去连接安全端口,这样是安全的,非安全端口是绝对不能对外提供服务的,如果对外提供服务别人扫描到你api做一些恶意的操作,整个集群可能就挂了,即使有这个端口也是监听在本地,也就是只能这台机器去连接。

 

让Node使用kubectl命令


现在知道了kubectl怎么连接集群和管理集群,它是通过kubeconfig这个文件连接过去的。这个文件到底是怎么样生成的呢? 

[root@k8s-master ~]# scp /root/.kube/config  root@192.168.179.103:~[root@k8s-node1 ~]# ls
anaconda-ks.cfg  config
[root@k8s-node1 ~]# kubectl get node --kubeconfig=config 
NAME         STATUS   ROLES    AGE    VERSION
k8s-master   Ready    master   3d7h   v1.19.0
k8s-node1    Ready    <none>   3d6h   v1.19.0
k8s-node2    Ready    <none>   3d6h   v1.19.0

 

kubeconfig生成与文件结构


kubeconfig这个文件是通过kubectl config指令生成的

clusters:
- cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXhOVEEyTlRZeU5sb1hEVE13TVRFeE16QTJOVFl5Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSmZsCmtaVVhUcVJ3ZjJVeDdqS1pjQURvaHV1aHNXcHAvK2NIOEF1MVpmR3JqN0lTb3VoelVISkZ5cGR5ekdoTDFBRHgKMTkxVlVCN1ZCWlk4cXBDRHYyRnZvWkRFbFVYR1JrTFFDT0lxc1hOVUt3ZU0xdnJqZnpZVW5ZNGN6NDhKNDdpTgpnUjJHRGtsWUlrZFpGZEU1ekN2eitldEtEVVUzdE5GV0djL00yZFE0NUIxNGZlTldpTUR3T0l3dTBSSWRvYmpnCndmSnhoVlJHMmgzdEplL0RpUjQ2cXI1NEdMVUU2VXNDUGJvZ0JxNTVBakt2c2NiOWUzeGdzMVJhZW1BdFZhd08KSFNjRkRDYWhBZDVPUlgzMlIzSGNoRnY2QmFwczgyb0dqUDBLOEY1RXNQWkFYQXFoK3c0UTFMRWQ2aHRuQWhyWAoxcmJ5cTF4eUNESnhhbENaSHBjQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZPZXFad29TeUxrVDVKWXlRNURMamUzRFRHUjJNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCemtMRXMzUGhIN08wYWs5VWlTbFhDVTljK1RoYlZaTmZVUStKS1JpQU5KQys5Qm8vZApLdUlLYWhxQlE5UkprSk53TmVwT0NJOWxzcGJ4TGtHK3ArYktHV29Yb25CME5RdnZoZTRQd0p0dmdUcGlhVmVYCmNLejhUMDBRT1YyRzR0WEtmaTViK0dvZDA3NktlZm4zbm00U0l1VDh6bmNDclUxeHRpQTRSU3RQRVZZZTRQalAKY2p6MHJVS3BnTmhJL0lYc2JPVDNYV0hFNE4vU0VLcmtIYkRJNFpEUGRYa2gxd3piM1FZODFuZTh1enBNQVJ5VwpLbkx6R1NRaGJ0WTlWRUZkdlhGK0wreWFrQjcrR29xa1lJa1BNdURveFRoeTBuMFJjZStSTUhtZkFQSEh2RDFyCjdSNC9xdlpBLzA4Q0hxb3ZDcCsxUzNXbFE5WE5MRzE3TWExTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==server: https://192.168.179.102:6443name: kubernetes

在上面部分是配置集群的,即要连接的k8s集群主节点IP是多少,并且里面包含了相关证书。

Context指定上下文,和指定当前使用哪个上下文。

在配置文件当中可能会存在多个集群,现在只有一个集群是我刚刚搭建的。你再搭建一个集群是可以将两个配置文件进行合并,两个配置文件合并在一个配置文件里面。合并在一起就可以使用这一个配置文件去切换着连接两个不通的集群,切换的操作实际上就是指定上下文的操作。(上下文引用了集群信息,和客户端信息)

两个文件合并为一个文件,这个得修改要不冲突

  name: kubernetes  修改为  name: kubernetes1
users:
- name: kubernetes-admin  修改为 kubernetes-admin1

 name: kubernetes-admin1@kubernetes1  这样就切换到另外一个集群了,最后是客户端的认证,即客户端以什么身份连接过来的,上下文就是资源的关联。

 

总结


什么是 kubectl?

官方文档中介绍 kubectl 是:

Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。Kubectl 的配置文件在$HOME/.kube 目录。我们可以通过设置 KUBECONFIG 环境变量或设置命令参数--kubeconfig 来指定其他位置的 kubeconfig 文件。

也就是说,可以通过 kubectl 来操作 K8S 集群,基本语法:

使用以下语法 kubectl 从终端窗口运行命令:

kubectl [command] [TYPE] [NAME] [flags]

其中 commandTYPENAME 和 flags 分别是:

  • command:指定要对一个或多个资源执行的操作,例如 creategetdescribedelete

  • TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:

```shell
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
- `NAME`:指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息 `kubectl get pods`。在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件:- 要按类型和名称指定资源:- 要对所有类型相同的资源进行分组,请执行以下操作:`TYPE1 name1 name2 name<#>`。例子:`kubectl get pod example-pod1 example-pod2`- 分别指定多个资源类型:`TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>`。例子:`kubectl get pod/example-pod1 replicationcontroller/example-rc1`
- 用一个或多个文件指定资源:`-f file1 -f file2 -f file<#>`- [使用 YAML 而不是 JSON](https://kubernetes.io/zh/docs/concepts/configuration/overview/#general-config-tips) 因为 YAML 更容易使用,特别是用于配置文件时。例子:`kubectl get -f ./pod.yaml`
- `flags`: 指定可选的参数。例如,可以使用 `-s` 或 `-server` 参数指定 Kubernetes API 服务器的地

 就如何使用 kubectl 而言,官方文档已经说得非常清楚。不过对于新手而言,还是需要解释几句:

  1. kubectl 是 K8S 的命令行工具,并不需要 kubectl 安装在 K8S 集群的任何 Node 上,但是,需要确保安装 kubectl 的机器和 K8S 的集群能够进行网络互通。

  2. kubectl 是通过本地的配置文件来连接到 K8S 集群的,默认保存在$HOME/.kube 目录下;也可以通过 KUBECONFIG 环境变量或设置命令参数--kubeconfig 来指定其他位置的 kubeconfig 文件【官方文档】。

怎么配置 kubectl? 

  • 第一步,必须准备好要连接/使用的 K8S 的配置文件,笔者给出一份杜撰的配置:
apiVersion: v1
clusters:
- cluster:certificate-authority-data: thisisfakecertifcateauthoritydata00000000000server: https://1.2.3.4:1234name: cls-dev
contexts:
- context:cluster: cls-devuser: kubernetes-adminname: kubernetes-admin@test
current-context: kubernetes-admin@test
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:token: thisisfaketoken00000

解读如下:

  • clusters记录了 clusters(一个或多个 K8S 集群)信息:

    • name是这个 cluster(K8S 集群)的名称代号

    • server是这个 cluster(K8S 集群)的访问方式,一般为 IP+PORT

    • certificate-authority-data是证书数据,只有当 cluster(K8S 集群)的连接方式是 https 时,为了安全起见需要证书数据

  • users记录了访问 cluster(K8S 集群)的账号信息:

    • name是用户账号的名称代号

    • user/token是用户的 token 认证方式,token 不是用户认证的唯一方式,其他还有账号+密码等。

  • contexts是上下文信息,包括了 cluster(K8S 集群)和访问 cluster(K8S 集群)的用户账号等信息:

    • name是这个上下文的名称代号

    • cluster是 cluster(K8S 集群)的名称代号

    • user是访问 cluster(K8S 集群)的用户账号代号

  • current-context记录当前 kubectl 默认使用的上下文信息

  • kindapiVersion都是固定值,用户不需要关心

  • preferences则是配置文件的其他设置信息,笔者没有使用过,暂时不提。

  • 第二步,给 kubectl 配置上配置文件
  1. --kubeconfig参数。第一种办法是每次执行 kubectl 的时候,都带上--kubeconfig=${CONFIG_PATH}。给一点温馨小提示:每次都带这么一长串的字符非常麻烦,可以用 alias 别名来简化码字量,比如alias k=kubectl --kubeconfig=${CONFIG_PATH}

  2. KUBECONFIG环境变量。第二种做法是使用环境变量KUBECONFIG把所有配置文件都记录下来,即export KUBECONFIG=$KUBECONFIG:${CONFIG_PATH}。接下来就可以放心执行 kubectl 命令了。

  3. $HOME/.kube/config 配置文件。第三种做法是把配置文件的内容放到$HOME/.kube/config 内。具体做法为:

    1. 如果$HOME/.kube/config 不存在,那么cp ${CONFIG_PATH} $HOME/.kube/config即可;

    2. 如果如果 $HOME/.kube/config已经存在,那么需要把新的配置内容加到 $HOME/.kube/config 下。单单只是cat ${CONFIG_PATH} >> $HOME/.kube/config是不行的,正确的做法是:KUBECONFIG=$HOME/.kube/config:${CONFIG_PATH} kubectl config view --flatten > $HOME/.kube/config 。解释下这个命令的意思:先把所有的配置文件添加到环境变量KUBECONFIG中,然后执行kubectl config view --flatten打印出有效的配置文件内容,最后覆盖$HOME/.kube/config 即可。

请注意,上述操作的优先级分别是 1>2>3,也就是说,kubectl 会优先检查--kubeconfig,若无则检查KUBECONFIG,若无则最后检查$HOME/.kube/config,如果还是没有,报错。但凡某一步找到了有效的 cluster,就中断检查,去连接 K8S 集群了。

  • 第三步:配置正确的上下文

按照第二步的做法,如果配置文件只有一个 cluster 是没有任何问题的,但是对于有多个 cluster 怎么办呢?到这里,有几个关于配置的必须掌握的命令:

  • kubectl config get-contexts。列出所有上下文信息。

    图片

  • kubectl config current-context。查看当前的上下文信息。其实,命令 1 线束出来的*所指示的就是当前的上下文信息。

    图片

  • kubectl config use-context ${CONTEXT_NAME}。更改上下文信息。

    图片

  • kubectl config set-context ${CONTEXT_NAME}|--current --${KEY}=${VALUE}。修改上下文的元素。比如可以修改用户账号、集群信息、连接到 K8S 后所在的 namespace。

    图片

    关于该命令,还有几点要啰嗦的:

    • config set-context可以修改任何在配置文件中的上下文信息,只需要在命令中指定上下文名称就可以。而--current 则指代当前上下文。

    • 上下文信息所包括的内容有:cluster 集群(名称)、用户账号(名称)、连接到 K8S 后所在的 namespace,因此有config set-context严格意义上的用法:

      kubectl config set-context [NAME|--current] [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace] [options]

      (备注:[options]可以通过 kubectl options 查看)

综上,如何操作 kubectl 配置都已交代。


http://www.ppmy.cn/news/533006.html

相关文章

Kubernetes kubelet 硬核知识 架构

controller-manager包含了一组控制器&#xff0c;它是整个集群的大脑&#xff0c;每个控制器会关注自己所关注的对象&#xff0c;这些控制器里面都会有一个固定的模式&#xff0c;每个控制器都会通过list watcher&#xff0c;去watch它所关注的对象&#xff0c;当这些对象发生变…

Kubernetes CoreDNS 详解

CoreDNS kube-proxy是运行在每个节点上面的&#xff0c;每个节点上面的kube-proxy其实都是按照同样的规则配置了负载均衡的&#xff0c;比如iptables和ipvs规则&#xff0c;也即是集群上面所有节点它的负载均衡是完全一致的&#xff0c;那么同样集群里面的A服务访问B服务这样的…

Docker 为什么出现 解决哪些问题 VS 虚拟机

传统分层架构 vs 微服务 对于微服务来说&#xff0c;有些服务可能依赖于数据&#xff0c;如果你需要依赖于数据存储&#xff0c;依赖于数据库&#xff0c;它推从的就是每个微服务维护自己的数据库&#xff0c;微服务和微服务之间只是通过网络调用去完成通信。 先从应用架构来看…

秋招·记录

10月23日 多益网络 笔试 G 10月24日 理想汽车 笔试 10月26日 公诚管理咨询 一面 调岗>招标/投标代理 拒 10月26日 广联达 笔试 G 10月27日 创必承 笔试 10月27日 广州乐牛游戏 笔试 10月28日 惠州西文思 一面 10月28日 惠州佰维 一面 10月30日 华勤 笔试 10月30…

TCP 连接建立 故障排查

TCP连接的状态详解以及故障排查 我们通过了解TCP各个状态&#xff0c;可以排除和定位网络或系统故障时大有帮助。 1、TCP状态 了解TCP之前&#xff0c;先了解几个命令&#xff1a; linux查看tcp的状态命令&#xff1a; 1) netstat -nat 查看TCP各个状态的数量 2)lsof -i:…

Pormetheus k8s服务发现配置详解

创建sa账号&#xff0c;在k8s集群的master节点操作 #创建一个sa账号 对sa账号授权&#xff0c;这样普罗米修斯才能对k8s集群有一定的权限&#xff0c;采集其他节点的信息。、 [rootmaster ~]# kubectl create serviceaccount monitor -n monitor serviceaccount/monitor crea…

Ubuntu 22.04 一次及其繁琐的 允许 Traceroute 探测漏洞修复之旅

前言&#xff1a;允许 Traceroute 探测是绿盟漏洞扫描器报出来的一个漏洞&#xff0c;如下图&#xff1a; 我的系统是ubuntu 22.04&#xff0c;但由于是用户提供的虚拟机&#xff0c;会有些定制的部分&#xff0c;具体定制了哪部分就不知道了&#xff0c;直接描述问题。 解决问…

RK3399教程:wifi驱动调试技巧

公众号 欢迎扫码关注本人微信公众号&#xff1a;公众号上分享更多嵌入式知识和资料&#xff0c;分享个人学习嵌入式的心得体会。欢迎大家一起来玩呀。 疑问点&#xff1f; Android hal层需要配置那些东西&#xff1f; rk3399的wifi模组自适应支持多款wifi是什么技术原理&am…