最大并行镜像拉取数 {#maximum-parallel-image-pulls}
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
如果你启用了并行镜像拉取,还可以限制并行镜像拉取的数量。 为此,请在 kubelet 配置中设置字段 maxParallelImagePulls
。 maxParallelImagePulls
的值是一个整数,表示节点上可以同时发生的镜像拉取的最大数量。 值为 n
意味着最多可以同时拉取 n
个镜像。n
越大,节点可以并行处理的镜像拉取请求就越多。 然而,将 maxParallelImagePulls
设置得太高可能会影响节点的性能,因为镜像拉取会消耗大量的网络和磁盘 I/O。 你应该根据节点和镜像服务的能力来设置 maxParallelImagePulls
。
maxParallelImagePulls
的默认值是 nil
。如果你不设置 maxParallelImagePulls
, 或者将其设置为 nil
,则并行镜像拉取的数量将不受限制。 这相当于将 maxParallelImagePulls
设置为一个非常大的数字。
带镜像索引的多架构镜像 {#multi-architecture-images-with-image-indexes}
除了提供二进制的镜像之外,容器仓库也可以提供 容器镜像索引。 镜像索引可以指向镜像的多个 清单文件, 提供特定于体系结构版本的同一容器镜像。 其思想是为某镜像(如:pause
、example/mycontainer
、kube-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 配置中的 auths
和 HttpHeaders
部分。 这意味着不支持凭据辅助程序(credHelpers
或 credsStore
)。 {{< /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 >}}
以下是配置节点以使用私有仓库的推荐步骤。 在此示例中,在你的台式机/笔记本电脑上运行这些步骤:
- 针对你要使用的每组凭据运行
docker login [服务器]
。 这样会更新你 PC 上的$HOME/.docker/config.json
。 - 使用编辑器查看
$HOME/.docker/config.json
,确保其中仅包含你要使用的凭据信息。 - 获取你的节点列表;例如:
- 如果你想要节点名称:
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}' )
- 如果你想要节点名称:
- 将本地的
.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),仅供参考