您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页Kuberneteskubeconfig配置文件详细解读

Kuberneteskubeconfig配置文件详细解读

来源:筏尚旅游网
Kuberneteskubeconfig配置⽂件详细解读

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上连接的是本地的⾮安全端⼝。

其实还有⼀个对外端⼝是43,这个是kube-apiserver监听的,masterip:43安全端⼝[root@k8s-master ~]# netstat -tpln | grep 43tcp6 0 0 :::43 :::* LISTEN 92617/kube-apiserve

什么叫安全端⼝,什么叫⾮安全端⼝kube-apiserver两个端⼝:

- localhost:8080 ⾮安全端⼝(不需要认证,没有加⼊认证机制),是kubectl默认先连接8080,如果你配置kubeconfig(.kube/config)就直接⾛这个配置连接的安全端⼝(在master上没有8080端⼝,⾛的是kubeconfig)

- masterip:43 安全端⼝ ,提供了内部授权的机制,⽐如登⼊⽹站想要输⼊⽤户名密码才能登⼊。

kubeadm安装的默认禁⽤了8080端⼝,⼆进制安装默认是启⽤的,他们两个区别在于有没有加⼊⾝份认证,即鉴权。这个⽂件在这个⽬录下⾯,在root家⽬录下⾯。这个配之⽂件是在安装最后⼀步拷贝过来的[root@k8s-master ~]# ls .kube/cache config

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

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config可以看到读取到的是该配置⽂件

[root@k8s-master .kube]# lscache 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 nodeNAME STATUS ROLES AGE VERSIONk8s-master Ready master 3d7h v1.19.0k8s-node1 Ready 3d6h v1.19.0k8s-node2 Ready 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 ~]# lsanaconda-ks.cfg config

[root@k8s-node1 ~]# kubectl get node --kubeconfig=config NAME STATUS ROLES AGE VERSIONk8s-master Ready master 3d7h v1.19.0

k8s-node1 Ready 3d6h v1.19.0k8s-node2 Ready 3d6h v1.19.0

kubeconfig⽣成与⽂件结构

kubeconfig这个⽂件是通过kubectl config指令⽣成的Context指定上下⽂,和指定当前使⽤哪个上下⽂。

在配置⽂件当中可能会存在多个集群,现在只有⼀个集群是我刚刚搭建的。你再搭建⼀个集群是可以将两个配置⽂件进⾏合并,两个配置⽂件合并在⼀个配置⽂件⾥⾯。合并在⼀起就可以使⽤这⼀个配置⽂件去切换着连接两个不通的集群,切换的操作实际上就是指定上下⽂的操作。(上下⽂引⽤了集群信息,和客户端信息)两个⽂件合并为⼀个⽂件,这个得修改要不冲突

name: kubernetes 修改为 name: kubernetes1users:

- 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]

其中 command、TYPE、NAME 和 flags 分别是:

command:指定要对⼀个或多个资源执⾏的操作,例如 create、get、describe、delete。

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

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

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

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 默认使⽤的上下⽂信息kind和apiVersion都是固定值,⽤户不需要关⼼

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

第⼆步,给 kubectl 配置上配置⽂件。

--kubeconfig参数。第⼀种办法是每次执⾏ kubectl 的时候,都带上--kubeconfig=${CONFIG_PATH}。给⼀点温馨⼩提⽰:每次都带这么⼀长串的字符⾮常⿇烦,可以⽤ alias 别名来简化码字量,⽐如alias k=kubectl --kubeconfig=${CONFIG_PATH}。KUBECONFIG环境变量。第⼆种做法是使⽤环境变量KUBECONFIG把所有配置⽂件都记录下来,即exportKUBECONFIG=$KUBECONFIG:${CONFIG_PATH}。接下来就可以放⼼执⾏ kubectl 命令了。

$HOME/.kube/config 配置⽂件。第三种做法是把配置⽂件的内容放到$HOME/.kube/config 内。具体做法为:如果$HOME/.kube/config 不存在,那么cp ${CONFIG_PATH} $HOME/.kube/config即可;

如果如果 $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 查看)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务