配置 containerd 镜像仓库完全攻略:从基础到进阶的完整指南

配置 containerd 镜像仓库完全攻略:从基础到进阶的完整指南

引言

containerd 作为 Kubernetes 默认的容器运行时,其镜像仓库的配置直接影响容器化应用的部署效率与安全性。本文将从基础配置到高级优化,系统讲解如何高效、安全地配置 containerd 镜像仓库,覆盖私有仓库、公有云镜像服务及安全认证等核心场景。

一、containerd 镜像仓库基础配置

1.1 配置文件结构解析

containerd 的镜像仓库配置主要位于 /etc/containerd/config.toml 文件中。核心配置模块包括:

  • plugins."io.containerd.grpc.v1.cri".registry:定义镜像仓库地址与认证信息
  • [plugins."io.containerd.grpc.v1.cri".registry.configs]:按仓库域名配置认证细节
  • [plugins."io.containerd.grpc.v1.cri".registry.mirrors]:设置镜像仓库镜像源(加速下载)

示例配置片段:

  1. [plugins."io.containerd.grpc.v1.cri".registry]
  2. [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  3. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  4. endpoint = ["https://registry-1.docker.io"]
  5. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."my-private-registry"]
  6. endpoint = ["https://my-registry.example.com"]

1.2 基础配置步骤

  1. 生成默认配置(若文件不存在):
    1. containerd config default > /etc/containerd/config.toml
  2. 编辑配置文件:使用 vised 修改镜像仓库地址
  3. 重启服务
    1. systemctl restart containerd
  4. 验证配置
    1. crictl info | grep -A 5 "registry"

二、私有仓库认证配置

2.1 静态密码认证

对于支持 HTTP Basic Auth 的私有仓库(如 Harbor、Nexus):

  1. [plugins."io.containerd.grpc.v1.cri".registry.configs."my-private-registry".auth]
  2. username = "admin"
  3. password = "your-password"

2.2 证书认证配置

当私有仓库使用自签名证书时:

  1. 将 CA 证书复制到 /etc/containerd/certs.d/ 目录
  2. 创建对应域名的子目录(如 my-registry.example.com
  3. 将证书文件命名为 hosts.toml 或直接放置 .crt 文件

2.3 动态令牌认证(适用于 OAuth2)

  1. [plugins."io.containerd.grpc.v1.cri".registry.configs."aws-ecr".auth]
  2. identitytoken = "your-oauth2-token"

三、镜像加速与镜像源配置

3.1 国内镜像源配置

针对 Docker Hub 等国际仓库,建议配置国内镜像加速:

  1. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  2. endpoint = [
  3. "https://registry.docker-cn.com",
  4. "https://mirror.baidubce.com"
  5. ]

3.2 多镜像源负载均衡

通过配置多个 endpoint 实现故障转移:

  1. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
  2. endpoint = [
  3. "https://gcr.io",
  4. "https://k8s-gcr.cdn.aliyun.com"
  5. ]

四、安全加固配置

4.1 TLS 加密配置

强制使用 HTTPS 连接:

  1. [plugins."io.containerd.grpc.v1.cri".registry.configs."my-registry".tls]
  2. insecure_skip_verify = false # 禁用跳过证书验证
  3. ca_file = "/etc/containerd/certs.d/my-registry.example.com/ca.crt"

4.2 镜像签名验证

配置 Notary 验证镜像签名:

  1. [plugins."io.containerd.grpc.v1.cri".registry.configs."my-registry".signature]
  2. policy_path = "/etc/containerd/signature_policy.json"

示例策略文件:

  1. {
  2. "default": [{
  3. "type": "rejected",
  4. "keyType": "any",
  5. "keyData": "none"
  6. }],
  7. "transports": {
  8. "docker": {
  9. "my-registry": [
  10. {
  11. "type": "signedBy",
  12. "keyType": "GPGKeys",
  13. "keyData": "your-public-key"
  14. }
  15. ]
  16. }
  17. }
  18. }

五、高级优化配置

5.1 镜像拉取并行度调整

  1. [plugins."io.containerd.grpc.v1.cri".registry]
  2. max_concurrent_downloads = 5 # 默认3,根据带宽调整

5.2 缓存配置

启用本地镜像缓存(需 containerd 1.6+):

  1. [plugins."io.containerd.snapshotter.v1.overlayfs"]
  2. root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"
  3. [plugins."io.containerd.content.v1.content"]
  4. root_path = "/var/lib/containerd/io.containerd.content.v1.content"
  5. max_bytes_in_flight = 104857600 # 100MB缓存限制

六、故障排查指南

6.1 常见错误处理

  • 认证失败:检查 ~/.docker/config.json 是否与 containerd 配置冲突
  • 镜像拉取超时:调整 max_concurrent_downloads 或检查网络策略
  • 证书错误:使用 openssl s_client -connect registry:443 验证证书链

6.2 日志分析

  1. journalctl -u containerd -f | grep "registry"

6.3 调试模式

临时启用 debug 日志:

  1. [debug]
  2. address = "/run/containerd/debug.sock"
  3. level = "debug"

七、最佳实践建议

  1. 配置版本控制:使用 Git 管理 /etc/containerd/ 目录
  2. 自动化配置:通过 Ansible/Puppet 批量部署配置
  3. 定期更新:关注 containerd CVE 公告,及时升级
  4. 监控指标:通过 Prometheus 监控 containerd_image_pulls_total 等指标

结语

本文系统梳理了 containerd 镜像仓库配置的全流程,从基础操作到安全优化均提供了可落地的解决方案。实际部署时,建议先在测试环境验证配置,再逐步推广到生产环境。随着 containerd 1.7 版本的发布,未来将支持更细粒度的镜像缓存策略,值得持续关注。