K8s集群从Docker切换到Containerd后,如何搞定Harbor和阿里云镜像仓库的配置(保姆级避坑)
Kubernetes集群从Docker迁移到Containerd:Harbor与阿里云镜像仓库配置全指南
当Kubernetes集群从Docker切换到Containerd时,镜像仓库的配置方式发生了根本性变化。许多运维团队在迁移过程中发现,原本熟悉的Docker配置方法不再适用,特别是对于私有镜像仓库如Harbor和云厂商提供的镜像服务如阿里云ACR。本文将深入解析Containerd的配置逻辑,提供从基础配置到实战验证的完整解决方案。
1. Containerd与Docker的配置思维差异
Docker时代,我们习惯在/etc/docker/daemon.json中配置镜像仓库和加速器。而Containerd采用了完全不同的配置体系,核心配置文件是/etc/containerd/config.toml。这种差异不仅仅是文件路径的变化,更是配置理念的转变。
Containerd的配置结构更加模块化,主要分为几个关键部分:
- registry.mirrors:用于配置镜像仓库的镜像站点(mirror)
- registry.configs:用于配置访问私有仓库的认证信息
- registry.auths:兼容Docker认证信息的配置方式
与Docker相比,Containerd的配置更加细粒度化。例如,在Docker中,我们可能简单地配置一个全局的镜像加速器,而在Containerd中,我们需要为每个registry(如docker.io、harbor.example.com等)单独配置mirror和认证信息。
2. Containerd基础配置解析
2.1 配置文件结构与位置
Containerd的主配置文件通常位于/etc/containerd/config.toml。如果文件不存在,可以使用以下命令生成默认配置:
containerd config default > /etc/containerd/config.toml配置文件采用TOML格式,主要结构如下:
[plugins."io.containerd.grpc.v1.cri".registry] config_path = "" [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry-1.docker.io"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.example.com".auth] username = "admin" password = "password"2.2 关键配置字段详解
registry.mirrors
registry.mirrors用于配置镜像仓库的镜像站点。例如,为docker.io配置多个镜像加速器:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = [ "https://br003st4.mirror.aliyuncs.com", "https://registry-1.docker.io", "https://08c765900e00f5d20f0dc0005a40c3a0.mirror.swr.myhuaweicloud.com" ]注意:Containerd会按顺序尝试这些endpoint,直到成功拉取镜像。
registry.configs
registry.configs用于配置私有仓库的认证信息。例如,配置Harbor仓库的认证:
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.example.com".auth] username = "admin" password = "Harbor12345"3. Harbor私有仓库配置实战
3.1 基础配置
假设Harbor仓库地址为http://192.168.209.182,我们需要在config.toml中添加以下配置:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.209.182"] endpoint = ["http://192.168.209.182"] [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.209.182".auth] username = "admin" password = "Harbor12345"配置完成后,重启Containerd服务:
systemctl restart containerd3.2 测试镜像拉取
使用crictl测试从Harbor拉取镜像:
crictl pull 192.168.209.182/nginx/mynginx:v1.03.3 Kubernetes中使用Harbor镜像
在Kubernetes中,除了在Containerd中配置认证信息外,还可以通过Secret来提供认证:
kubectl create secret docker-registry harbor-secret \ --docker-username=admin \ --docker-password=Harbor12345 \ --docker-server=192.168.209.182然后在Pod定义中引用这个Secret:
apiVersion: v1 kind: Pod metadata: name: test-app spec: containers: - name: nginx image: 192.168.209.182/nginx/mynginx:v1.0 imagePullPolicy: IfNotPresent imagePullSecrets: - name: harbor-secret4. 阿里云ACR配置实战
4.1 基础配置
假设阿里云ACR地址为registry.cn-hangzhou.aliyuncs.com,配置如下:
[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.cn-hangzhou.aliyuncs.com".auth] username = "your_username" password = "your_password"4.2 镜像加速器配置
阿里云提供了镜像加速器服务,可以为docker.io配置加速:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://br003st4.mirror.aliyuncs.com"]4.3 Kubernetes中使用ACR镜像
创建访问ACR的Secret:
kubectl create secret docker-registry ali-secret \ --docker-username=your_username \ --docker-password=your_password \ --docker-server=registry.cn-hangzhou.aliyuncs.com在Pod定义中使用:
apiVersion: v1 kind: Pod metadata: name: test-app spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/testpm-k8s/nginx:1.14 imagePullSecrets: - name: ali-secret5. 常见问题排查与优化
5.1 镜像拉取失败排查步骤
检查Containerd日志:
journalctl -u containerd --no-pager -n 100验证配置是否生效:
containerd config dump | grep -A 10 "registry"手动测试镜像拉取:
crictl pull <image-name>
5.2 安全最佳实践
- 避免在配置文件中明文存储密码,可以考虑使用凭证助手
- 为不同的仓库使用不同的凭证,遵循最小权限原则
- 定期轮换凭证
5.3 性能优化建议
- 为常用镜像仓库配置就近的镜像站点
- 合理设置镜像缓存策略
- 考虑使用P2P镜像分发方案如Dragonfly
在实际迁移过程中,我发现最关键的步骤是理解Containerd的配置逻辑与Docker的区别。特别是在多集群环境中,保持配置的一致性非常重要。建议使用配置管理工具如Ansible来统一管理所有节点的Containerd配置。
