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

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

图 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。

图 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/bar
和 gcr.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 凭据提供程序进行端到端测试的概览。

图 4:用于 Kubernetes e2e 测试的 kubelet 凭据提供程序配置
有关更多配置详情,请参阅 Kubelet 凭据提供程序。
如何参与
如果您想报告错误或对 Kubelet 凭据提供程序有特性请求,请加入 SIG Node。您可以通过以下方式联系我们: