使用 CLI(如 curl)或 GUI(如 postman )HTTP 客户端调用 Kubernetes API 有很多原因。例如,您可能需要对 Kubernetes 对象进行比 kubectl 提供的更细粒度的控制,或者只是想在尝试从代码访问 API 之前进行探索。
本文不仅仅是一个方便的命令列表,而是一个深思熟虑的演练,揭示了您在从命令行调用 Kubernetes API 时可能会偶然发现的一些问题。它涵盖以下内容:
- 如何获取 Kubernetes API Server 地址
- 如何向客户端验证 API Server
- 如何使用证书向 API Server 验证客户端
- 如何使用令牌向 API Server 验证客户端
- 如何从 Pod 内部调用 Kubernetes API
- 如何使用 curl 对 Kubernetes 对象执行基本的 CRUD 操作
- 如何使用 kubectl 的 raw 模式直接访问 Kubernetes API
- 如何查看 kubectl 命令发送了哪些 API 请求(如 apply)
Kubernetes API 结构
设置实验 Kubernetes 集群
如果你没有 Kubernetes 集群可以做实验,这里是你可以使用 arkade 快速创建本地实验环境:
代码语言:javascript复制https://github.com/alexellis/arkade
$ curl -sLS https://get.arkade.dev | sudo sh
$ arkade get minikube kubectl
$ minikube start --profile cluster1
⚠️curl | sudo sh
很吓人。从 Internet 获取软件包并在笔记本电脑上运行它们。由于我没有时间检查我使用的每一段开源代码,我更喜欢隔离和一次性的开发环境。
如何获取 Kubernetes API 主机和端口
要调用任何 API,您首先需要知道其服务器地址。对于 Kubernetes,每个集群都有一个 API Server。因此,查找 API 主机和端口的最简单方法是查看kubectl cluster-info
输出。例如:
$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.58.2:8443
...
该cluster-info
命令显示在 当前上下文中选择的集群的 API 地址。
https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters
但是,如果您有多个集群怎么办?查找 Kubernetes API Server 地址的另一种方法是查看 kubeconfig 内容:
代码语言:javascript复制https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
$ kubectl config view
apiVersion: v1
clusters:
- name: cluster1
cluster:
...
server: https://192.168.58.2:8443
- name: cluster2
cluster:
...
server: https://192.168.59.2:8443
...
默认情况下,kubectl
查找目录中命名config
的$HOME/.kube
文件。那么,为什么不直接从这个文件中获取 API 地址呢?
原因是潜在的配置合并。KUBECONFIG
通过将 env var 设置为以冒号分隔的位置列表,可以指定多个 kubeconfig 文件。kubectl
在访问集群之前,会尝试将所有 kubeconfig 文件的内容合并到一个配置中。
因此,从上面的列表中选择正确的集群,让我们尝试向其 API Server 发送请求:
代码语言:javascript复制$ KUBE_API=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}')
如何使用 curl 调用 Kubernetes API
实际上,任何 HTTP 客户端(curl、httpie、wget 甚至 postman)都可以,但我将在本节中使用 curl。
向客户端验证 API Server
让我们从 查询 API 的/version
端点开始:
$ curl $KUBE_API/version
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.