从Pod中访问KubernetesAPI
本指南演示了如何从Pod中访问KubernetesAPI。
在开始之前
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过Minikube构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
从Pod中访问API
从Pod内部访问API时,定位API服务器和向服务器认证身份的操作与外部客户端场景不同。
从Pod使用KubernetesAPI的最简单的方法就是使用官方的客户端库。这些库可以自动发现API服务器并进行身份验证。
使用官方客户端库
从一个Pod内部连接到KubernetesAPI的推荐方式为:
在以上场景中,客户端库都使用Pod的服务账号凭据来与API服务器安全地通信。
直接访问RESTAPI
在运行在 Pod 中时,可以通过default命名空间中的名为kubernetes的服务访问 Kubernetes API 服务器。也就是说,Pod 可以使用kubernetes.default.svc主机名 来查询 API 服务器。官方客户端库自动完成这个工作。
向 API 服务器进行身份认证的推荐做法是使用服务账号凭据。 默认情况下,每个 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文件中。
使用kubectlproxy
如果你希望不使用官方客户端库就完成API查询,可以将kubectlproxy作为command在Pod中启动一个边车(Sidecar)容器。这样,kubectlproxy自动完成对API的身份认证,并将其暴露到Pod的localhost接口,从而Pod中的其他容器可以直接使用API。
不使用代理
通过将认证令牌直接发送到API服务器,也可以避免运行kubectlproxy命令。内部的证书机制能够为链接提供保护。
# 指向内部 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
输出类似于:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}