尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

企业级容器镜像仓库Harbor:从核心架构到高可用部署与运维实战

企业级容器镜像仓库Harbor:从核心架构到高可用部署与运维实战 1. 从“镜像仓库”到“企业级制品中心”Harbor的定位与价值如果你在容器化这条路上已经走了一段时间那么“镜像仓库”这个词对你来说一定不陌生。从最开始的Docker Hub到后来自己用Docker Registry搭个私有仓库这几乎是每个团队的必经之路。但当你团队规模扩大项目数量激增镜像从几十个变成几百上千个并且开始涉及安全扫描、权限管控、多环境分发这些需求时你会发现一个简单的Registry已经有点力不从心了。这时候一个更强大的工具就该登场了它就是Harbor。Harbor直译过来是“港湾”这个名字非常贴切。它不仅仅是一个存放容器镜像的仓库更是一个为企业级云原生应用提供制品Artifact全生命周期管理的“安全港湾”。它由VMware公司现为Broadcom旗下中国团队开源现在是CNCF云原生计算基金会的毕业项目这意味着它的成熟度和社区活跃度都得到了业界的广泛认可。简单来说Harbor在基础的镜像存储和分发功能之上集成了企业最关心的几大核心能力基于角色的访问控制RBAC、镜像漏洞扫描、镜像签名与内容信任、多租户管理、跨仓库复制、以及一个直观的Web管理界面。为什么说它解决了从“能用”到“好用”、“敢用”的关键问题举个例子早期我们用自建的Docker Registry权限管理基本靠防火墙策略谁都能推能拉镜像有没有安全漏洞不知道只能等运行时出问题生产环境的镜像和测试环境的怎么保证一致靠人工记录和自觉。而Harbor把这些都变成了可配置、可审计、自动化的流程。它让镜像从开发者的本地环境到测试、预发布、生产环境的流转变成了一条清晰、可控、安全的流水线。对于运维和安全团队而言Harbor提供了治理的抓手对于开发团队而言它提供了自助服务和效率提升的工具。接下来我们就深入Harbor的内部看看它是如何构建起这座“港湾”的。2. Harbor的核心架构与组件拆解不只是个带UI的Registry要理解Harbor的强大之处必须先弄明白它的内部构造。很多人初次接触Harbor会以为它只是一个给Docker Registry套了个Web壳子的东西。这个理解就太片面了。Harbor是一个由多个独立组件构成的分布式系统这些组件协同工作共同提供了远超单一Registry的功能。典型的Harbor高可用部署会包含以下核心组件理解它们各自的责任是后续运维和排错的基础。Core核心服务这是Harbor的大脑和API网关。所有通过Web UI、命令行工具如docker client或其他系统如CI/CD流水线发起的请求首先都会到达Core服务。它负责处理用户认证、权限校验、项目管理、Webhook触发等所有业务逻辑并协调其他组件完成具体任务。比如当你通过docker push推送镜像时docker client实际上是在和Core服务通信由Core来验证你的权限并最终指示Registry组件存储数据。Registry这就是我们熟悉的那个容器镜像仓库Docker Distribution。在Harbor中它被深度集成主要负责镜像和ChartHelm包等制品二进制数据的实际存储、上传和下载。Harbor对原生的Registry进行了增强使其能够与Harbor的数据库用于存储元数据进行交互。PortalWeb UI提供图形化管理界面。通过它管理员可以管理用户、项目、配置复制策略开发者可以浏览镜像、查看漏洞报告、管理自己的项目成员。它是Harbor易用性的重要体现。Database通常使用PostgreSQL或MySQL。它存储了Harbor所有的元数据包括用户信息、项目信息、机器人账户、权限策略、复制任务日志、系统配置等。这里有一个非常重要的注意点镜像本身的层数据blobs和清单manifests是存储在Registry后端的存储系统如文件系统、S3中的而描述这个镜像属于哪个项目、谁创建的、有哪些标签等“描述信息”则存在数据库里。两者必须保持一致系统才能正常工作。Jobservice这是Harbor的“后台任务引擎”。所有异步的、耗时的任务都交给它来处理。最典型的就是镜像复制和漏洞扫描。当你设置了一个从北京仓库复制到上海仓库的策略后Core服务会创建一个复制任务扔到Jobservice的队列里Jobservice会异步地执行拉取、推送的全过程。同样触发镜像扫描后具体的扫描工作也是由Jobservice调度扫描器组件来完成的。这种设计避免了前端请求被长时间阻塞。Redis用作Jobservice的任务队列缓存、Core服务的会话Session存储以及一些临时数据的缓存。它是保证系统性能和无状态扩展的关键组件。Trivy/Scanner Adapter漏洞扫描器。Harbor默认集成了Trivy从2.0版本开始这是一个当前非常流行且开源的漏洞扫描工具。它会拉取镜像的每一层与CVE通用漏洞披露数据库进行比对生成详细的漏洞报告。Harbor也支持通过Adapter模式接入其他扫描器如Anchore、Clair等提供了灵活性。Notary提供内容信任Content Trust服务即镜像签名和验证。它可以确保你拉取的镜像确实来自可信的发布者且在传输过程中未被篡改。这对于保障供应链安全至关重要。这些组件通常以容器化的方式运行通过Docker Compose或Kubernetes Helm Chart进行部署和编排。它们之间通过内部网络通信共同构成了一个功能完备的企业级制品仓库。3. 实战部署从零搭建一个高可用的Harbor集群了解了架构我们动手搭建一个。对于生产环境单节点部署存在单点故障风险因此高可用HA部署是必须的。这里我们以使用外部数据库PostgreSQL和外部Redis并配置共享对象存储如S3/MinIO的方案为例这是最经典、扩展性最好的HA架构。它确保了无状态组件Core, Jobservice, Portal可以水平扩展而有状态的数据数据库、Redis、镜像存储被外置并共享。3.1 环境与依赖准备首先你需要准备至少两台Linux服务器虚拟机或物理机作为Harbor服务节点。系统建议使用Ubuntu 20.04/22.04 LTS或CentOS/RHEL 8。一个高可用的PostgreSQL集群如Patroni etcd或云厂商的RDS服务。记下连接地址、端口、数据库名、用户名和密码。一个高可用的Redis集群如Redis Sentinel或云厂商服务。记下连接地址和端口。一个共享对象存储。可以是AWS S3、阿里云OSS、腾讯云COS或者自建的MinIO集群。确保所有Harbor节点都能访问这个存储桶Bucket并准备好Access Key和Secret Key。域名与SSL证书为Harbor准备一个域名如harbor.yourcompany.com并申请一个受信任的SSL证书或使用Let‘s Encrypt自动签发。切勿在生成环境使用自签名证书这会导致所有客户端都需要额外配置带来巨大的运维负担。在所有Harbor节点上安装必要的依赖# Ubuntu/Debian sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # CentOS/RHEL sudo yum install -y yum-utils device-mapper-persistent-data lvm2安装Docker和Docker Compose如果使用Compose部署# 安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo systemctl enable docker sudo systemctl start docker # 安装Docker Compose Plugin (推荐替代旧的docker-compose二进制文件) sudo apt-get update # For Ubuntu sudo apt-get install -y docker-compose-plugin # 验证 docker compose version3.2 下载与配置Harbor安装包访问Harbor的GitHub Release页面下载最新稳定版的离线安装包包含所有镜像便于内网部署。例如wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz tar xzvf harbor-offline-installer-v2.10.0.tgz cd harbor关键的配置文件是harbor.yml。我们需要重点修改以下部分# 主机名必须配置为访问Harbor的域名 hostname: harbor.yourcompany.com # HTTPS配置 https: port: 443 # 你的证书和私钥路径 certificate: /data/cert/yourdomain.com.crt private_key: /data/cert/yourdomain.com.key # 外部数据库配置 external_database: harbor: host: your-pg-host port: 5432 db_name: harbor username: harbor password: your-strong-password ssl_mode: disable # 生产环境建议启用并配置SSL clair: # 如果使用Clair扫描器需要配置 ... notary_signer: ... notary_server: ... # 外部Redis配置 external_redis: host: your-redis-host port: 6379 password: your-redis-password # 如果有的话 # Redis数据库索引默认0 registry_db_index: 1 jobservice_db_index: 2 chartmuseum_db_index: 3 # 如果启用Helm仓库 trivy_db_index: 4 # 如果使用Trivy扫描器 # 存储后端配置为S3兼容存储 storage_service: s3: accesskey: YOUR_S3_ACCESS_KEY secretkey: YOUR_S3_SECRET_KEY region: us-east-1 # 你的存储区域 bucket: your-harbor-bucket # 存储桶名称 # 重要对于MinIO或某些S3兼容服务需要指定endpoint endpoint: https://minio.yourcompany.com # 如果是MinIO # 是否使用路径风格访问MinIO通常需要设为true path_style: true # 是否启用HTTPS secure: true # 跳过证书验证仅用于测试生产环境请配置有效证书 skip_verify: false # 数据持久化路径当使用外部存储时本地路径仅用于临时数据或缓存 data_volume: /data # 初始化管理员密码 harbor_admin_password: Harbor12345 # 首次登录后务必修改 # 启用哪些功能 chart: absolute_url: disabled # Helm Chart仓库相关 trivy: ignore_unfixed: false # 漏洞扫描器Trivy配置 skip_update: false jobservice: max_job_workers: 10 # Jobservice工作线程数根据负载调整 notification: webhook_job_max_retry: 3 # Webhook重试次数注意storage_service.s3的配置是重中之重。endpoint和path_style这两个参数根据你的对象存储服务商不同而不同。对于AWS S3通常不需要设置endpoint对于自建MinIO则必须设置。path_style决定了访问URL的格式虚拟主机风格 vs 路径风格配置错误会导致无法上传/下载镜像。3.3 执行安装与初始化配置好harbor.yml后将SSL证书文件放到配置中指定的路径如/data/cert/。然后执行安装脚本sudo ./install.sh这个脚本会加载Docker镜像。根据harbor.yml生成各个组件的docker-compose配置文件。启动所有容器。执行数据库初始化如果使用内置数据库。安装完成后访问https://harbor.yourcompany.com使用用户名admin和你在配置文件中设置的密码登录。3.4 配置负载均衡与高可用现在你在一台节点上部署成功了。要实现高可用你需要在另一台或多台节点上重复3.1到3.3的步骤但有一个关键区别从第二台节点开始不需要也不应该再次运行./install.sh因为./install.sh会尝试初始化数据库而数据库已经被第一台节点初始化过了。正确的做法是在第二台节点上准备好相同的环境Docker 证书文件。将第一台节点上安装目录如/opt/harbor下的harbor.yml和整个common目录包含生成的配置文件拷贝到第二台节点的相同路径。在第二台节点上直接使用docker-compose命令启动服务cd /opt/harbor docker compose up -d现在你有了两个独立运行但共享同一套数据库、Redis和对象存储的Harbor实例。最后一步在它们前面配置一个负载均衡器如Nginx, HAProxy, 或云负载均衡器将流量分发到这两个后端实例。负载均衡器需要配置SSL终止Termination并将HTTPS流量以HTTP协议转发到后端的Harbor节点因为Harbor内部服务已经是HTTP。同时需要确保负载均衡器启用了对长连接和较大文件上传Push镜像的支持。至此一个高可用的Harbor集群就搭建完成了。这种架构下任何一个Harbor节点宕机服务都不会中断。4. 日常运维核心用户、项目、镜像与安全策略管理Harbor部署好了接下来就是日常使用了。它的管理逻辑非常清晰核心是“项目Project”。所有镜像都必须属于一个项目而所有权限都是围绕项目来设置的。4.1 用户与权限体系RBAC实战Harbor内置了基于角色的访问控制RBAC。用户分为系统管理员和普通用户。系统管理员拥有整个Harbor实例的所有权限可以管理所有用户、所有项目、系统配置等。普通用户由管理员创建或通过外部认证系统如LDAP/AD, OIDC同步而来。普通用户本身没有任何权限必须被添加到具体的项目中并赋予角色。项目角色从低到高主要有访客Guest只能拉取Pull镜像不能推送Push也不能查看日志等敏感信息。适合只读场景。开发者Developer可以推送和拉取镜像可以操作项目内的Helm Chart但不能管理项目成员或设置扫描、复制等策略。维护者Maintainer拥有开发者的所有权限此外可以编辑项目描述、配置Webhook、手动触发镜像扫描和复制。项目管理员Project Admin拥有项目的最高权限可以管理项目成员添加/删除用户并分配角色、配置镜像保留策略、配置漏洞扫描策略、配置复制策略等。实操心得权限分配要遵循最小权限原则。给CI/CD系统的机器人账户Robot Account通常只需要Developer角色用于推送构建好的镜像。给测试环境或某些只读系统如监控的账户分配Guest角色。只有团队负责人或核心运维才需要Project Admin角色。避免滥用Project Admin和系统管理员账号。4.2 镜像生命周期管理推送、拉取与清理推送镜像首先你需要让Docker客户端信任你的Harbor仓库因为使用了HTTPS。如果使用的是受信任的CA签发的证书则不需要额外配置。如果是内部CA需要将CA证书放到Docker客户端的信任目录。# 登录到你的Harbor仓库 docker login harbor.yourcompany.com # 输入用户名和密码 # 给本地镜像打上符合Harbor规范的标签 # 格式Harbor域名/项目名称/镜像名:标签 docker tag myapp:latest harbor.yourcompany.com/myproject/myapp:latest # 推送镜像 docker push harbor.yourcompany.com/myproject/myapp:latest推送成功后你可以在Harbor的Web UI对应项目的镜像仓库里看到它。拉取镜像docker pull harbor.yourcompany.com/myproject/myapp:latest镜像清理垃圾回收这是运维中的一个重要环节。当你多次推送不同标签的镜像或者删除了镜像后底层的存储层Registry并不会立即释放物理空间因为镜像层可能被其他镜像共享。Harbor提供了镜像保留策略和垃圾回收功能。保留策略你可以基于规则如保留最近N个标签、保留匹配某模式的标签自动清理旧的镜像标签。这属于“软删除”只删除元数据标签底层数据层还在。垃圾回收GC在Web UI的“系统管理”-“垃圾回收”中可以手动或定时执行GC。GC会真正删除那些没有被任何镜像标签引用的数据层blobs释放磁盘或对象存储空间。重要提示执行GC期间Registry会进入只读模式所有推送操作会被阻止因此需要在维护窗口进行。4.3 安全扫描与内容信任构筑供应链安全防线这是Harbor区别于简单仓库的核心价值。漏洞扫描全局配置系统管理员需要在“系统管理”-“漏洞扫描”中配置默认的扫描器如Trivy和扫描计划如每天凌晨自动扫描所有镜像。项目级策略项目管理员可以在项目设置中配置“自动扫描镜像”推送后自动扫描和“阻止潜在漏洞镜像”根据严重程度如Critical或High阻止该镜像被拉取。这是一个非常重要的安全门禁。查看报告在镜像详情页面可以查看详细的漏洞报告包括CVE编号、严重等级、受影响的软件包及版本、修复建议等。你可以基于此决定是否要升级基础镜像或应用依赖。内容信任Notary 内容信任机制确保了镜像的完整性和发布来源可信。它使用基于TUFThe Update Framework的Notary服务。启用在项目设置中启用“内容信任”。签名镜像推送者需要在客户端配置Docker Content TrustDCT并使用自己的私钥对推送的镜像进行签名。# 启用DCT并推送签名镜像 export DOCKER_CONTENT_TRUST1 export DOCKER_CONTENT_TRUST_SERVERhttps://harbor.yourcompany.com:4443 docker push harbor.yourcompany.com/myproject/myapp:signed-tag验证当其他用户拉取镜像时如果启用了DCTexport DOCKER_CONTENT_TRUST1Docker客户端会自动验证镜像的签名只有签名有效且来自可信发布者的镜像才会被拉取。这可以有效防止中间人攻击或仓库被篡改后分发恶意镜像。5. 高级特性与集成复制、Webhook与CI/CD流水线当你的业务扩展到多个数据中心或云区域时Harbor的复制功能就变得不可或缺。5.1 跨实例镜像复制复制功能允许你将一个Harbor实例中的项目或特定镜像自动同步到另一个Harbor实例。常见场景多地容灾与加速将镜像从中心仓库复制到各个区域的边缘仓库供当地集群拉取加速部署并降低网络延迟和出口流量成本。环境隔离在开发Harbor中测试通过的镜像自动复制到生产Harbor实现物理隔离。配置步骤在目标Harbor实例上创建一个具有项目管理员以上权限的机器人账户Robot Account。在源Harbor实例的“系统管理”-“注册表”中添加目标实例为“复制目标”填写URL和上一步创建的机器人账户凭据。在需要复制的项目中进入“复制”选项卡创建新的复制规则。选择目标实例、资源过滤器可以复制整个项目或按名称/标签过滤镜像、触发模式手动、定时、事件驱动——即推送后立即复制。保存规则。之后根据触发模式镜像就会自动同步过去。所有复制任务的历史和状态都可以在“日志”中查看。避坑经验复制大量镜像或单个超大镜像时可能会因网络超时而失败。建议在Jobservice的配置中调整超时参数jobservice.job_loggers相关配置对于不稳定网络可以考虑分批次手动触发复制。5.2 Webhook与外部系统集成Harbor支持Webhook可以在特定事件发生时如推送镜像、删除镜像、扫描完成等向一个预设的URL发送HTTP POST请求 payload中包含事件的详细信息。这是将Harbor集成到外部自动化系统的关键。典型应用CI/CD联动当开发人员推送一个带有prod标签的镜像到Harbor时Webhook触发Jenkins或GitLab CI/CD流水线自动将该镜像部署到生产环境。安全事件通知当镜像扫描发现严重Critical漏洞时Webhook触发消息通知如发送到钉钉、Slack、企业微信或自动创建JIRA工单给安全团队。镜像同步审计记录所有镜像推送/删除事件到外部的审计日志系统如ELK。配置Webhook非常简单在项目设置的“Webhook”页面添加即可需要指定目标URL、请求格式通常为JSON和触发的事件类型。5.3 与CI/CD工具无缝对接以Jenkins Pipeline为例集成Harbor非常顺畅pipeline { agent any environment { HARBOR_CREDENTIALS credentials(harbor-robot-account) // 在Jenkins中预先配置的凭据 } stages { stage(Build Push) { steps { script { docker.build(harbor.yourcompany.com/myproject/myapp:${BUILD_NUMBER}) docker.withRegistry(https://harbor.yourcompany.com, harbor-robot-account) { docker.image(harbor.yourcompany.com/myproject/myapp:${BUILD_NUMBER}).push() // 也可以推送latest标签 docker.image(harbor.yourcompany.com/myproject/myapp:${BUILD_NUMBER}).push(latest) } } } } stage(Deploy) { // 此处可以触发Kubernetes部署或者等待Webhook触发另一条流水线 steps { echo 镜像已推送至Harbor触发部署流程... // 例如调用 kubectl set image ... } } } }在这个流程中Jenkins使用一个存储在内部的机器人账户密钥登录Harbor并推送镜像。结合前面提到的Webhook可以实现推送完成后自动部署。6. 故障排查与性能调优指南即使架构再完善运维中总会遇到问题。这里分享几个常见问题的排查思路和性能优化点。6.1 常见问题排查链路问题一推送镜像失败报错“unauthorized: authentication required”排查思路检查客户端登录状态运行docker logout harbor.yourcompany.com然后重新docker login。确保使用的用户名密码或访问令牌Token有权限推送至目标项目。检查项目权限登录Web UI确认该用户是否已被添加到目标项目中并且角色是Developer、Maintainer或Project Admin。检查网络与代理如果公司有网络代理确保Docker客户端配置了正确的代理HTTP_PROXY/HTTPS_PROXY并且代理允许访问Harbor的域名和端口。检查Harbor服务状态在Harbor服务器上执行docker compose ps或docker ps查看所有核心容器特别是harbor-core是否都处于“Up”状态。查看Core服务日志docker logs -f harbor-core看是否有具体的错误信息比如数据库连接失败、Redis连接失败等。问题二拉取镜像非常慢或超时排查思路区分网络层与存储层先尝试从Harbor拉取一个非常小的镜像如alpine:latest。如果小镜像也慢问题可能出在网络或Harbor服务本身。如果小镜像快大镜像慢问题可能出在存储后端如S3/MinIO的带宽或延迟上。检查存储后端如果使用S3/MinIO登录其管理控制台查看监控指标请求延迟、带宽。检查Harbor所在区域到存储服务区域的网络状况。检查Harbor节点负载使用docker stats或top命令查看服务器CPU、内存、磁盘IO情况。重点观察harbor-registry容器的资源使用。调整Registry配置对于文件系统存储磁盘IO可能是瓶颈考虑使用SSD或更高性能的存储。对于S3存储可以在registry.yml配置文件中调整storage.s3部分的参数如chunksize分块大小对于大文件上传下载有影响。问题三Webhook触发失败排查思路查看Jobservice日志Webhook的发送是由Jobservice执行的。查看docker logs -f harbor-jobservice日志寻找与Webhook相关的错误如目标URL不可达、连接超时、返回非2xx状态码等。检查目标服务确认Webhook配置的URL地址是否正确且目标服务如Jenkins正在运行并可以访问。检查网络策略确保Harbor容器网络能够访问到目标服务的网络考虑防火墙、安全组规则。测试Webhook在Harbor的Webhook配置页面有“测试”按钮可以手动发送一个测试事件这是最直接的验证方式。6.2 性能调优建议数据库优化Harbor的数据库PostgreSQL/MySQL是性能关键。确保为数据库实例分配足够的资源CPU、内存。对于PostgreSQL可以调整shared_buffers、work_mem等参数。定期对核心表如artifacttagaudit_log进行清理或归档防止表过大影响查询性能。Redis优化确保Redis有足够内存并启用持久化。如果Jobservice任务队列堆积严重可以考虑增加jobservice.max_job_workers在harbor.yml中的值允许并行执行更多任务。存储后端优化文件系统使用高性能本地SSD并确保data_volume挂载点有充足空间和IOPS。对象存储S3/MinIO启用存储桶的传输加速如果支持。对于自建MinIO可以考虑部署分布式MinIO集群并将存储桶策略设置为reduced_redundancy如果可接受以提升写入速度。Registry缓存可以配置Redis作为Registry的缓存层缓存镜像清单manifests等元数据显著提升频繁拉取相同镜像的速度。这需要在registry.yml配置文件中进行配置。水平扩展对于访问量非常大的场景可以水平扩展无状态组件。通过增加harbor-core和harbor-jobservice的容器副本数在K8s中通过Deployment的replicas 在Compose中需要借助外部负载均衡手动部署多套并在前面用负载均衡器分发流量可以有效提升并发处理能力。从我自己的运维经验来看Harbor的稳定性很大程度上依赖于其外部依赖数据库、Redis、存储的稳定性。因此在规划Harbor集群时对这些外部组件的投入如使用云托管的RDS、Redis服务使用高可用的对象存储往往能起到事半功倍的效果远比去调优Harbor本身的几个参数来得重要。把Harbor看作一个“状态”的管理者而把“状态”本身交给更专业的、高可用的服务去存储是构建稳健企业级制品仓库的最佳实践。
返回列表