1. 项目背景与核心需求
在企业级容器化部署环境中,内网私有镜像仓库的搭建与配置是保障应用交付安全性和效率的关键环节。最近我在某金融科技公司的容器化改造项目中,需要为Ubuntu 22.04系统上的containerd运行时配置对接内部Harbor仓库。这个看似基础的操作,在实际落地时却遇到了证书信任、认证配置、代理设置等一系列典型问题。
不同于简单的Docker配置,containerd作为更底层的容器运行时,其配置方式有着显著差异。特别是在金融行业等对安全要求严格的场景中,自签名证书的使用和认证信息的妥善管理都是必须攻克的难点。本文将基于真实生产环境实践,详细拆解配置过程中的技术细节和避坑要点。
2. 基础环境准备
2.1 系统与软件版本要求
本次配置基于以下环境:
- 操作系统:Ubuntu 22.04 LTS(内核版本5.15+)
- containerd版本:1.6.8+(建议使用官方二进制包)
- Harbor仓库:v2.5.0+(支持OCI标准)
注意:containerd 1.5以下版本对某些认证协议的支持不完善,建议至少使用1.6.x版本
2.2 必要组件安装
bash复制# 安装containerd基础组件
sudo apt-get update
sudo apt-get install -y containerd
# 验证安装版本
containerd --version
如果企业内网有特殊代理要求,需要先配置APT代理:
bash复制# 设置APT代理(根据实际环境修改)
echo 'Acquire::http::Proxy "http://proxy.internal:3128";' | sudo tee /etc/apt/apt.conf.d/80proxy
3. Harbor仓库证书配置
3.1 自签名证书处理
企业内网Harbor通常使用自签名证书,需要在每个节点配置证书信任:
bash复制# 创建证书目录
sudo mkdir -p /usr/local/share/ca-certificates/harbor
# 将CA证书拷贝到指定位置(示例证书路径)
sudo cp harbor-ca.crt /usr/local/share/ca-certificates/harbor/
# 更新证书信任链
sudo update-ca-certificates
验证证书是否生效:
bash复制openssl s_client -connect harbor.internal:443 -showcerts | grep -i "verify"
3.2 证书错误排查
常见证书错误及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| x509: certificate signed by unknown authority | 证书未正确添加到信任链 | 检查证书路径和update-ca-certificates命令执行 |
| tls: failed to verify certificate | 证书过期或主机名不匹配 | 检查证书有效期和SAN配置 |
| connection refused | 网络策略限制 | 检查防火墙和网络连通性 |
4. containerd核心配置
4.1 配置文件位置
containerd的主配置文件通常位于:
/etc/containerd/config.toml(默认路径)- 如果不存在,可通过命令生成默认配置:
bash复制sudo containerd config default > /etc/containerd/config.toml
4.2 私有仓库认证配置
修改config.toml文件中的plugins."io.containerd.grpc.v1.cri".registry部分:
toml复制[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.internal"]
endpoint = ["https://harbor.internal"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.internal".tls]
ca_file = "/usr/local/share/ca-certificates/harbor/harbor-ca.crt"
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.internal".auth]
username = "robot$project-read"
password = "your_actual_token"
安全提示:建议使用Harbor的机器人账户(robot account)而非个人账号密码
4.3 配置热加载
修改配置后无需重启服务,可通过以下命令重新加载:
bash复制sudo kill -SIGHUP $(pidof containerd)
5. 认证信息安全管理
5.1 使用secret管理凭证
更安全的方式是使用containerd的credential helper:
- 安装docker-credential-helpers:
bash复制sudo apt-get install -y docker-credential-helpers
- 创建
~/.docker/config.json:
json复制{
"auths": {
"harbor.internal": {
"auth": "base64_encoded_credentials"
}
},
"credsStore": "pass"
}
5.2 审计与轮换策略
- 定期审计机器人账户权限(建议每月)
- 访问令牌有效期不超过90天
- 通过Harbor API实现自动令牌轮换:
bash复制# 示例令牌轮换脚本
curl -X POST -H "Authorization: Bearer $ADMIN_TOKEN" \
"https://harbor.internal/api/v2.0/robots" \
-d '{"name":"new-token","level":"system"}'
6. 完整验证流程
6.1 镜像拉取测试
bash复制sudo ctr images pull --plain-http=false harbor.internal/library/nginx:latest
6.2 运行验证
bash复制sudo ctr run --rm -t harbor.internal/library/nginx:latest nginx-test
6.3 调试技巧
如果遇到问题,可通过以下方式获取详细日志:
bash复制sudo containerd --log-level debug
关键日志字段说明:
error:认证或网络错误详情ref:镜像引用地址response:仓库服务器返回状态
7. 企业级增强配置
7.1 代理服务器配置
如果内网需要通过代理访问Harbor:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.internal".proxy]
http_proxy = "http://proxy.internal:3128"
https_proxy = "http://proxy.internal:3128"
no_proxy = ".internal,localhost"
7.2 镜像缓存策略
在大规模集群中建议配置镜像缓存:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.internal"]
endpoint = ["https://harbor-cache.internal", "https://harbor.internal"]
7.3 性能调优参数
toml复制[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.configs."*".tls]
insecure_skip_verify = false # 生产环境必须为false
[plugins."io.containerd.grpc.v1.cri".registry.headers]
X-Harbor-Client = ["k8s-node-01"]
8. 常见问题解决方案
8.1 证书错误合集
log复制failed to resolve reference "harbor.internal/library/busybox:latest":
failed to do request: Head "https://harbor.internal/v2/library/busybox/manifests/latest":
x509: certificate signed by unknown authority
解决方案:
- 确保证书路径正确
- 检查证书文件权限(需644)
- 重启containerd服务
8.2 认证失败处理
log复制ERROR: failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized
检查要点:
- 认证信息中的用户名是否包含
robot$前缀 - 令牌是否已过期
- Harbor项目是否设置了访问策略
8.3 网络连接问题
典型报错:
log复制failed to do request: Head "https://harbor.internal/v2/...": dial tcp: lookup harbor.internal: no such host
排查步骤:
nslookup harbor.internaltelnet harbor.internal 443- 检查节点DNS配置
9. 维护与监控
9.1 健康检查脚本
bash复制#!/bin/bash
IMAGE="harbor.internal/library/alpine:latest"
if ! sudo ctr images pull --quiet $IMAGE; then
echo "Harbor connection failed at $(date)" >> /var/log/harbor-health.log
exit 1
fi
sudo ctr images remove $IMAGE
9.2 Prometheus监控指标
关键监控指标:
containerd_image_pull_duration_secondscontainerd_image_pull_failures_totalcontainerd_network_operations_errors_total
示例告警规则:
yaml复制- alert: HarborPullFailures
expr: rate(containerd_image_pull_failures_total{image=~".*harbor.internal.*"}[5m]) > 0
for: 10m
10. 安全加固建议
- 镜像签名验证:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.internal".security]
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.internal".security.signature]
verifier = "cosign"
config = "/etc/containerd/cosign-config.json"
- 网络策略限制:
bash复制# 只允许节点访问Harbor仓库端口
sudo iptables -A OUTPUT -p tcp -d harbor.internal --dport 443 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 443 -j DROP
- 审计日志配置:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.events]
enable = true
max_size = 100
file = "/var/log/containerd/registry-events.log"
在实际生产环境中,这些配置需要根据具体的安全合规要求进行调整。特别是在金融行业,我们通常会额外配置镜像扫描、漏洞检测等安全环节,形成完整的容器安全供应链。