本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

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 插件二进制文件通过 stdio(stdin、stdout 和 stderr)进行通信,通过发送和接收 json 序列化的 API 版本类型。如果启用了 exec 插件,并且 kubelet 需要与插件匹配的镜像的身份验证信息,则 kubelet 将执行插件二进制文件,并通过 stdin 传递 CredentialProviderRequest API。然后,exec 插件与容器注册表通信以动态获取凭证,并将凭证以 CredentialProviderResponse API 的编码响应形式通过 stdout 返回给 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。您可以通过以下方式联系我们