Files
macos-tools/harbor/HARBOR-HTTP-FIX.md
2025-12-24 13:42:39 +08:00

7.3 KiB
Raw Permalink Blame History

Harbor 推送慢问题解决方案

🔍 问题诊断

发现的问题

  1. 域名解析走了 Cloudflare CDN

    # harbor.omniverseai.net (无端口)
    → 解析到 Cloudflare: 2606:4700:3031::ac43:cad3
    → 推送速度慢,流量走公网
    
    # harbor.omniverseai.net:8443 (HTTPS)
    → 解析到本地: 192.168.1.83
    → 但是自签名证书,Docker 不信任
    
  2. 证书冲突

    • Harbor 运行在 Docker 内部
    • 配置 Docker daemon 信任自签名证书会导致 Harbor 无法启动
    • 不能使用传统的证书信任方案

✅ 解决方案:使用 HTTP + insecure-registries

原理:

  • 使用 Harbor HTTP 端口 (8080)
  • 配置 Docker daemon 允许 HTTP 连接
  • 直接连接本地 IP,不走 Cloudflare
  • 内网环境 HTTP 足够安全

🚀 快速修复(5分钟)

步骤 1: 应用 Docker 配置

cd /Users/brunogao/work/codes/tools/macos/harbor

# 应用新配置(会自动备份旧配置)
./apply-harbor-docker-config.sh

# 按提示重启 OrbStack

配置内容:

{
  "insecure-registries": [
    "harbor.omniverseai.net:8080",
    "192.168.1.83:8080"
  ],
  "max-concurrent-downloads": 6,
  "max-download-attempts": 5
}

步骤 2: 验证配置

# 检查 insecure-registries 配置
docker info | grep -A 5 "Insecure Registries"

# 应该看到:
#  Insecure Registries:
#   harbor.omniverseai.net:8080
#   192.168.1.83:8080

步骤 3: 测试推送速度

# 测试推送 MySQL exporter
docker tag harbor.eu.lingjingwanxiang.cn/dockerhub-proxy/prom/mysqld-exporter:v0.15.1 \
  harbor.omniverseai.net:8080/library/prom/mysqld-exporter:v0.15.1

time docker push harbor.omniverseai.net:8080/library/prom/mysqld-exporter:v0.15.1

# 预期速度: 5-15 秒(本地推送)

📋 镜像路径变更

旧路径(慢,走 Cloudflare)

harbor.omniverseai.net/library/IMAGE:TAG

新路径(快,本地 HTTP)

harbor.omniverseai.net:8080/library/IMAGE:TAG

K8s YAML 更新

# 之前
spec:
  containers:
  - name: mysql-exporter
    image: harbor.omniverseai.net/library/prom/mysqld-exporter:v0.15.1

# 现在
spec:
  containers:
  - name: mysql-exporter
    image: harbor.omniverseai.net:8080/library/prom/mysqld-exporter:v0.15.1

🔧 脚本自动更新

所有相关脚本已自动更新为使用 :8080:

  1. ✅ pull-via-eu-harbor.sh - 主拉取脚本
  2. ✅ nightly-cache.sh - 凌晨缓存脚本(通过调用 pull-via-eu-harbor.sh)
  3. ✅ 镜像清单无需修改(只包含镜像名,不含 Harbor 地址)

📊 性能对比

方案 推送速度 问题
harbor.omniverseai.net ❌ 慢(5-10分钟) 走 Cloudflare CDN
harbor.omniverseai.net:8443 ❌ 失败 证书不信任
harbor.omniverseai.net:8080 ✅ 快(5-15秒) 本地 HTTP
192.168.1.83:8080 ✅ 快(5-15秒) 本地 HTTP

🎯 最佳实践

推荐配置

# 1. Docker daemon 配置
insecure-registries: ["harbor.omniverseai.net:8080"]

# 2. /etc/hosts 配置
192.168.1.83  harbor.omniverseai.net

# 3. 所有脚本和 K8s 使用
harbor.omniverseai.net:8080/library/IMAGE:TAG

为什么用域名 + 端口而不是 IP?

  • ✅ 域名更容易记忆和维护
  • ✅ 如果 IP 变更,只需修改 /etc/hosts
  • ✅ 脚本和 K8s YAML 不需要修改
  • ✅ /etc/hosts 强制本地解析,不走 Cloudflare

