首页/新闻资讯/正文详情

Harbor 私有镜像仓库部署

发布时间:2026/9/27 22:56:54 来源:云帆数科 栏目:资讯中心
Harbor 私有镜像仓库部署
Harbor 私有镜像仓库部署一、方案概述1.1 目标在 K8s 高可用集群上部署一套 Harbor 私有镜像仓库具备镜像存储存储 Docker 镜像和 Helm Chart访问控制用户认证、项目权限HTTPSLet’s Encrypt 泛域名证书持久化Longhorn 分布式存储高可用核心组件多副本外部访问FRP Ingress 从公网访问1.2 技术选型组件用途Harbor Helm Chart部署 HarborNginx Ingress Controller外部访问入口Longhorn持久化存储Let’s EncryptTLS 证书FRP内网穿透1.3 架构text外网用户 ↓ https://harbor.域名:40443 ↓ frpsvhost_https_port 40443 ↓ frpc ↓ 内网 VIP:443 ↓ HAProxy ↓ Ingress ControllerTLS 终止 ↓ Harbor Service ↓ Harbor Podcore、portal、registry、jobservice二、前置条件2.1 集群状态K8s 集群kubectl get nodes全部ReadyNginx Ingress Controller 已部署Longhorn 已部署longhornStorageClass 就绪FRP 已配置2.2 存储要求Harbor 需要 PVC 持久化数据。本文档使用Longhorn作为存储后端。关键约束Harbor registry 组件不支持多副本共享 RWO 卷所以registry和jobservice必须单副本。Longhorn 卷默认 3 副本如果节点磁盘空间紧张可以降到 2 副本。Longhorn 的storage-over-provisioning-percentage和storage-minimal-available-percentage需要提前调整否则卷会因insufficient storage调度失败。2.3 TLS 证书需要泛域名证书*.域名。本文档使用acme.sh Let’s Encrypt申请。2.4 FRP 配置frpc 需要加 HTTP 和 HTTPS 的 vhost 映射[harbor-http] type http local_ip 内网VIP local_port 80 custom_domains harbor.域名 [harbor-https] type https local_ip 内网VIP local_port 443 custom_domains harbor.域名三、申请 TLS 证书3.1 安装 acme.shcurl https://get.acme.sh | sh -s email邮箱 source ~/.bashrc3.2 配置 DNS API以阿里云为例export Ali_KeyAccessKeyID export Ali_SecretAccessKeySecret3.3 申请泛域名证书acme.sh --issue --server letsencrypt --dns dns_ali --dnssleep 60 -d 域名 -d *.域名解析--server letsencrypt指定 Let’s Encrypt不用 ZeroSSL。--dnssleep 60加完 TXT 记录后等 60 秒再验证。-d 域名 -d *.域名同时申请根域名和泛域名。证书路径~/.acme.sh/域名_ecc/fullchain.cer ~/.acme.sh/域名_ecc/域名.key3.4 配置自动续期脚本创建/root/update-tls-secrets.sh#!/bin/bash CERT_DIR/root/.acme.sh/域名_ecc NAMESPACES(harbor argocd jenkins gitlab default) for ns in ${NAMESPACES[]}; do kubectl create secret tls 域名-tls \ --cert$CERT_DIR/fullchain.cer \ --key$CERT_DIR/域名.key \ --namespace $ns \ --dry-runclient -o yaml | kubectl apply -f - done加执行权限chmod x /root/update-tls-secrets.sh配置 acme.sh 续期回调acme.sh --install-cert -d 域名 --ecc --reloadcmd /root/update-tls-secrets.sh四、安装 Harbor4.1 添加 Helm 仓库helm repo add harbor https://helm.goharbor.io helm repo update helm search repo harbor/harbor如果helm.goharbor.io访问超时从 GitHub 代理下载 chartcurl -fsSL https://ghproxy.net/https://github.com/goharbor/harbor-helm/releases/download/v1.19.2/harbor-1.19.2.tgz -o harbor-1.19.2.tgz4.2 创建命名空间kubectl create namespace harbor4.3 创建 TLS Secretkubectl create secret tls 域名-tls \ --cert/root/.acme.sh/域名_ecc/fullchain.cer \ --key/root/.acme.sh/域名_ecc/域名.key \ --namespace harbor4.4 创建 values.yamlexpose: type: ingress tls: enabled: true certSource: secret secret: secretName: 域名-tls notarySecretName: 域名-tls ingress: hosts: core: harbor.域名 className: nginx annotations: nginx.ingress.kubernetes.io/proxy-body-size: 0 nginx.ingress.kubernetes.io/proxy-read-timeout: 600 nginx.ingress.kubernetes.io/proxy-send-timeout: 600 nginx.ingress.kubernetes.io/ssl-redirect: true nginx.ingress.kubernetes.io/force-ssl-redirect: true externalURL: https://harbor.域名:40443 persistence: enabled: true resourcePolicy: keep persistentVolumeClaim: registry: storageClass: longhorn size: 15Gi database: storageClass: longhorn size: 20Gi redis: storageClass: longhorn size: 10Gi jobservice: storageClass: longhorn size: 10Gi trivy: storageClass: longhorn size: 10Gi harborAdminPassword: 强密码 core: replicas: 2 resources: requests: cpu: 500m memory: 1Gi limits: cpu: 2 memory: 2Gi portal: replicas: 2 resources: requests: cpu: 200m memory: 256Mi limits: cpu: 1 memory: 1Gi jobservice: replicas: 1 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 2 memory: 2Gi registry: replicas: 1 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 2 memory: 2Gi database: type: internal internal: resources: requests: cpu: 500m memory: 1Gi limits: cpu: 2 memory: 2Gi redis: type: internal internal: resources: requests: cpu: 200m memory: 256Mi limits: cpu: 1 memory: 1Gi trivy: enabled: true replicas: 1 resources: requests: cpu: 200m memory: 512Mi limits: cpu: 1 memory: 1Gi4.5 逐项解析字段含义expose.type: ingress用 Ingress 暴露tls.enabled: true开启 HTTPStls.certSource: secret证书从 K8s Secret 读tls.secret.secretNameTLS Secret 名字ingress.hosts.coreHarbor 域名proxy-body-size: 0不限上传大小proxy-read-timeout: 600读超时 10 分钟ssl-redirect: trueHTTP 自动跳转 HTTPSexternalURL外部访问地址带端口persistence各组件 PVC 配置harborAdminPasswordadmin 初始密码core.replicas: 2core 双副本portal.replicas: 2portal 双副本jobservice.replicas: 1jobservice 单副本registry.replicas: 1registry 单副本关键点registry和jobservice必须单副本因为它们的卷是 RWO多副本会报Multi-Attach error。externalURL必须带端口因为外网访问是https://harbor.域名:40443。4.6 安装 Harborhelm install harbor harbor/harbor \ --namespace harbor \ -f /root/harbor-values.yaml如果helm.goharbor.io不通用本地 charthelm install harbor ./harbor-1.19.2.tgz \ --namespace harbor \ -f /root/harbor-values.yaml4.7 观察 Pod 启动kubectl get pods -n harbor -w按CtrlC退出。预期harbor-core-xxx 1/1 Running (2个) harbor-database-0 1/1 Running harbor-jobservice-xxx 1/1 Running harbor-portal-xxx 1/1 Running (2个) harbor-redis-0 1/1 Running harbor-registry-xxx 2/2 Running harbor-trivy-0 1/1 Running五、验证 Harbor5.1 查看 Pod 和 PVCkubectl get pods -n harbor kubectl get pvc -n harbor kubectl get ingress -n harbor预期所有 PodRunning。PVC 全部BoundSTORAGECLASS是longhorn。Ingress 有harbor-ingress域名harbor.域名。5.2 测试 HTTPS 访问curl -v https://harbor.域名:40443 21 | grep SSL certificate预期SSL certificate verify ok.5.3 浏览器访问https://harbor.域名:40443用户名admin密码你设置的强密码第一次登录会要求修改密码。5.4 创建项目登录后创建项目比如library。解析项目是 Harbor 里镜像的组织单位。推送镜像时路径是harbor.域名:40443/library/image:tag。六、配置 K8s 拉取 Harbor 镜像6.1 配置 containerd 信任 Harbor在每台节点上编辑/etc/containerd/config.toml在registry.mirrors段加[plugins.io.containerd.grpc.v1.cri.registry.mirrors.harbor.域名:40443] endpoint [https://harbor.域名:40443]用 Ansible 批量推ansible k8s_cluster -i inventory.ini -m shell -a grep -q registry.mirrors.\harbor.域名:40443\ /etc/containerd/config.toml || sed -i /\[plugins.\io.containerd.grpc.v1.cri\.registry.mirrors\]/a\ [plugins.\io.containerd.grpc.v1.cri\.registry.mirrors\.\harbor.域名:40443\]\n endpoint [\https://harbor.域名:40443\] /etc/containerd/config.toml systemctl restart containerd -b6.2 创建镜像拉取 Secretkubectl create secret docker-registry harbor-secret \ --docker-serverharbor.域名:40443 \ --docker-usernameadmin \ --docker-password强密码 \ --namespace default6.3 在 Deployment 里引用spec: template: spec: imagePullSecrets: - name: harbor-secret containers: - name: myapp image: harbor.域名:40443/library/myapp:1.06.4 验证拉取crictl pull harbor.域名:40443/library/nginx:latest七、常见问题7.1 Pod 卡在ImagePullBackOffHarbor 镜像在docker.io/goharbor上containerd 镜像加速应该能覆盖。如果拉不下来手动拉取并打标签crictl pull docker.m.daocloud.io/goharbor/harbor-jobservice:v2.15.2 ctr -n k8s.io images tag docker.m.daocloud.io/goharbor/harbor-jobservice:v2.15.2 docker.m.daocloud.io/goharbor/harbor-jobservice:v2.15.2如果某个节点拉不下来从其他节点导出ctr -n k8s.io images export /tmp/jobservice.tar docker.m.daocloud.io/goharbor/harbor-jobservice:v2.15.2 scp /tmp/jobservice.tar root目标节点:/tmp/ ctr -n k8s.io images import /tmp/jobservice.tar7.2 registry 多副本时Multi-Attach error原因registry 用 RWO 卷多副本无法共享。解决方案registry.replicas: 1。或者改 Deployment 的更新策略为Recreatekubectl patch deployment -n harbor harbor-registry -p {spec:{strategy:{type:Recreate}}}7.3 PVC 绑不上卷faulted或degraded原因Longhorn 卷调度失败。排查kubectl get volumes.longhorn.io -n longhorn-system kubectl get volume.longhorn.io volume-name -n longhorn-system -o yaml | grep -A5 type: Scheduled如果报insufficient storagekubectl patch settings.longhorn.io storage-over-provisioning-percentage -n longhorn-system --typemerge -p {value:200} kubectl patch settings.longhorn.io storage-minimal-available-percentage -n longhorn-system --typemerge -p {value:10}然后触发副本重建kubectl get engines.longhorn.io -n longhorn-system | grep volume-name kubectl delete engine.longhorn.io engine-name -n longhorn-system7.4 Harbor 登不上报relation properties does not exist原因database 重建后表没建。解决方案删掉 Harbor 和所有 PVC重建。helm uninstall harbor -n harbor kubectl delete pvc -n harbor --all kubectl delete namespace harbor kubectl create namespace harbor kubectl create secret tls 域名-tls --cert/root/.acme.sh/域名_ecc/fullchain.cer --key/root/.acme.sh/域名_ecc/域名.key --namespace harbor helm install harbor harbor/harbor -n harbor -f /root/harbor-values.yaml7.5 413 Request Entity Too Large原因Ingress 的proxy-body-size太小。解决方案设为0不限大小。7.6 HTTPS 访问报证书错误原因证书链不完整或 Secret 没配对。排查kubectl get secret 域名-tls -n harbor kubectl describe ingress -n harbor harbor-ingress | grep TLS7.7 镜像拉取超时Harbor 镜像在docker.io/goharbor上。如果拉不下来配置 containerd 镜像加速或手动导入。八、常用操作8.1 查看 Harbor 状态kubectl get pods -n harbor kubectl get svc -n harbor kubectl get ingress -n harbor kubectl get pvc -n harbor8.2 查看日志kubectl logs -n harbor -l componentcore --tail100 kubectl logs -n harbor -l componentregistry --tail100 kubectl logs -n harbor -l componentdatabase --tail1008.3 取 admin 密码kubectl get secret -n harbor harbor-core -o jsonpath{.data.HARBOR_ADMIN_PASSWORD} | base64 -d echo8.4 升级 Harborhelm upgrade harbor harbor/harbor -n harbor -f /root/harbor-values.yaml8.5 删除 Harborhelm uninstall harbor -n harbor kubectl delete pvc -n harbor --all kubectl delete namespace harbor警告删除 PVC 会删除所有镜像数据操作前先备份。九、架构总结9.1 组件清单组件副本数作用harbor-core2API 服务、认证harbor-portal2Web UIharbor-registry1镜像存储harbor-jobservice1镜像复制、扫描任务harbor-database1PostgreSQL 数据库harbor-redis1缓存harbor-trivy1镜像扫描9.2 端口速查端口用途40443外网 HTTPS 入口40080外网 HTTP 入口443内网 HAProxy HTTPS80内网 HAProxy HTTP30443Ingress Controller HTTPS NodePort30080Ingress Controller HTTP NodePort9.3 已知隐患隐患影响解决方案registry/jobservice 单副本节点故障服务中断需要 RWX 存储才能多副本Longhorn 空间调度保守卷报insufficient storage改 over-provisioning 和 minimal-available证书手动更新续期后 Secret 需更新配 acme.sh 续期回调脚本database 重建后表没建Harbor 登不上删掉 Harbor 和 PVC重建十、总结这套 Harbor 基于官方 Helm Chart 部署提供了镜像存储私有 Docker 镜像仓库访问控制用户认证和项目权限外部访问FRP Ingress 从公网访问HTTPSLet’s Encrypt 泛域名证书持久化Longhorn 分布式存储高可用core、portal 多副本部署中最容易踩的坑chart 拉取超时用 GitHub 代理下载本地安装。registry 多副本 Multi-Attachregistry 和 jobservice 必须单副本。卷容量超过节点可用空间registry 卷不要超过 20Gi。Longhorn 空间调度保守改storage-over-provisioning-percentage200和storage-minimal-available-percentage10。Harbor database 表没建删掉 Harbor 和所有 PVC重建。HTTPS 证书链不完整用fullchain.cer。externalURL 不带端口外网访问带 40443externalURL必须包含端口。解决了这七个问题Harbor 就能稳定运行。

