简要分析Kubernetes API的使用

简要分析Kubernetes API的使用

0.提要

Kubernetes是一个基于主机集群的容器管理工具,通过Kubernetes,我们可以对主机集群进行“面向服务”的管理。与云主机管理平台拥有一套完整的OpenAPI相似的是,Kubernetes也有可以由http访问的API,我们可以通过访问这些API,获取主机集群正在运行的服务,甚至还可以搭建可定制的Web平台实现人性化的管理功能。本文将简单介绍Kubernetes API的接口功能和获取、调用的方法。

1.获取和调用Kubernetes的API

1.1搭建Kubernetes集群

本文的实验环境是单台CPU2核、内存4G、已绑定公网IP的云主机,Kubernetes的版本为v1.16.0,使用kuboard.cn提供的脚本实现Kubernetes单机快速部署。

更新系统:

yum update -y

设置hostname解析:

hostnamectl set-hostname xxx

echo “127.0.0.1$(hostname)” >> /etc/hosts

安装docker、kubeadm、kubelet、kubectl:

curl -sSLhttps://kuboard.cn/install-script/v1.16.0/install-kubelet.sh | sh

修改master节点hosts配置:

export MASTER_IP=x.x.x.x

export APISERVER_NAME=apiserver.demo

export POD_SUBNET=10.100.0.1/20

echo “${MASTER_IP}${APISERVER_NAME}” >> /etc/hosts

初始化master节点:

curl -sSLhttps://kuboard.cn/install-script/v1.16.0/init-master.sh | sh

查看kubernetes组件创建状态:

watch kubectl get pod -n kube-system -o wide

由于本次实验环境是单节点,所以无需进行node节点使用token加入主机集群的操作。

1.2获取API列表

Kubernetes允许外部访问主机集群的方法是使用proxy。

kubectlproxy可以指定广播域,如果需要在局域网内访问集群,则可以将广播域设定为主机所在的私有网络所在的网段,如果需要在局域网外访问集群,则需要将广播域设定为访问节点所在的网段,当然也可以全网广播,但全网广播比较危险,只用于本文的实验环境中,不可用于生产环境。

命令示例:kubectl proxy –address=x.x.x.x –port=xx,address为广播网段,port为暴露的端口,在使用proxy暴露端口后,外部主机访问主机ip地址和端口即可获取API列表。

kubectl proxy –address=0.0.0.0 –port=8001

在输入这条命令后,使用浏览器访问该节点的8001端口,会发现浏览器报错。

简要分析Kubernetes API的使用

这是因为Kubernetes的apiserver拒绝了外部主机的请求,如果需要同意该请求,需要在proxy命令中附加一个额外的参数accept-hosts,如下:

kubectl proxy –address=0.0.0.0 –accept-hosts=’^*$’ –port=8001

再使用浏览器访问同一网址和端口,会发现已经出现了一个json文件:

简要分析Kubernetes API的使用

1.3API调用规则

我们可以访问url列表中的部分路径,获取到该api的信息。

以弹性伸缩为例,我们可以进一步访问apis/autoscaling路径,可以看到以下内容:

简要分析Kubernetes API的使用

这个json显示了autoscaling api的基本信息。

kind/apiVersion:我们正在访问的是一个APIGroup组中的v1 api

name:这个api的名字是autoscaling

versions:它所支持的版本有v1、v2beta1、v2beta2

preferredVersion:推荐使用的版本是v1

我们也可以编写基于各种python请求库的request脚本,去获取这些页面中的数据,由于python的json库支持json文件的解析操作,我们可以快速的格式化我们想要得到的信息。

如果逐个查看,可能我们需要操作很多次才能获取所有的api信息。和部分网站的api一样,Kubernetes也使用了openapi进行了接口定义,我们访问openapi/v2可以看到一个很长的json文件,这个文件展示了openapi v2对Kubernetes接口的全部定义。

简要分析Kubernetes API的使用

这个json文件看起来很乱,但是它的每个api路径对应的功能描述、请求方法、标签信息、返回结构体说明等信息都归属在paths字段下,解析这个文件就可以得到api的定义和详细介绍。

简要分析Kubernetes API的使用

简要分析Kubernetes API的使用

解析后的api定义文档,可以看到多达444条记录。

当然,我们也可以通过访问Kubernetes的官网,直接找到api参考文档,以获取常用api的调用方法。

2.以Kuboard为例分析Kubernetes API的功能

2.1Kuboard介绍

为什么选择Kuboard而不是Kubernetes官方的dashboard?因为Kuboard拥有交互性更强的中文界面,简单直观,易于使用,且不需要绕开无法获取的镜像等文件,配置更加方便。

Kuboard支持在线体验,当然,这个“在线体验”并不能让用户管理自己的Kubernetes集群,而是通过一个kuboard.cn为用户设置的展示型集群,让用户充分预览和浅层体验这个前端平台的功能。

简要分析Kubernetes API的使用

2.2Kuboard搭建

由于kuboard.cn提供了整合安装脚本,Kuboard的搭建是非常简单的。

安装Kuboard:

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

查看Kuboard创建状态:

watch kubectl get pods -l k8s.eip.work/name=kuboard -nkube-system

观察pod状态,等到kuboard开头的pod状态为running,即代表Kuboard搭建完成。

查看Kuboard端口:

kubectl get services -n kube-system

简要分析Kubernetes API的使用

可以得到的结论是,kuboard服务的部署方式为NodePort,端口为32567,因此访问方式为集群内任一节点的IP地址和32567端口。

打开浏览器访问该端口,发现需要token:

简要分析Kubernetes API的使用

运行以下命令获取token:

kubectl -n kube-system describe secret $(kubectl -n kube-systemget secret | grep kuboard-user | awk ‘{print $1}’)

将获得的token粘贴到输入框内,点击登录,可以看到如下界面,代表登录成功:

简要分析Kubernetes API的使用

2.3Kuboard界面分析

Kuboard获取集群状态和进行集群操作都是通过访问Kubernetes的API进行的,调用chrome浏览器的Devtools,可以分析平台上的功能元素对应的接口。

点击“计算资源”中的任一节点,发现Kuboard使用GET方法请求了api/v1/nodes接口。

简要分析Kubernetes API的使用

返回体中则包含了节点的各种信息,包含类型、名称、资源ID、创建时间、规格、pod网段等:

简要分析Kubernetes API的使用

命名空间、deploy部署、持久卷等功能对应的接口也可以通过点击页面元素找到:

简要分析Kubernetes API的使用

使用创建命名空间可以发现,创建资源的接口是通过POST请求调用的,与查看对应资源使用同一个URI,如果创建成功,返回状态码201。与此相应的是,删除资源通过DELETE请求调用,如果删除成功,返回状态码200。

简要分析Kubernetes API的使用

只要了解了Kubernetes的API调用方法,就可以编写管理集群的离线程序,甚至根据自己的需求定制Kubernetes集群的管理平台。

标签: