在高度隔离的企业内网环境中部署Harbor镜像仓库,就像在没有GPS信号的深山老林里建造一座现代化仓库——你需要提前规划好每一条物资运输路线,确保每个环节都能在离线状态下自给自足。本文将带你完整走通这个技术迷宫,分享我在金融行业核心系统容器化改造中积累的实战经验。
在内网部署Harbor的第一步,就是解决"无米之炊"的问题。不同于公有云环境的即拿即用,我们需要像松鼠囤积过冬食物一样,预先准备好所有依赖资源。
获取Harbor Helm Chart的三种可靠方式:
GitHub Release直接下载(推荐用于严格审计环境)
bash复制wget https://github.com/goharbor/harbor-helm/archive/v1.10.0.tar.gz
tar zxvf v1.10.0.tar.gz
Helm CLI打包(需预先配置可联网环境)
bash复制helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --version 1.10.0
Git克隆特定版本(适合需要代码审查的场景)
bash复制git clone https://github.com/goharbor/harbor-helm
git checkout v1.10.0
版本兼容性矩阵:
| Harbor版本 | 支持的K8s版本 | 推荐的Helm版本 | 关键依赖 |
|---|---|---|---|
| 2.5.x | 1.19-1.22 | 3.7+ | PostgreSQL 12 |
| 2.6.x | 1.20-1.24 | 3.8+ | Redis 6 |
| 2.7.x | 1.22-1.26 | 3.9+ | Trivy 0.32 |
提示:实际项目中曾遇到因Chart版本与K8s版本不匹配导致的CRD报错,建议在测试环境先用
helm lint进行校验
Harbor的组件镜像就像一套精密仪器的零件,缺一不可。在内网环境中,我们需要建立完整的镜像搬运流水线:
镜像清单分析:
bash复制# 查看Chart依赖的镜像列表
grep -r "repository:" harbor-helm/values.yaml
镜像批量下载脚本:
python复制# harbor_mirror.py
import yaml
import os
with open('harbor-helm/values.yaml') as f:
values = yaml.safe_load(f)
images = []
for key, value in values.items():
if isinstance(value, dict) and 'repository' in value:
images.append(f"{value['repository']}:{value.get('tag', 'latest')}")
for img in images:
os.system(f"docker pull {img}")
os.system(f"docker save {img} -o {img.replace('/', '_')}.tar")
内网分发方案对比:
| 方法 | 适用场景 | 操作复杂度 | 传输效率 |
|---|---|---|---|
| 手动SCP | 小规模集群 | 高 | 低 |
| 私有Registry | 持续部署环境 | 中 | 高 |
| 存储设备拷贝 | 严格物理隔离 | 低 | 中 |
常见踩坑点:
在金融级环境中,存储选择直接关系到系统的可靠性和性能。我们通过多维度评估确定了Ceph作为底层存储:
关键指标对比测试:
| 存储类型 | IOPS (4K随机读) | 延迟(ms) | 吞吐量(MB/s) | 数据冗余能力 |
|---|---|---|---|---|
| Ceph RBD | 15,000 | 2.1 | 680 | 3副本 |
| NFS | 8,000 | 3.5 | 320 | 无 |
| Local PV | 25,000 | 0.8 | 950 | 需额外备份 |
Harbor的核心组件需要不同的存储策略,以下是数据库组件的Ceph RBD存储类配置示例:
yaml复制# ceph-rbd-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ceph-cluster
pool: k8s-pool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: ceph-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: ceph-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- discard
关键参数解析:
imageFeatures: layering:启用RBD分层特性,支持快照reclaimPolicy: Retain:防止误删导致数据丢失discard:启用TRIM支持,优化SSD性能注意:实际部署中曾因未设置mountOptions导致性能下降30%,建议严格测试
Harbor的镜像存储使用S3接口可以显著提升扩展性,这是我们的生产配置片段:
yaml复制# values.yaml关键配置
imageChartStorage:
type: s3
s3:
region: default
bucket: harbor-registry
accesskey: AKIAxxxxxxxx
secretkey: xxxxxxxxxxxxxxxx
regionendpoint: http://ceph-rgw.example.com
secure: false
chunksize: "5242880"
rootdirectory: /registry
性能调优经验:
chunksize调整为5MB(默认值)可平衡内存消耗和传输效率rgw_thread_pool_size(建议每CPU核心2-4线程)监控指标建议:
bash复制# RGW性能监控关键指标
ceph daemon perf rgw.*
# 查看S3请求延迟
radosgw-admin log show | grep latency
Harbor的高可用不是简单的Pod副本数增加,而是需要考虑各组件的特性:
核心组件部署策略:
| 组件 | 副本数 | 反亲和策略 | 资源需求 |
|---|---|---|---|
| Core | 3 | 跨节点 | 4CPU/8GB |
| Registry | 2 | 同节点不同宿主机 | 8CPU/16GB |
| JobService | 3 | 无 | 2CPU/4GB |
| Portal | 2 | 跨可用区 | 1CPU/2GB |
| Database | 1 | - | 4CPU/16GB |
虽然Harbor Chart内置PostgreSQL,但在生产环境建议:
yaml复制# 外部数据库配置示例
database:
type: external
external:
host: "postgresql-ha.example.com"
port: "5432"
username: "harbor"
password: "xxxxxx"
coreDatabase: "registry"
notaryServerDatabase: "notary_server"
notarySignerDatabase: "notary_signer"
sslmode: "disable"
性能优化参数:
sql复制-- PostgreSQL关键参数
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET maintenance_work_mem = '1GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
跨数据中心镜像同步是金融行业常见需求,我们采用的方案:
基于策略的自动同步:
bash复制# 创建同步策略示例
harbor sync create \
--name "prod-to-dr" \
--src-url https://harbor-primary.example.com \
--src-username admin \
--src-password xxxxxx \
--dest-url https://harbor-dr.example.com \
--dest-username admin \
--dest-password xxxxxx \
--override true \
--filters '{"name": "prod/*"}'
同步性能优化技巧:
--override避免重复传输--filters精确控制同步范围在零信任架构下的典型配置:
yaml复制# NetworkPolicy示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: harbor-ingress-control
spec:
podSelector:
matchLabels:
app: harbor
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
虽然内网可能使用HTTP,但TLS仍是推荐做法。我们的证书轮换流程:
证书生成:
bash复制openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout ca.key -x509 -days 3650 -out ca.crt \
-subj "/CN=harbor-ca"
K8s Secret更新:
bash复制kubectl create secret tls harbor-tls \
--cert=ca.crt --key=ca.key \
-n harbor --dry-run=client -o yaml | \
kubectl apply -f -
证书自动注入:
yaml复制# Cert-Manager配置示例
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: harbor-cert
namespace: harbor
spec:
secretName: harbor-tls
issuerRef:
name: ca-issuer
kind: ClusterIssuer
dnsNames:
- harbor.example.com
关键监控指标:
| 指标名称 | 告警阈值 | 检测方法 |
|---|---|---|
| registry_storage_usage_percentage | >80% | PromQL查询 |
| core_http_request_duration_seconds | p99>1s | Histogram观测 |
| jobservice_failed_jobs | 连续3次>5 | 状态检查 |
Grafana仪表板配置片段:
json复制{
"panels": [
{
"title": "镜像推送速率",
"type": "graph",
"targets": [{
"expr": "rate(harbor_registry_request_total{method=\"POST\"}[5m])",
"legendFormat": "{{instance}}"
}]
}
]
}
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Pod持续CrashLoopBackOff | 存储卷挂载失败 | 检查PVC/PV状态和StorageClass配置 |
| 镜像推送超时 | S3存储性能瓶颈 | 调整rgw_thread_pool_size参数 |
| 登录认证失败 | Redis连接问题 | 检查Redis Pod日志和网络策略 |
| 同步任务卡住 | 网络带宽不足 | 限制同步并发数和带宽占用 |
数据库连接检查:
bash复制kubectl exec -it harbor-database-0 -n harbor -- \
psql -U postgres -c "\l"
Redis健康状态:
bash复制kubectl exec -it harbor-redis-0 -n harbor -- \
redis-cli INFO | grep -e "used_memory_" -e "connected_clients"
核心服务日志:
bash复制stern -n harbor core -t 1h | grep -E "ERROR|WARN"
某次生产环境遇到镜像推送速度骤降,通过以下步骤定位:
分析S3请求模式:
bash复制ceph daemon perf rgw.* | grep -A 5 'op latency'
调整内核参数:
bash复制sysctl -w net.core.rmem_max=4194304
sysctl -w net.core.wmem_max=4194304
优化RGW配置:
ini复制[client.rgw]
rgw_thread_pool_size = 32
rgw_num_rados_handles = 4
调整后推送性能从15MB/s提升到68MB/s,效果显著。