在pod中使用脚本 curl 访问 kubernates的apiserver接口

参考官方,自己记录一下

前言

本文仅记录使用 curl shell命令访问集群的apiserver,其他开发语言库可以在官方处找到:
客户端库: https://kubernetes.io/zh/docs/reference/using-api/client-libraries/

官方从 Pod 中访问 Kubernetes API描述:
https://kubernetes.io/zh/docs/tasks/run-application/access-api-from-pod/

访问 REST API

在运行在 Pod 中时,可以通过 default 命名空间中的名为 kubernetes 的服务访问 Kubernetes API 服务器。也就是说,Pod 可以使用 kubernetes.default.svc 主机名 来查询 API 服务器。官方客户端库自动完成这个工作。

向 API 服务器进行身份认证的推荐做法是使用 seviceaccount凭据。 默认情况下,每个 Pod 与一个服务账号关联,该服务账户的凭证(令牌)放置在此 Pod 中 每个容器的文件系统树中的 /var/run/secrets/kubernetes.io/serviceaccount/token 处。

如果证书包可用,则凭证包被放入每个容器的文件系统树中的 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 处, 且将被用于验证 API 服务器的服务证书。

最后,用于命名空间域 API 操作的默认命名空间放置在每个容器中的 /var/run/secrets/kubernetes.io/serviceaccount/namespace 文件中。

写一个在pod内部访问apiserver的脚本

# 指向内部 API 服务器的主机名
APISERVER=https://kubernetes.default.svc

# 服务账号令牌的路径
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# 读取 Pod 的名字空间
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# 读取服务账号的持有者令牌
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# 引用内部证书机构(CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# 使用令牌访问 API
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api

将脚本挂载到pod里面

将以上脚本配置问configmap,然后将configmap挂载到容器内部。

执行结果

输出类似于:

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

说明可以访问的通,脚本成功。

可以基于此来访问更多的api接口,来实现多集群资源的操作,建议只用来查询。

API参考

官网的API 文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/

k8s 的API都是标准的 REST标准,API的路径类似,可以通过一个来做参考

比如查询一个ReplicaSet的信息:

GET /apis/apps/v1/namespaces/{namespace}/replicasets/{name}

使用GET方法,在路径上传命名空间和名称即可

基本是:
/apis/apps/v1/namespaces/{资源命名空间namespace}/资源类型/{资源name}

上一篇:PHP拦截器的使用(转)


下一篇:浅入Kubernetes(9):了解组件