参考官方,自己记录一下
前言
本文仅记录使用 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}