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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo 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:6443
name: 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]
其中 command
、TYPE
、NAME
和 flags
分别是:
-
command
:指定要对一个或多个资源执行的操作,例如create
、get
、describe
、delete
。 -
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 而言,官方文档已经说得非常清楚。不过对于新手而言,还是需要解释几句:
-
kubectl 是 K8S 的命令行工具,并不需要 kubectl 安装在 K8S 集群的任何 Node 上,但是,需要确保安装 kubectl 的机器和 K8S 的集群能够进行网络互通。
-
kubectl 是通过本地的配置文件来连接到 K8S 集群的,默认保存在$HOME/.kube 目录下;也可以通过 KUBECONFIG 环境变量或设置命令参数--kubeconfig 来指定其他位置的 kubeconfig 文件【官方文档】。
怎么配置 kubectl?
- 第一步,必须准备好要连接/使用的 K8S 的配置文件,笔者给出一份杜撰的配置:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: thisisfakecertifcateauthoritydata00000000000
server: https://1.2.3.4:1234
name: cls-dev
contexts:
- context:
cluster: cls-dev
user: kubernetes-admin
name: kubernetes-admin@test
current-context: kubernetes-admin@test
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
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 默认使用的上下文信息 -
kind
和apiVersion
都是固定值,用户不需要关心 -
preferences
则是配置文件的其他设置信息,笔者没有使用过,暂时不提。 - 第二步,给 kubectl 配置上配置文件。
-
--kubeconfig
参数。第一种办法是每次执行 kubectl 的时候,都带上--kubeconfig=${CONFIG_PATH}
。给一点温馨小提示:每次都带这么一长串的字符非常麻烦,可以用 alias 别名来简化码字量,比如alias k=kubectl --kubeconfig=${CONFIG_PATH}
。 -
KUBECONFIG
环境变量。第二种做法是使用环境变量KUBECONFIG
把所有配置文件都记录下来,即export KUBECONFIG=$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 查看)
-
综上,如何操作 kubectl 配置都已交代。