​调试必备!详解 HTTP 客户端调用 K8S API,建议收藏!

2023-03-19 17:32:59 浏览数 (2)

使用 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 快速创建本地实验环境:

https://github.com/alexellis/arkade

代码语言:javascript复制
$ 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输出。例如:

代码语言:javascript复制
$ 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 内容:

https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/

代码语言:javascript复制
$ 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端点开始:

代码语言:javascript复制
$ 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.

0 人点赞