15.9.7 镜像缓存与加速配置

镜像缓存与加速配置#

镜像缓存与加速的目标是降低拉取时延、减少公网带宽消耗,并提升集群内节点的一致性与稳定性。本节覆盖加速器配置、代理缓存、节点预热、K8s 与构建侧缓存,并配套安装、示例、排错与练习。

原理草图(镜像拉取与缓存链路)

文章图片

一、镜像加速器配置(Docker)

1. 安装与配置
- 文件路径:/etc/docker/daemon.json
- 关键字段:
- registry-mirrors:镜像加速器地址
- insecure-registries:自签仓库白名单

{
  "registry-mirrors": [
    "https://mirror.example.com",
    "https://mirror.backup.com"
  ],
  "insecure-registries": [
    "registry.intra:5000"
  ]
}

2. 生效与验证

sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看加速器是否生效
docker info | grep -A 5 "Registry Mirrors"

# 拉取测试
docker pull alpine:3.19

命令解释
- systemctl restart docker:重启服务加载新配置
- docker info:查看运行时配置是否包含镜像加速器


二、内网代理缓存(Registry Proxy Cache)

1. Registry 代理缓存安装示例

# 拉取官方 registry 镜像
docker pull registry:2

# 运行代理缓存(上游 Docker Hub)
docker run -d --name registry-proxy \
  -p 5001:5000 \
  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
  -v /data/registry:/var/lib/registry \
  registry:2

2. 拉取走代理缓存

# 使用代理缓存拉取
docker pull registry.intra:5001/library/nginx:1.25

# 预期效果:首次拉取缓存到 /data/registry,再次拉取命中缓存

排错要点
- docker logs registry-proxy:检查上游访问失败、认证错误
- 检查 REGISTRY_PROXY_REMOTEURL 是否正确
- 磁盘满:df -h /data/registry


三、节点侧本地缓存与镜像预热

1. 预拉取脚本(批量预热)

#!/usr/bin/env bash
# /usr/local/bin/image-prewarm.sh
set -e
IMAGES=(
  "alpine:3.19"
  "nginx:1.25"
  "redis:7.2"
)
for img in "${IMAGES[@]}"; do
  echo "Pulling $img ..."
  docker pull "$img"
done
chmod +x /usr/local/bin/image-prewarm.sh
/usr/local/bin/image-prewarm.sh

2. 预期效果
- 新节点加入时拉取峰值下降
- 业务镜像冷启动时延缩短


四、K8s/containerd 镜像加速

1. containerd 加速配置
- 文件路径:/etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://mirror.example.com"]
sudo systemctl restart containerd

2. 拉取策略示例

apiVersion: v1
kind: Pod
metadata:
  name: pull-test
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    imagePullPolicy: IfNotPresent

命令解释
- imagePullPolicy: IfNotPresent:节点已有镜像则不再拉取


五、构建侧缓存与分层优化(BuildKit)

1. 启用 BuildKit 并构建

export DOCKER_BUILDKIT=1

docker build \
  --build-arg BUILDKIT_INLINE_CACHE=1 \
  -t app:1.0 .

2. Dockerfile 缓存优化示例

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y curl
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app/
CMD ["python", "/app/app.py"]

优化说明
- COPY requirements.txt 提前:依赖不变时可命中缓存
- 合并 RUN 减少层数


六、常见故障排查

1. 加速器不可用

# 检查 DNS 与访问
nslookup mirror.example.com
curl -I https://mirror.example.com/v2/

2. 缓存不命中
- 镜像标签频繁变动(如 latest
- 代理缓存未配置或上游不可达

3. 磁盘占满

# 查看 overlay2 大小
du -sh /var/lib/docker/overlay2

# 清理无用镜像与缓存
docker system prune -af

七、练习

  1. 为 Docker 配置两个加速器,验证 docker info 输出并截图保存。
  2. 搭建 Registry 代理缓存,拉取 nginx:1.25 两次,观察第二次拉取速度变化。
  3. 写一个预热脚本拉取 5 个常用镜像,并添加日志记录到 /var/log/image-prewarm.log
  4. 在 K8s 节点配置 containerd 镜像加速,验证 Pod 启动时间变化。