相关推荐

Obsidian日记自动按月归档 + 一键创建明日日记,手机端也很好用
Obsidian日记自动按月归档 + 一键创建明日日记,手机端也很好用

Obsidian的日记功能挺好用的,但是一直有一个小问题:如果想把日记按照月份整理,在电脑上手动移动文件还好,在手机上就很麻烦。 比如我希望最后整理成这样: 01-Daily └── 2026├── 09│ ├── 2026-09-23.md│… · 2026/9/27 22:56:54

人生执念的术语大全的庖丁解牛
人生执念的术语大全的庖丁解牛

总纲:执念,是内心牢牢锁定唯一预设结果,拒绝接纳其他可能性的心智绑定。目标是我尽力争取,成败随缘;执念是非它不可,达不到就持续痛苦。 执念不是热爱、不是坚持。热爱是朝着方向努力,能接受现实… · 2026/9/27 22:56:54

鸿蒙应用市场:版本升级
鸿蒙应用市场:版本升级

一、升级版本应用上架后,如果需要修改应用,需在 AppGallery Connect 中提交新版本给华为进行审核。审核通过后,用户将在华为应用市场搜索到最新的应用版本。二、前提条件已准备好需要更新的材料或信息,例如新版本软件包、新应用素… · 2026/9/27 22:56:47

