在没有 kubectl 的情况下使用 Kubernetes REST API

Use the Kubernetes REST API without kubectl

您可以使用其 REST API 简单地与 K8s 交互。例如得到 pods:

curl http://IPADDR/api/v1/pods

但是我找不到任何仅基于 curl 或 REST 的身份验证示例。所有示例都显示了 kubectl 作为代理或作为获取凭据的方式的用法。

如果我已经拥有 .kubeconfig,没有别的,有什么方法可以直接发送 HTTP 请求(例如使用令牌)而不使用 kubectl

首次安装集群时下载的 kubeconfig 文件包含客户端证书和密钥。例如:

clusters:
- cluster:
    certificate-authority-data: ...
    server: https://api.cluster1.ocp.virt:6443
  name: cluster1
contexts:
- context:
    cluster: cluster1
    user: admin
  name: admin
current-context: admin
preferences: {}
users:
- name: admin
  user:
    client-certificate-data: ...
    client-key-data: ...

如果将 client-certificate-dataclient-key-data 提取到 文件,您可以使用它们通过 curl 进行身份验证。提取 数据:

$ yq  -r '.users[0].user."client-certificate-data"'  kubeconfig | base64 -d > cert
$ yq  -r '.users[0].user."client-key-data"'  kubeconfig | base64 -d >
key

然后使用curl:

$ curl -k --cert cert --key key \
  'https://api.cluster1.ocp.virt:6443/api/v1/namespaces/default/pods?limit=500'
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "resourceVersion": "22022"
  },
  "items": []

或者,如果您的 .kubeconfig 中有标记,如下所示:

[...]
users:
- name: your_username/api-clustername-domain:6443
  user:
    token: sha256~...

然后您可以将该令牌用作不记名令牌:

$ curl -k https://api.mycluster.mydomain:6443/ -H 'Authorization: Bearer sha256~...'

...但请注意,这些令牌通常会在一段时间后过期,而证书应该无限期地工作(除非它们以某种方式被撤销)。