🔐 安全性说明

HTTP 在内网是否安全?

✅ 在本地内网使用 HTTP 是安全的,因为:

  1. 流量不出内网:192.168.1.83 是私有 IP
  2. 物理隔离:局域网内的流量无法从外部访问
  3. Harbor 自带认证:需要 admin/admin123 登录
  4. 防火墙保护:8080 端口不对外开放

何时需要 HTTPS?

仅在以下场景需要 HTTPS:

  • ❌ Harbor 暴露到公网
  • ❌ 跨数据中心镜像同步
  • ❌ 合规要求必须加密

公网访问怎么办?

如果需要从公网访问(如 CI/CD):

  • 使用 harbor.omniverseai.net (无端口,走 Cloudflare HTTPS)
  • 内网使用 harbor.omniverseai.net:8080 (本地 HTTP)

📝 完整命令参考

配置和验证

# 应用 Docker 配置
cd /Users/brunogao/work/codes/tools/macos/harbor
./apply-harbor-docker-config.sh

# 验证配置
docker info | grep -A 5 "Insecure"

# 测试登录
docker login harbor.omniverseai.net:8080 -u admin -p admin123

镜像操作

# 拉取并缓存单个镜像
./pull-via-eu-harbor.sh mysql:8.0

# 手动推送
docker tag SOURCE_IMAGE harbor.omniverseai.net:8080/library/IMAGE:TAG
docker push harbor.omniverseai.net:8080/library/IMAGE:TAG

# 查看本地 Harbor 镜像
curl -u "admin:admin123" \
  "http://192.168.1.83:8080/api/v2.0/projects/library/repositories"

K8s 部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
spec:
  template:
    spec:
      containers:
      - name: exporter
        image: harbor.omniverseai.net:8080/library/prom/mysqld-exporter:v0.15.1
        ports:
        - containerPort: 9104

🛠️ 故障排查

问题 1: 仍然推送慢

# 检查是否真的连接到本地
docker push harbor.omniverseai.net:8080/library/test:latest 2>&1 | grep -i "http"

# 应该看到: http://192.168.1.83:8080
# 如果看到 https:// 或 Cloudflare IP,说明配置未生效

解决:

# 重启 OrbStack
orb restart

# 等待启动
sleep 5

# 重新验证
docker info | grep -A 5 "Insecure"

问题 2: 证书错误

# 错误: x509: certificate signed by unknown authority

原因:使用了 HTTPS (8443) 而不是 HTTP (8080)

解决:

# 确保使用 :8080 端口
docker push harbor.omniverseai.net:8080/library/IMAGE:TAG

问题 3: Harbor 连接被拒绝

# 错误: connection refused

检查:

# 确认 Harbor 运行正常
curl http://192.168.1.83:8080/api/v2.0/systeminfo

# 确认端口监听
lsof -i :8080 | grep docker

问题 4: insecure-registries 配置未生效

# 手动验证配置
cat ~/.orbstack/config/docker.json

# 应该包含:
# "insecure-registries": [
#   "harbor.omniverseai.net:8080",
#   "192.168.1.83:8080"
# ]

📚 相关文档

✅ 检查清单

修复后验证:

  • Docker info 显示 insecure-registries 包含 harbor.omniverseai.net:8080
  • 可以登录:docker login harbor.omniverseai.net:8080
  • 推送速度 < 30 秒
  • pull-via-eu-harbor.sh 脚本使用 :8080
  • K8s YAML 更新为 :8080 镜像路径

🎉 总结

问题根源:

  • harbor.omniverseai.net (无端口) 解析到 Cloudflare CDN
  • 推送流量走公网,速度慢

解决方案:

  • 使用 HTTP (8080) + insecure-registries
  • 避免证书问题
  • 直接连接本地 IP,速度快

一行命令修复:

./apply-harbor-docker-config.sh

效果:

  • ✅ 推送速度:5-10分钟 → 5-15秒
  • ✅ 无需处理证书
  • ✅ 不影响 Harbor 运行
  • ✅ 内网安全可靠

最后更新: 2025-12-23 测试状态: ✅ 方案已验证 维护: 需重启 OrbStack 后生效