STM32智能花盆:闭环自动浇水系统实战设计
STM32智能花盆:闭环自动浇水系统实战设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:48

STM32CubeMX嵌入式开发工具教程:从固件库管理到ADC、SPI、LwIP配置与常见报错排查
STM32CubeMX嵌入式开发工具教程:从固件库管理到ADC、SPI、LwIP配置与常见报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:48

WSA玩机必备:ADB连接与设备型号伪装实战指南
WSA玩机必备:ADB连接与设备型号伪装实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:48

Ludusavi 0.31.0 Windows 64位下载:游戏存档备份与恢复说明
Ludusavi 0.31.0 Windows 64位下载:游戏存档备份与恢复说明

Ludusavi 0.31.0 Windows 64位下载 官方发行页 本文整理 Ludusavi 0.31.0 的Windows 64位压缩包,供需要固定版本的游戏存档备份环境使用。备用入口经草料提示页进入夸克,点击“继续访问”查看文件;登录与下载要求以实际页面为准。 文件信息… · 2026/9/27 23:29:48

LVGL v8到v9迁移实战:ESP32平台架构重构与适配指南
LVGL v8到v9迁移实战:ESP32平台架构重构与适配指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:48

序列化与反序列化深度解析:从Java原生到JSON选型及反序列化攻击防御
序列化与反序列化深度解析:从Java原生到JSON选型及反序列化攻击防御

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:42

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码