最大并行镜像拉取数 {maximum-parallel-image-pulls}

最大并行镜像拉取数 {#maximum-parallel-image-pulls}

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

如果你启用了并行镜像拉取,还可以限制并行镜像拉取的数量。 为此,请在 kubelet 配置中设置字段 maxParallelImagePullsmaxParallelImagePulls 的值是一个整数,表示节点上可以同时发生的镜像拉取的最大数量。 值为 n 意味着最多可以同时拉取 n 个镜像。n 越大,节点可以并行处理的镜像拉取请求就越多。 然而,将 maxParallelImagePulls 设置得太高可能会影响节点的性能,因为镜像拉取会消耗大量的网络和磁盘 I/O。 你应该根据节点和镜像服务的能力来设置 maxParallelImagePulls

maxParallelImagePulls 的默认值是 nil。如果你不设置 maxParallelImagePulls, 或者将其设置为 nil,则并行镜像拉取的数量将不受限制。 这相当于将 maxParallelImagePulls 设置为一个非常大的数字。

带镜像索引的多架构镜像 {#multi-architecture-images-with-image-indexes}

除了提供二进制的镜像之外,容器仓库也可以提供 容器镜像索引。 镜像索引可以指向镜像的多个 清单文件, 提供特定于体系结构版本的同一容器镜像。 其思想是为某镜像(如:pauseexample/mycontainerkube-apiserver)提供一个名称时, 允许不同的系统基于它们所使用的机器架构取回正确的二进制镜像。

Kubernetes 自身通常在命名容器镜像时添加后缀 -$(ARCH)。 为了向前兼容,请在生成较老的镜像时也提供后缀。 这里的理念是为某镜像(如 pause)生成针对所有平台都适用的清单时, 生成 pause-amd64 这类镜像,以便较老的配置文件或者将镜像后缀硬编码到其中的 YAML 文件也能兼容。

使用私有仓库 {#using-a-private-registry}

从私有仓库读取镜像时可能需要密钥。 凭据可以用以下方式提供:

  • 配置节点向私有仓库进行身份验证
    • 所有 Pod 均可读取任何已配置的私有仓库
    • 需要集群管理员配置节点
  • 预拉镜像
    • 所有 Pod 都可以使用节点上缓存的所有镜像
    • 需要所有节点的 root 访问权限才能进行设置
  • 在 Pod 中设置 ImagePullSecrets
    • 只有提供自己密钥的 Pod 才能访问私有仓库
  • 特定于厂商的扩展或者本地扩展
    • 如果你在使用定制的节点配置,你(或者云平台提供商)可以实现让节点向容器仓库认证的机制

下面将详细描述每一项。

配置节点对私有仓库认证 {#configuring-nodes-to-authenticate-to-a-private-registry}

如果你在节点上运行 Docker,则可以配置 Docker 容器运行时以向私有容器仓库进行身份验证。

如果你能够控制节点配置,则此方法适用。

{{< note >}}

Kubernetes 目前仅支持 Docker 配置中的 authsHttpHeaders 部分。 这意味着不支持凭据辅助程序(credHelperscredsStore)。 {{< /note >}}

Docker 将私有仓库的密钥保存在 $HOME/.dockercfg$HOME/.docker/config.json 文件中。 如果你将相同的文件放在下面列出的搜索路径中,kubelet 会在拉取镜像时将其用作凭据提供程序。

  • {--root-dir:-/var/lib/kubelet}/config.json
  • {kubelet 的当前工作目录}/config.json
  • ${HOME}/.docker/config.json
  • /.docker/config.json
  • {--root-dir:-/var/lib/kubelet}/.dockercfg
  • {kubelet 的当前工作目录}/.dockercfg
  • ${HOME}/.dockercfg
  • /.dockercfg

{{< note >}}

你可能必须在 kubelet 环境中显式设置 HOME=/root。 {{< /note >}}

以下是配置节点以使用私有仓库的推荐步骤。 在此示例中,在你的台式机/笔记本电脑上运行这些步骤:

  1. 针对你要使用的每组凭据运行 docker login [服务器]。 这样会更新你 PC 上的 $HOME/.docker/config.json
  2. 使用编辑器查看 $HOME/.docker/config.json,确保其中仅包含你要使用的凭据信息。
  3. 获取你的节点列表;例如:
    • 如果你想要节点名称:nodes=$( kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name}{"\n"}{end}' )
    • 如果你想要获取 IP 地址:nodes=$( kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address}{"\n"}{end}' )
  4. 将本地的 .docker/config.json 复制到上面列出的搜索路径之一。
    • 例如:for n in $nodes; do scp ~/.docker/config.json root@"$n":/var/lib/kubelet/config.json; done

{{< note >}}

对于生产环境,请使用配置管理工具,以便将这一设置应用到你需要此设置的所有节点上。 {{< /note >}}

通过创建一个使用私有镜像的 Pod 来验证,例如:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: private-image-test-1
spec:
  containers:
    - name: uses-private-image
      image: $PRIVATE_IMAGE_NAME
      imagePullPolicy: Always
      command: [ "echo", "SUCCESS" ]
EOF

如果一切正常,那么一段时间后,你可以运行:

kubectl logs private-image-test-1

命令的输出结果是:

SUCCESS

如果你怀疑命令失败了,可以运行:

kubectl describe pods/private-image-test-1 | grep 'Failed'

如果失败,则输出类似于:

  Fri, 26 Jun 2015 15:36:13 -0700    Fri, 26 Jun 2015 15:39:13 -0700    19    {kubelet node-i2hq}    spec.containers{uses-private-image}    failed        Failed to pull image "user/privaterepo:v1": Error: image user/privaterepo:v1 not found

你必须确保集群中所有节点的 .docker/config.json 文件内容相同。 否则,Pod 会在一些节点上正常运行,而在另一些节点上启动失败。 例如,如果你使用节点自动扩缩容,那么每个实例模板都需要包含 .docker/config.json, 或者挂载包含该文件的驱动器。

一旦你在 .docker/config.json 中添加了私有仓库的密钥,所有 Pod 都将能读取私有仓库中的镜像。

config.json 的解释 {#interpretation-of-configjson}

config.json 的解释在原始 Docker 实现和 Kubernetes 的解释之间有所不同。 在 Docker 中,auths 键只能指定根 URL,而 Kubernetes 允许 glob URL 以及前缀匹配的路径。 这意味着,像这样的 config.json 是有效的:

{
    "auths": {
        "*my-registry.io/images": {
            "auth": "…"
        }
    }
}

使用以下语法匹配根 URL(*my-registry.io):

pattern:
    { term }

term:
    '*'         匹配任何无分隔符字符序列
    '?'         匹配任意单个非分隔符
    '[' [ '^' ] 字符范围
                  字符集(必须非空)
    c           匹配字符 c (c 不为 '*', '?', '\\', '[')
    '\\' c      匹配字符 c

字符范围: 
    c           匹配字符 c (c 不为 '\\', '-', ']')
    '\\' c      匹配字符 c
    lo '-' hi   匹配字符范围在 lo 到 hi 之间字符

现在镜像拉取操作会将每种有效模式的凭据传递给 CRI 容器运行时。例如下面的容器镜像名称会匹配成功:

  • my-registry.io/images
  • my-registry.io/images/my-image
  • my-registry.io/images/another-image
  • sub.my-registry.io/images/my-image
  • a.sub.my-registry.io/images/my-image

kubelet 为每个找到的凭据的镜像按顺序拉取。这意味着在 config.json 中可能有多项:

{
    "auths": {
        "my-registry.io/images": {
            "auth": "…"
        },
        "my-registry.io/images/subpath": {
            "auth": "…"
        }
    }
}

如果一个容器指定了要拉取的镜像 my-registry.io/images/subpath/my-image, 并且其中一个注册表项失败,kubelet 将尝试从另一个注册表项下载镜像。

提前拉取镜像 {#pre-pulled-images}

{{< note >}} 该方法适用于你能够控制节点配置的场合。 如果你的云供应商负责管理节点并自动置换节点,这一方案无法可靠地工作。 {{< /note >}}

默认情况下,kubelet 会尝试从指定的仓库拉取每个镜像。 但是,如果容器属性 imagePullPolicy 设置为 IfNotPresent 或者 Never, 则会优先使用(对应 IfNotPresent)或者一定使用(对应 Never)本地镜像。

如果你希望使用提前拉取镜像的方法代替仓库认证,就必须保证集群中所有节点提前拉取的镜像是相同的。

这一方案可以用来提前载入指定的镜像以提高速度,或者作为向私有仓库执行身份认证的一种替代方案。

所有的 Pod 都可以使用节点上提前拉取的镜像。

在 Pod 上指定 ImagePullSecrets {#specifying-imagepullsecrets-on-a-pod}

{{< note >}} 运行使用私有仓库中镜像的容器时,建议使用这种方法。 {{< /note >}}

Kubernetes 支持在 Pod 中设置容器镜像仓库的密钥。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚竹兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值