这篇文章已发表一年以上。较早的文章可能包含过时内容。请检查页面信息自发布以来是否仍准确。

Kubernetes v1.26: Kubelet 凭据提供程序通用可用 (GA) 支持

Kubernetes v1.26 引入了普遍可用 (GA) 的 kubelet 凭据提供程序插件 支持,提供了一个可扩展的插件框架,用于动态获取任何容器镜像仓库的凭据。

背景

Kubernetes 支持动态获取容器镜像仓库服务的凭据。在 Kubernetes v1.20 之前,此功能被编译到 kubelet 中,仅适用于 Amazon Elastic Container Registry、Azure Container Registry 和 Google Cloud Container Registry。

Figure 1: Kubelet built-in credential provider support for Amazon Elastic Container Registry, Azure Container Registry, and Google Cloud Container Registry.

图 1:Kubelet 对 Amazon Elastic Container Registry、Azure Container Registry 和 Google Cloud Container Registry 的内置凭据提供程序支持。

Kubernetes v1.20 引入了 kubelet 凭据提供程序插件的 Alpha 支持,这提供了一种机制,使 kubelet 能够为任意容器镜像仓库(无论是公共仓库、托管服务,甚至是自托管仓库)动态进行身份验证和拉取镜像。在 Kubernetes v1.26 中,此功能现已达到普遍可用 (GA)。

Figure 2: Kubelet credential provider overview

图 2:Kubelet 凭据提供程序概览

为何重要?

在 Kubernetes v1.20 之前,如果您想动态获取 ACR (Azure Container Registry)、ECR (Elastic Container Registry) 或 GCR (Google Container Registry) 以外的镜像仓库的凭据,您需要修改 kubelet 代码。新的插件机制可以在任何集群中使用,并且无需更改 Kubernetes 本身即可对新的仓库进行身份验证。任何云提供商或供应商都可以发布一个插件,让您通过其镜像仓库进行身份验证。

工作原理

Kubelet 和 exec 插件二进制文件通过标准 I/O (stdio)(stdin、stdout 和 stderr)通过发送和接收 JSON 序列化的 API 版本化类型进行通信。如果 exec 插件已启用且 kubelet 需要与某个插件匹配的镜像的身份验证信息,kubelet 将执行插件二进制文件,通过 stdin 传递 CredentialProviderRequest API。然后,exec 插件与容器镜像仓库通信,动态获取凭据,并通过 stdout 将包含 CredentialProviderResponse API 编码响应的凭据返回给 kubelet。

Figure 3: Kubelet credential provider plugin flow

图 3:Kubelet 凭据提供程序插件流程图

收到 kubelet 的凭据后,插件还可以指示凭据可以缓存多长时间,以防止 kubelet 为后续对同一仓库的镜像拉取请求进行不必要的插件执行。在插件未指定缓存时长的情况下,kubelet 可以指定一个默认缓存时长(更多详情见下文)。

{
  "apiVersion": "kubelet.k8s.io/v1",
  "kind": "CredentialProviderResponse",
  "auth": {
    "cacheDuration": "6h",
    "private-registry.io/my-app": {
      "username": "exampleuser",
      "password": "token12345"
    }
  }
}

此外,插件可以指定缓存凭据有效的范围。这通过 CredentialProviderResponse 中的 cacheKeyType 字段指定。当值为 Image 时,kubelet 将仅对与首次请求的镜像完全匹配的未来镜像拉取使用缓存凭据。当值为 Registry 时,kubelet 将对任何后续针对同一仓库主机但使用不同路径的镜像拉取(例如,gcr.io/foo/bargcr.io/bar/foo 指的是同一仓库的不同镜像)使用缓存凭据。最后,当值为 Global 时,kubelet 将对所有与插件匹配的镜像使用返回的凭据,包括可以映射到不同仓库主机(例如 gcr.io 与 registry.k8s.io (以前是 k8s.gcr.io))的镜像。插件实现需要提供 cacheKeyType 字段。

{
  "apiVersion": "kubelet.k8s.io/v1",
  "kind": "CredentialProviderResponse",
  "auth": {
    "cacheKeyType": "Registry",
    "private-registry.io/my-app": {
      "username": "exampleuser",
      "password": "token12345"
    }
  }
}

使用 kubelet 凭据提供程序

您可以通过将 exec 插件安装到每个节点上 kubelet 可访问的本地目录中来配置凭据提供程序。然后,为 kubelet 设置两个命令行参数:

  • --image-credential-provider-config:凭据提供程序插件配置文件路径。
  • --image-credential-provider-bin-dir:凭据提供程序插件二进制文件所在的目录路径。

kubelet 读取传递给 --image-credential-provider-config 的配置文件,以确定应该为 Pod 使用的容器镜像调用哪些 exec 插件。请注意,每个提供程序的名称必须与 --image-credential-provider-bin-dir 中指定本地目录中二进制文件的名称匹配,否则 kubelet 将无法找到要调用的插件路径。

kind: CredentialProviderConfig
apiVersion: kubelet.config.k8s.io/v1
providers:
- name: auth-provider-gcp
  apiVersion: credentialprovider.kubelet.k8s.io/v1
  matchImages:
  - "container.cloud.google.com"
  - "gcr.io"
  - "*.gcr.io"
  - "*.pkg.dev"
  args:
  - get-credentials
  - --v=3
  defaultCacheDuration: 1m

下面是 Kubernetes 项目如何使用 kubelet 凭据提供程序进行端到端测试的概览。

Figure 4: Kubelet credential provider configuration used for Kubernetes e2e testing

图 4:用于 Kubernetes e2e 测试的 kubelet 凭据提供程序配置

有关更多配置详情,请参阅 Kubelet 凭据提供程序

如何参与

如果您想报告错误或对 Kubelet 凭据提供程序有特性请求,请加入 SIG Node。您可以通过以下方式联系我们: