从 Pod 访问 Kubernetes API

本指南演示了如何在 Pod 内访问 Kubernetes API。

开始之前

您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议您在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个集群,或者您可以使用以下 Kubernetes 游乐场之一

从 Pod 内访问 API

从 Pod 内访问 API 时,定位和认证到 API 服务器的方式与外部客户端略有不同。

从 Pod 中使用 Kubernetes API 的最简单方法是使用官方的 客户端库 之一。这些库可以自动发现 API 服务器并进行身份验证。

使用官方客户端库

在 Pod 中,连接到 Kubernetes API 的推荐方式是

  • 对于 Go 客户端,请使用官方的 Go 客户端库rest.InClusterConfig() 函数会自动处理 API 主机发现和身份验证。请参见 此处的示例

  • 对于 Python 客户端,请使用官方的 Python 客户端库config.load_incluster_config() 函数会自动处理 API 主机发现和身份验证。请参见 此处的示例

  • 还有许多其他库可用,请参阅 客户端库 页面。

在每种情况下,Pod 的服务帐户凭据都用于与 API 服务器安全通信。

直接访问 REST API

在 Pod 中运行时,您的容器可以通过获取 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT_HTTPS 环境变量来创建 Kubernetes API 服务器的 HTTPS URL。API 服务器的集群内地址也会发布到 default 命名空间中名为 kubernetes 的服务,以便 Pod 可以将 kubernetes.default.svc 作为本地 API 服务器的 DNS 名称进行引用。

使用 服务帐户 凭据是连接到 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 中的文件中。

使用 kubectl proxy

如果您想在没有官方客户端库的情况下查询 API,可以将 kubectl proxy 作为 Pod 中新 sidecar 容器的 命令 运行。这样,kubectl proxy 将对 API 进行身份验证,并将 API 公开在 Pod 的 localhost 接口上,以便 Pod 中的其他容器可以直接使用它。

不使用代理

可以通过将身份验证令牌直接传递给 API 服务器来避免使用 kubectl proxy。内部证书保护连接。

# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc

# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# Explore the API with TOKEN
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"
    }
  ]
}
上次修改时间:2023 年 2 月 19 日,太平洋标准时间晚上 9:42:清理 tasks/run-application 中的页面 (ba99616c27)