独特的 Kubernetes Proxy API接口

2020-08-14 0 By admin

前面讲到,Kubernetes API Server 最主要的REST接口是资源对象的增、删、改、查接口,除此之外,它还提供了一类很特殊的REST接口—Kubernetes Proxy API接口,这类接口的作用是代理REST请求,即Kubernetes API Server 把收到的 REST 请求转发到某个 Node 上的 kubelet 守护进程的 REST 端口,由该 kubelet 进程负责响应。

API Server 组件之访问方式和架构解析

一、Node 的相关接口

首先来说说 Kubernetes Proxy API 里关于Node的相关接口。
该接口的REST路径为 /api/v1/proxy/nodes/{name} ,其中{name}为节点的名称或IP地址,包括以下几个具体接口:
/api/v1/proxy/nodes/{name}/pods # 列出指定节点内所有Pod的信息
/api/v1/proxy/nodes/{name}/stats # 列出指定节点内物理资源的统计信息
/api/v1/proxy/nodes/{name}/spec # 列出指定节点的概要信息

例如,当前 Node 的名称为 k8s-node-1,用下面的命令即可获取该节点上所有运行中的 Pod:
curl localhost:8080/api/v1/proxy/nodes/k8s-node-1/pods
需要说明的是:这里获取的Pod的信息数据来自Node而非etcd数据库,所以两者可能在某些时间点有所偏差。

1.1、接口扩展

此外,如果 kubelet 进程在启动时包含 --enable-debugginghandlers=true参数,那么Kubernetes Proxy API 还会增加下面的接口:
/api/v1/proxy/nodes/{name}/run # 在节点上运行某个容器
/api/v1/proxy/nodes/{name}/exec # 在节点上的某个容器上运行某条命令
/api/v1/proxy/nodes/{name}/attach # 在节点上attach某个容器
/api/v1/proxy/nodes/{name}/portForward # 实现节点上的Pod端口转发
/api/v1/proxy/nodes/{name}/logs # 列出节点的各类日志信息, 例如tallylog、lastlog、wtmp、ppp/、rhsm/、audit/、tuned/和anaconda/等
/api/v1/proxy/nodes/{name}/metrics # 列出和该节点相关的Metrics信息
/api/v1/proxy/nodes/{name}/runningpods # 列出节点内运行中的Pod信息
/api/v1/proxy/nodes/{name}/debug/pprof # 列出节点内当前Web服务的状态,包括CPU占用情况和内存使用情况等

二、Pod 的相关接口

Kubernetes Proxy API里关于Pod的相关接口,通过这些接口,我们可以访问Pod里某个容器提供的服务(如Tomcat在8080端口的服务):
/api/v1/proxy/namespaces/{namespace}/pods/{name}/{path:*} # 访问Pod的某个服务接口
/api/v1/proxy/namespaces/{namespace}/pods/{name} # 访问Pod
/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path:*} # 访问Pod的某个服务接口
/api/v1/namespaces/{namespace}/pods/{name}/proxy # 访问Pod

在上面的4个接口里,后面两个接口的功能与前面两个完全一样,只是写法不同。

2.1、举例说明Proxy用法

下面用Tomcat Pod来说明上述Proxy接口的用法。首先, 得到Pod的名称:

# kubectl get pods
NAME            READY   STATUS      RESTARTS    AGE
mysql-c95jc     1/1     Running     0           8d
myweb-g9pmm     1/1     Running     0           8d

然后, 运行下面命令, 输出Tomcat的首页, 相当于访问 http://localhost:8080/ :
# curl http://localhost:8080/api/v1/proxy/namespaces/default/pods/myweb-g9pmm/


我们也可以在浏览器中访问上面的地址,比如Master的IP地址是192.168.18.131,我们在浏览器中输入 http://192.168.18.131:8080/api/v1/proxy/namespaces/default/pods/myweb-g9pmm/ ,就能够访问Tomcat首页了;

而如果输入 /api/v1/proxy/namespaces/default/pods/myweb-g9pmm/demo,就能访问Tomcat中Demo应用的页面了。

看到这里,你可能明白Pod 的Proxy接口的作用和意义了:

在Kubernetes集群之外访问某个 Pod 容器的服务(HTTP服务)时,可以用Proxy API实现,这种场景多用于管理目的,比如逐一排查Service的Pod副本,检查哪些Pod的服务存在异常。

三、service 相关接口

Kubernetes Proxy API也有 Service 的 Proxy 接口,其接口定义与 Pod 的接口定义基本一样:
/api/v1/proxy/namespaces/{namespace}/services/{name}
比如,若我们想访问 MyWeb 这个 Service,则可以在浏览器里输入 http://192.168.18.131:8080/api/v1/proxy/namespaces/default/services/myweb/demo/