4. 搭建私有Harbor仓库:架构、部署与配置
在Kubernetes生产环境中,镜像拉取速度与仓库可用性直接影响应用交付效率。Harbor作为企业级容器镜像仓库,提供镜像复制、漏洞扫描、RBAC权限控制及审计日志等核心能力。本节从架构设计出发,逐步完成Harbor的安装部署、HTTPS证书配置及多租户管理。
4.1 Harbor架构概览
Harbor采用微服务架构,核心组件包括:
| 组件 | 功能 | 依赖 |
|---|---|---|
| nginx | 反向代理与TLS终止,统一入口 | 证书、DNS |
| core | API服务、Web UI、认证授权 | 数据库、Redis |
| registry | OCI分发标准实现,存储镜像Blob与Manifest | 存储后端(S3/NFS/MinIO) |
| jobservice | 异步任务:镜像复制、GC、Webhook | Redis、数据库 |
| database | PostgreSQL,存储元数据、用户、项目 | 持久卷 |
| redis | 缓存、会话、任务队列 | 内存/持久化 |
| trivy | 漏洞扫描引擎(可选) | 漏洞数据库 |
架构要点:所有组件通过Docker网络通信,registry无状态,可水平扩展;数据库与Redis建议使用高可用外部服务。
4.2 安装部署:docker-compose 方式
适用于单机测试或小规模团队。Harbor官方提供离线安装包,内置docker-compose编排文件。
4.2.1 下载与配置
# 下载离线安装包(以v2.10.0为例)
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xzf harbor-offline-installer-v2.10.0.tgz
cd harbor
# 复制配置模板
cp harbor.yml.tmpl harbor.yml
# 编辑核心配置
vi harbor.yml
4.2.2 关键配置项
| 配置项 | 示例值 | 说明 |
|---|---|---|
hostname |
harbor.example.com | 对外访问域名,不可用IP |
https.certificate |
/data/cert/harbor.pem | 服务端证书路径 |
https.private_key |
/data/cert/harbor-key.pem | 私钥路径 |
harbor_admin_password |
Harbor12345 | 初始管理员密码,部署后立即修改 |
database.password |
root123 | PostgreSQL root密码 |
data_volume |
/data/harbor | 镜像与数据库持久化目录 |
4.2.3 执行安装
# 执行安装脚本(自动生成docker-compose.yml并启动)
sudo ./install.sh
# 验证所有容器运行状态
docker-compose ps
# 访问 https://harbor.example.com 登录
# 默认管理员:admin / Harbor12345
注意:install.sh 会检查docker与docker-compose版本。如果启用漏洞扫描(--with-trivy),需确保网络可访问漏洞数据库。生产环境建议使用外部PostgreSQL与Redis,避免数据丢失。
4.3 安装部署:Helm 方式(Kubernetes原生)
适用于已有Kubernetes集群的团队,利用Helm Chart实现声明式部署与版本管理。
4.3.1 添加Helm仓库与配置
# 添加Harbor Helm仓库
helm repo add harbor https://helm.goharbor.io
helm repo update
# 创建命名空间
kubectl create namespace harbor
# 导出默认配置进行定制
helm show values harbor/harbor > harbor-values.yaml
4.3.2 核心values配置
# harbor-values.yaml 关键片段
expose:
type: ingress
tls:
enabled: true
secretName: harbor-tls
ingress:
hosts:
core: harbor.example.com
annotations:
kubernetes.io/ingress.class: nginx
externalURL: https://harbor.example.com
persistence:
enabled: true
persistentVolumeClaim:
registry:
size: 200Gi
database:
size: 20Gi
redis:
size: 5Gi
database:
type: internal
internal:
password: "changeMe123"
redis:
type: internal
trivy:
enabled: true
4.3.3 部署与验证
# 部署Harbor
helm install harbor harbor/harbor -f harbor-values.yaml -n harbor
# 查看部署状态
helm status harbor -n harbor
kubectl get pods -n harbor -w
# 获取Ingress地址
kubectl get ingress -n harbor
生产建议:使用外部数据库(如RDS)和外部Redis(如ElastiCache),设置
database.type: external 并配置连接信息。存储后端推荐S3兼容对象存储,设置 persistence.imageChartStorage.type: s3。
4.4 HTTPS证书配置
Harbor强制要求HTTPS访问,证书配置是部署成功的关键步骤。以下为自签名证书生成流程(生产环境请使用CA签发证书)。
4.4.1 生成CA与服务器证书
# 1. 创建CA私钥
openssl genrsa -out ca.key 4096
# 2. 生成CA根证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=DevOps/CN=HarborCA" \
-key ca.key -out ca.crt
# 3. 创建服务器私钥与证书签名请求
openssl genrsa -out harbor.example.com.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=DevOps/CN=harbor.example.com" \
-key harbor.example.com.key -out harbor.example.com.csr
# 4. 创建x509 v3扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.example.com
DNS.2=*.harbor.example.com
EOF
# 5. 使用CA签发服务器证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.example.com.csr -out harbor.example.com.crt
4.4.2 配置到Harbor
docker-compose方式:将证书与私钥复制到 ./cert/ 目录,在 harbor.yml 中指定路径。
# harbor.yml 证书配置
https:
port: 443
certificate: /data/cert/harbor.example.com.crt
private_key: /data/cert/harbor.example.com.key
Helm方式:创建TLS Secret并配置Ingress。
# 创建TLS Secret
kubectl create secret tls harbor-tls \
--cert=harbor.example.com.crt \
--key=harbor.example.com.key \
-n harbor
# values.yaml 中引用
expose:
tls:
secretName: harbor-tls
4.4.3 客户端信任CA
所有需要从该Harbor拉取镜像的节点,必须信任CA根证书:
# 将ca.crt复制到Docker证书目录
sudo mkdir -p /etc/docker/certs.d/harbor.example.com
sudo cp ca.crt /etc/docker/certs.d/harbor.example.com/ca.crt
# 重启Docker守护进程
sudo systemctl restart docker
# 验证登录
docker login harbor.example.com -u admin -p Harbor12345
避坑指南:如果使用自签名证书,所有Kubernetes节点也必须信任该CA。对于containerd运行时,需将ca.crt放置到
/etc/containerd/certs.d/harbor.example.com/ca.crt 并配置 config.toml 中的镜像端点。
4.5 项目与用户管理
Harbor通过“项目”实现镜像隔离,通过“用户+角色”实现细粒度权限控制。
4.5.1 项目类型
| 项目类型 | 镜像公开性 | 适用场景 |
|---|---|---|
| 公开项目 | 所有用户可拉取 | 基础镜像、开源组件 |
| 私有项目 | 仅项目成员可拉取 | 业务应用、敏感镜像 |
4.5.2 角色权限矩阵
| 角色 | 拉取镜像 | 推送镜像 | 删除镜像 | 管理项目 |
|---|---|---|---|---|
| 项目管理员 | ✓ | ✓ | ✓ | ✓ |
| 开发者 | ✓ | ✓ | ✗ | ✗ |
| 访客 | ✓ | ✗ | ✗ | ✗ |
| 受限访客 | 仅公开项目 | ✗ | ✗ | ✗ |
4.5.3 创建项目与用户(Web UI)
- 创建项目:登录Harbor → 项目 → 新建项目 → 填写名称、选择公开/私有 → 确认。
- 创建用户:系统管理 → 用户管理 → 新建用户 → 填写用户名、邮箱、密码 → 确认。
- 添加成员:进入项目 → 成员 → 添加成员 → 选择用户并分配角色 → 确认。
4.5.4 使用Robot Account(自动化场景)
Robot Account适用于CI/CD流水线,支持细粒度权限与过期时间设置。
# 通过Harbor API创建Robot Account(示例)
curl -X POST "https://harbor.example.com/api/v2.0/robots" \
-H "Authorization: Bearer ${ADMIN_}" \
-H "Content-Type: application/json" \
-d '{
"name": "cicd-robot",
"duration": 2592000,
"level": "project",
"permissions": [
{
"kind": "project",
"namespace": "my-app",
"access": [
{"resource": "repository", "action": "push"},
{"resource": "repository", "action": "pull"}
]
}
]
}'
最佳实践:每个项目创建独立的Robot Account,设置30天过期并定期轮换。避免使用admin账号在流水线中直接认证。对于多集群场景,利用Harbor的“复制”功能实现跨地域镜像同步,加速拉取。
4.6 镜像复制与拉取加速
Harbor的“复制”功能支持跨地域、跨实例的镜像同步,是镜像拉取加速的核心手段。
4.6.1 复制规则配置
| 参数 | 说明 | 推荐值 |
|---|---|---|
| 源仓库 | 被复制的Harbor实例 | 主Harbor(生产中心) |
| 目标仓库 | 接收复制的Harbor实例 | 边缘Harbor(各区域) |
| 复制模式 | 基于事件触发或定时轮询 | 事件驱动(实时性高) |
| 过滤器 | 按项目/仓库/Tag正则过滤 | 只复制生产环境稳定版本 |
| 覆盖策略 | 同名Tag是否覆盖 | 保留源端版本 |
# 通过API创建复制规则(示例)
curl -X POST "https://harbor.example.com/api/v2.0/replication/policies" \
-H "Authorization: Bearer ${ADMIN_}" \
-H "Content-Type: application/json" \
-d '{
"name": "sync-to-edge",
"src_registry": {"id": 1},
"dest_registry": {"id": 2},
"filters": [
{"type": "project", "value": "production"},
{"type": "tag", "value": "v[0-9]+\\.[0-9]+\\.[0-9]+"}
],
"trigger": {"type": "event_based"},
"deletion": false,
"override": true
}'
拉取加速策略:在Kubernetes集群所在区域部署边缘Harbor,通过复制规则从中心Harbor同步常用镜像。配置containerd/Docker的mirror端点指向边缘Harbor,实现本地拉取,避免跨公网传输。