配置 kubelet 镜像凭据提供程序

    特性状态:

    从 Kubernetes v1.20 开始,kubelet 可以使用 exec 插件动态获得针对某容器镜像库的凭据。 kubelet 使用 Kubernetes 版本化 API 通过标准输入输出(标准输入、标准输出和标准错误) 和 exec 插件通信。 这些插件允许 kubelet 动态请求容器仓库的凭据,而不是将静态凭据存储在磁盘上。 例如,插件可能会与本地元数据服务器通信,以获得 kubelet 正在拉取的镜像的短期凭据。

    如果以下任一情况属实,你可能对此功能感兴趣:

    • 需要调用云提供商的 API 来获得镜像库的身份验证信息。
    • 凭据的到期时间很短,需要频繁请求新凭据。
    • kubelet 镜像凭证提供程序在 v1.20 版本作为 Alpha 特性引入。 与其他 Alpha 功能一样,当前仅当在 kubelet 启用 KubeletCredentialProviders 特性门控时,该功能才能正常工作。
    • 凭据提供程序 exec 插件的一种可用的实现。你可以构建自己的插件或使用云提供商提供的插件。

    为了使用这个特性,kubelet 需要设置以下两个标志:

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

    kubelet 会读取通过 --image-credential-provider-config 设定的配置文件, 以确定应该为哪些容器镜像调用哪些 exec 插件。 如果你正在使用基于 ECR 的插件, 这里有个样例配置文件你可能最终会使用到:

    providers 字段是 kubelet 所使用的已启用插件列表。每个条目都有几个必填字段:

    • name:插件的名称,必须与传入--image-credential-provider-bin-dir 的目录中存在的可执行二进制文件的名称相匹配。
    • matchImages:字符串列表,用于匹配镜像以确定是否应调用此提供程序。 更多相关信息参见后文。
    • :如果插件未指定缓存时长,kubelet 将在内存中缓存凭据的默认时长。
    • apiVersion:kubelet 和 exec 插件在通信时将使用的 API 版本。

    配置镜像匹配

    kubelet 使用每个凭证提供程序的 matchImages 字段来确定是否应该为 Pod 正在使用的给定镜像调用插件。 matchImages 中的每个条目都是一个镜像模式字符串,可以选择包含端口和路径。 可以在域中使用通配符,但不能在端口或路径中使用。 支持通配符作为子域,如 *.k8s.iok8s.*.io,以及顶级域,如 k8s.*。 还支持匹配部分子域,如 app*.k8s.io。每个通配符只能匹配一个子域段, 因此 *.io 不匹配 。

    当以下所有条件都为真时,镜像名称和 matchImage 条目之间存在匹配:

    • 匹配图片的 URL 路径必须是目标图片 URL 路径的前缀。
    • 如果 imageMatch 包含端口,则该端口也必须在镜像中匹配。

    matchImages 模式的一些示例值:

    • 123456789.dkr.ecr.us-east-1.amazonaws.com
    • *.azurecr.io
    • gcr.io
    • *.*.registry.io
    • foo.registry.io:8080/path
    • 阅读 中有关 CredentialProviderConfig 的详细信息。