简要分析Kubernetes API的使用
作者 | 袁林翔
来源 | 新钛云服(ID:newtyun)
转载请联系授权(微信ID:zlm935177782)
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的apiserver拒绝了外部主机的请求,如果需要同意该请求,需要在proxy命令中附加一个额外的参数accept-hosts,如下:
kubectl proxy --address=0.0.0.0 --accept-hosts='^*$' --port=8001
再使用浏览器访问同一网址和端口,会发现已经出现了一个json文件:
1.3 API调用规则
我们可以访问url列表中的部分路径,获取到该api的信息。
以弹性伸缩为例,我们可以进一步访问apis/autoscaling路径,可以看到以下内容:
这个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接口的全部定义。
这个json文件看起来很乱,但是它的每个api路径对应的功能描述、请求方法、标签信息、返回结构体说明等信息都归属在paths字段下,解析这个文件就可以得到api的定义和详细介绍。
解析后的api定义文档,可以看到多达444条记录。
当然,我们也可以通过访问Kubernetes的官网,直接找到api参考文档,以获取常用api的调用方法。
2. 以Kuboard为例分析Kubernetes API的功能
2.1 Kuboard介绍
为什么选择Kuboard而不是Kubernetes官方的dashboard?因为Kuboard拥有交互性更强的中文界面,简单直观,易于使用,且不需要绕开无法获取的镜像等文件,配置更加方便。
Kuboard支持在线体验,当然,这个“在线体验”并不能让用户管理自己的Kubernetes集群,而是通过一个kuboard.cn为用户设置的展示型集群,让用户充分预览和浅层体验这个前端平台的功能。
2.2 Kuboard搭建
由于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
可以得到的结论是,kuboard服务的部署方式为NodePort,端口为32567,因此访问方式为集群内任一节点的IP地址和32567端口。
打开浏览器访问该端口,发现需要token:
运行以下命令获取token:
kubectl -n kube-system describe secret $(kubectl -n kube-systemget secret | grep kuboard-user | awk '{print $1}')
将获得的token粘贴到输入框内,点击登录,可以看到如下界面,代表登录成功:
2.3 Kuboard界面分析
Kuboard获取集群状态和进行集群操作都是通过访问Kubernetes的API进行的,调用chrome浏览器的Devtools,可以分析平台上的功能元素对应的接口。
点击“计算资源”中的任一节点,发现Kuboard使用GET方法请求了api/v1/nodes接口。
返回体中则包含了节点的各种信息,包含类型、名称、资源ID、创建时间、规格、pod网段等:
命名空间、deploy部署、持久卷等功能对应的接口也可以通过点击页面元素找到:
使用创建命名空间可以发现,创建资源的接口是通过POST请求调用的,与查看对应资源使用同一个URI,如果创建成功,返回状态码201。与此相应的是,删除资源通过DELETE请求调用,如果删除成功,返回状态码200。
只要了解了Kubernetes的API调用方法,就可以编写管理集群的离线程序,甚至根据自己的需求定制Kubernetes集群的管理平台。