# 用户通过代理与API服务器交互

通常情况下，用户往往使用`kubectl`客户端与API服务器进行交互，而实际上，`kubectl`客户端是对Kubernetes的REST API进行封装，并加上了相关的验证操作（验证所需的配置文件在`~/.kube/config`中），保证用户可以省去验证等操作，直接对集群中的资源进行操作。

因此，用户同样可以直接调用Kubernetes的REST API与之进行交互，只是需要自行处理验证等相关操作。

幸运的是，我们可以通过执行`kubectl proxy`命令，通过代理与API服务器交互，从而，验证的相关操作由代理完成，不需要用户自行处理。

因此，用户想通过代理与API服务器交互，需要执行以下两步：

1. 使用`kubectl proxy`生成代理服务器；
2. 使用curl通过代理与Kubernetes的REST API交互；

## 生成代理

使用**kubectl客户端**建立代理的方式来与API服务器通信，因为它可以在用户的请求中添加授权令牌，从而令用户获得访问API服务器的权限，从而间接的与API服务器交互。开启代理的命令如下：

```bash
kubectl proxy --port 8080
```

> 在本地的8080端口上开启kubectl proxy

生成代理后，用户的请求转发的过程如下图所示，当用户请求`localhost:8080/api/v1/namespaces/default/pods/kubia-0/proxy/`时，会被代理将地址进行转换为API服务器的地址，即`192.168.99.106:8443`，并且在请求中**加入验证所需的授权令牌等信息**，当API服务器收到请求后，再向后端的资源进行请求：

![使用kubectl proxy转发请求至Pod](https://2906552408-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6Ub8CloS5kJszh6xSR%2Fsync%2Fadf11815dab840ebe7124c59cfb6f26f62b1f20f.png?generation=1588594608956771\&alt=media)

## 交互

当生成代理后，用户就可以通过代理间接的与API服务器进行交互。

假设代理监听的端口是`8080`，那么举几个例子，展示其用法：

```bash
# 列举Kubernetes资源的版本清单（不同的资源可能存在于不同的版本中）
curl http://localhost:8080
# 列举特定版本下的资源类别
curl http://localhost:8080/apis/batch/v1
# 列举某类资源的所有实例（此处列举的是Jobs）
curl http://localhost:8080/apis/batch/v1/jobs
# 查看某命名空间中某类资源的某一个具体实例（default命名空间，Jobs资源，my-job实例）
curl http://localhost:8080/apis/batch/v1/namespaces/default/jobs/my-job
```
