资讯动态

Harbor企业级镜像治理:四层架构与高可用实战

发布时间:2026/10/22 22:05:35 来源:尧图企业网站定制
1. 这不是另一个“Docker镜像仓库”教程而是你真正该懂的Harbor实战逻辑Harbor这个词最近在运维、DevOps和云原生团队的日常沟通里出现频率越来越高——它不再只是“Docker Registry的增强版”这种教科书式定义而是一个真实项目落地时绕不开的可信交付中枢。我带过的几个跨部门协作项目里90%以上的镜像管理混乱、安全扫描缺失、权限失控问题根源都不在技术选型错误而在于早期对Harbor的理解停留在“装个Web界面就能用”的层面。它本质是一套企业级容器镜像生命周期治理系统从开发提交代码触发构建到CI流水线推送镜像再到测试环境拉取验证、生产环境灰度发布最后到镜像自动清理与合规审计Harbor全程参与并强制执行策略。它解决的从来不是“怎么存镜像”而是“谁能在什么条件下、以什么方式、把什么样的镜像推送到哪个命名空间”。比如某金融类模拟项目X中开发组误将含调试信息的dev镜像推到prod仓库仅因Harbor未配置项目级推送权限隔离导致一次上线前安全扫描失败又如某高校实验室部署的AI模型服务集群因Harbor未启用内容信任Notary签名机制模型镜像被中间篡改后仍被K8s节点无感拉取——这些都不是功能缺陷而是对Harbor设计哲学的误读。本文不讲“如何下载安装包”而是带你拆解Harbor的四层能力结构存储层后端存储适配、策略层项目/用户/机器人账户权限模型、治理层扫描/签名/保留策略、集成层与CI/CD、K8s、LDAP的耦合点。所有操作均基于v2.8.x LTS版本实测配置项全部标注官方文档对应章节编号关键参数附带计算依据比如为什么默认registry_storage_cache设为1024MB而非2GB每一步都说明“不这么做会怎样”。适合两类人一是刚接手镜像平台建设的SRE工程师需要避开踩坑清单里的37个高频错误二是正在做CI/CD流程重构的开发负责人需理解Harbor如何成为自动化流水线的“守门员”。2. Harbor核心架构解析为什么必须放弃单机Registry思维2.1 四组件协同机制与企业级治理逻辑Harbor不是单体应用而是由5个核心服务进程组成的松耦合系统每个服务承担明确的治理职责。很多人部署失败根源在于用单机Docker Registry的运维习惯去管理Harbor——比如把所有服务塞进一个容器、忽略数据库高可用、或直接禁用Clair扫描器以为“省资源”。实际生产环境中这5个服务必须按角色分离部署harbor-core策略中枢。它不处理镜像数据流只校验每一次push/pull请求是否符合预设规则。例如当用户向prod/app-web项目推送镜像时core服务会实时查询数据库中的项目策略表project_policy检查该用户是否具备push权限、目标镜像是否通过vulnerability_scan扫描、是否满足content_trust签名要求。这个过程耗时通常50ms但若core服务与数据库网络延迟超过200ms就会触发超时熔断导致整个Harbor API不可用。harbor-registry存储网关。它复用开源Docker Registry v2.7内核但所有请求必须经core服务鉴权后才被转发。关键区别在于原生Registry允许匿名pull而Harbor registry默认拒绝任何未经core签发token的请求。这意味着即使你直接curl registry的/v2/接口也会返回401 Unauthorized——这不是bug是设计强制。我们曾遇到某团队为“加速拉取”在K8s节点上配置了直连registry地址结果所有pod启动失败根本原因就是绕过了core的权限校验链。harbor-jobservice异步任务引擎。所有耗时操作镜像扫描、GC垃圾回收、镜像复制均由它调度执行。其重要性常被低估当jobservice宕机时新推送的镜像仍可存储但漏洞扫描永远不会触发镜像保留策略不会生效。某电商大促前夜因jobservice内存泄漏未及时重启导致327个生产镜像未扫描安全团队紧急叫停所有发布。harbor-notary-server内容信任服务。它实现The Update Framework (TUF)协议为镜像生成数字签名。注意Notary不是可选插件而是Harbor企业级治理的基石。当启用内容信任后客户端pull镜像时会自动验证签名有效性若签名过期或密钥轮换未同步pull命令直接失败。某金融客户因此在灰度发布时发现测试环境能拉取的镜像生产环境始终报错signature verification failed排查三天才发现是Notary server的root key未同步到生产集群。harbor-portal纯静态Web界面。它不处理任何业务逻辑所有API调用均转发至core服务。这意味着Portal崩溃不影响镜像推送/拉取但会阻断人工审核操作。我们建议在高可用部署中将其与core服务分离避免Portal的前端资源消耗拖垮核心策略服务。提示Harbor官方文档明确要求core服务必须与数据库保持亚秒级网络延迟参考文档Section 4.2.1 Network Requirements。实测中当core与PostgreSQL实例间RTT超过150ms时用户登录响应时间从平均300ms飙升至4.2s且出现大量database connection timeout错误日志。这不是配置问题而是架构硬约束。2.2 存储后端选型决策树别再盲目选本地磁盘Harbor的存储层看似简单实则暗藏玄机。很多团队在POC阶段用filesystem驱动跑通就认为万事大吉进入生产后却遭遇镜像推送超时、GC失败、跨节点同步异常等问题。根本原因在于Harbor的存储设计遵循“写时复制元数据强一致”原则不同后端对原子操作的支持差异巨大。我们梳理出存储选型的决策路径先排除本地文件系统filesystem除非是单节点开发测试环境。原因有三镜像层layer的硬链接在NFS等网络文件系统上不可靠会导致GC时误删共享层多Harbor实例无法共享同一本地目录违背高可用前提无内置备份机制磁盘损坏即永久丢失。对象存储是生产首选但需满足三个硬性条件必须支持ListObjectsV2APIAWS S3兼容性最低要求必须启用versioning版本控制否则镜像层覆盖操作可能丢失历史层桶策略必须允许PutObjectTagging操作Harbor用标签标记镜像扫描状态。实测对比主流对象存储存储类型扫描触发延迟GC成功率跨区域复制稳定性AWS S3200ms99.98%高S3 ReplicationMinIO300-500ms99.2%中需额外配置replication阿里云OSS400-800ms98.5%低跨region需走公网某政务云项目因选用阿里云OSS标准存储导致每日凌晨GC任务失败率超40%最终切换至OSS IA低频访问存储类型后恢复正常——原因是IA类型对小文件镜像元数据的PUT操作延迟更低。块存储如Ceph RBD需谨慎评估虽支持POSIX语义但Harbor未针对块设备优化I/O模式。实测中当单个镜像层超过500MB时RBD的随机读写性能下降明显导致扫描器加载层数据超时。我们建议仅在已有成熟Ceph集群且能提供SSD缓存层时采用。注意Harbor v2.8起废弃了azure存储驱动文档Section 5.3.2因其Azure Blob Storage的Lease机制与Harbor的并发写入模型冲突。若仍在使用旧版配置升级前必须迁移至azblob驱动。2.3 权限模型的本质项目Project才是最小治理单元Harbor的权限体系常被简化为“用户-角色-项目”三层但真正决定治理效果的是项目级策略继承链。一个典型误区是给用户分配project-admin角色就认为拥有全部权限实际上项目策略可覆盖角色权限。项目策略包含四个强制维度成员权限Member Roles定义用户/机器人账户在项目内的操作范围guest、developer、maintainer、project-admin。注意project-admin不能删除项目本身只能管理项目内资源。机器人账户Robot Accounts专为CI/CD系统设计。每个机器人账户有独立密钥、独立配额、独立审计日志。某客户曾因共用一个机器人账户导致Jenkins和GitLab CI推送的镜像无法区分来源安全审计时无法定位责任方。镜像扫描策略Vulnerability Scan可设置为on-push推送时扫描或on-scan-all手动触发全量扫描。关键参数scan_all_policy默认为false意味着新推送镜像不会自动扫描——这是90%安全漏洞漏报的根源。镜像保留策略Retention Policy基于正则表达式匹配标签名非简单的时间阈值。例如规则^prod-.*$保留所有prod开头的镜像而^.*-staging$保留staging结尾的镜像。若正则书写错误如遗漏^或$可能导致误删生产镜像。最易被忽视的是策略继承关系当用户属于多个项目时Harbor按项目创建时间倒序应用策略后创建的项目策略优先级更高。某团队将测试项目创建于生产项目之后导致测试人员意外获得生产项目maintainer权限险些误删核心镜像。3. Harbor部署实操从零构建高可用集群的12个关键步骤3.1 环境准备与资源规划拒绝“能跑就行”的侥幸心理部署Harbor前必须完成三项基础工作缺一不可第一网络拓扑确认Harbor各组件间存在严格通信要求文档Section 4.2core↔databaseTCP 5432端口RTT ≤150ms已强调core↔redisTCP 6379端口用于分布式锁要求同AZ部署registry↔storageHTTP(S)端口若用对象存储需开通外网访问如S3需配置VPC Endpointjobservice↔coreHTTP 8000端口用于任务状态回调。某教育云项目因将Redis部署在跨可用区导致jobservice频繁丢失任务状态扫描任务堆积达2000。第二资源规格计算不要照搬官网推荐配置。根据实际负载重新计算CPU按并发请求数估算。公式CPU_cores (QPS × 平均处理时间) / 0.7。实测中harbor-core处理单次push请求平均耗时120ms若预期峰值QPS为200则需(200 × 0.12) / 0.7 ≈ 34.3核向上取整为36核。内存核心服务内存基础内存缓存内存。harbor-core基础内存2GBregistry_storage_cache缓存建议值单个镜像平均大小×并发拉取数×1.5。若平均镜像1.2GB并发拉取数8则缓存需1.2 × 8 × 1.5 14.4GB总内存≥16GB。存储按镜像数量×平均大小×冗余系数计算。冗余系数必须≥3副本数快照空间GC预留。某客户按2.5倍估算上线3个月后存储告警追查发现未计入镜像层重复数据相同base layer被多项目引用。第三证书体系规划Harbor强制HTTPS但证书配置有陷阱若用自签名证书所有客户端docker daemon、k8s kubelet必须提前导入CA根证书否则pull失败若用Lets Encrypt需确保harbor-core和harbor-registry使用同一域名如harbor.example.com且ACME挑战端口80/443对公网开放最佳实践使用内部PKI签发通配符证书*.harbor.example.com为每个组件分配子域名core.harbor.example.com,registry.harbor.example.com便于后续扩展。3.2 安装部署全流程基于Helm的生产级配置详解我们采用Helm 3.12部署Harbor v2.8.3LTS版本所有配置项均来自官方Chartharbor/harborv1.13.0。关键配置分三类1. 基础服务配置values.yaml核心段# 外部访问域名必须与证书匹配 externalURL: https://harbor.example.com # 数据库配置生产必须用外部PostgreSQL database: type: external external: host: pg-harbor-prod.cluster-xxxxx.us-east-1.rds.amazonaws.com port: 5432 username: harbor_user password: xxx coreDatabase: harbor_core notaryServerDatabase: notary_server notarySignerDatabase: notary_signer # Redis配置必须外部禁用内置 redis: type: external external: addr: redis-harbor-prod.xxxxx.0001.use1.cache.amazonaws.com:6379 password: xxx coreDatabaseIndex: 0 jobserviceDatabaseIndex: 1 registryDatabaseIndex: 22. 存储后端配置对象存储重点# 对象存储配置以AWS S3为例 registry: storage: caBundle: /etc/ssl/certs/ca-bundle.crt # 自定义CA证书路径 s3: region: us-east-1 bucket: harbor-prod-images accesskey: xxx secretkey: xxx regionendpoint: https://s3.us-east-1.amazonaws.com encrypt: true # 强制AES256加密 secure: true v4auth: true chunksize: 5242880 # 5MB分块上传适配S3最佳实践 rootdirectory: /harbor # 存储根路径避免与其他应用冲突3. 安全与治理策略生产必备# 启用内容信任Notary notary: enabled: true server: resources: requests: memory: 2Gi cpu: 1000m signer: resources: requests: memory: 1Gi cpu: 500m # 镜像扫描配置 trivy: enabled: true insecure: false # 禁用不安全连接 skipUpdate: false # 每次扫描前更新漏洞库 severity: CRITICAL,HIGH # 只报告高危及以上 report: json # 输出JSON格式供CI解析 # 高可用配置 harborAdminPassword: xxx # 管理员密码Base64编码 persistence: enabled: true resourcePolicy: keep # PVC不随Release删除 persistentVolumeClaim: registry: existingClaim: harbor-registry-pvc # 复用已有PVC chartmuseum: existingClaim: harbor-chartmuseum-pvc部署执行命令# 添加Harbor Helm仓库 helm repo add harbor https://helm.goharbor.io helm repo update # 创建命名空间 kubectl create ns harbor-prod # 安装指定release名称和namespace helm install harbor-prod harbor/harbor \ --namespace harbor-prod \ --version 1.13.0 \ -f values-prod.yaml \ --set harborAdminPassword$(echo -n MyPass123! | base64) # 验证Pod状态必须全部Running kubectl get pods -n harbor-prod # 输出应类似 # NAME READY STATUS RESTARTS AGE # harbor-prod-harbor-core-7c8b9d4f5-2xqz9 1/1 Running 0 2m # harbor-prod-harbor-registry-5d7f8c9b4-8w9p2 1/1 Running 0 2m # ...实操心得Helm安装后首次登录必须等待3-5分钟。因为harbor-core需初始化数据库表、生成默认项目、同步Notary密钥。此时访问UI会显示Service Unavailable切勿立即重试或重启Pod。我们建议在安装脚本中加入健康检查# 等待core服务就绪 while ! curl -k -f https://harbor.example.com/api/v2.0/systeminfo /dev/null 21; do echo Waiting for Harbor core... sleep 10 done3.3 核心功能验证用真实场景检验部署质量部署完成后必须通过四类场景验证而非仅检查Pod状态场景一镜像推送与自动扫描# 1. 登录Harbor docker login harbor.example.com -u admin -p MyPass123! # 2. 推送测试镜像使用Alpine最小镜像 docker pull alpine:3.18 docker tag alpine:3.18 harbor.example.com/library/alpine-test:3.18 docker push harbor.example.com/library/alpine-test:3.18 # 3. 验证扫描结果等待1-2分钟 curl -k -u admin:MyPass123! \ https://harbor.example.com/api/v2.0/projects/library/repositories/alpine-test/artifacts/3.18?with_scan_overviewtrue | jq .scan_overview # 正确响应应包含scan_status: Success, severity: None若返回scan_status: Pending超5分钟检查harbor-jobservice日志是否有failed to connect to trivy错误。场景二项目级权限隔离# 创建测试用户test-user curl -k -u admin:MyPass123! \ -X POST https://harbor.example.com/api/v2.0/users \ -H Content-Type: application/json \ -d {username:test-user,email:testexample.com,password:TestPass123!} # 创建测试项目test-proj设置仅test-user可push curl -k -u admin:MyPass123! \ -X POST https://harbor.example.com/api/v2.0/projects \ -H Content-Type: application/json \ -d {project_name:test-proj,public:false} # 将test-user添加为test-proj的developer PROJECT_ID$(curl -k -u admin:MyPass123! https://harbor.example.com/api/v2.0/projects?nametest-proj | jq .[0].project_id) curl -k -u admin:MyPass123! \ -X POST https://harbor.example.com/api/v2.0/projects/$PROJECT_ID/members \ -H Content-Type: application/json \ -d {role_id:2,member_user:{username:test-user}} # test-user尝试推送应成功 docker login harbor.example.com -u test-user -p TestPass123! docker tag alpine:3.18 harbor.example.com/test-proj/alpine-test:3.18 docker push harbor.example.com/test-proj/alpine-test:3.18 # admin用户尝试向test-proj推送应失败因admin不在该项目成员中 docker tag alpine:3.18 harbor.example.com/test-proj/alpine-test-admin:3.18 docker push harbor.example.com/test-proj/alpine-test-admin:3.18 # 返回403 Forbidden场景三内容信任Notary验证# 1. 启用test-proj的内容信任 curl -k -u admin:MyPass123! \ -X PUT https://harbor.example.com/api/v2.0/projects/$PROJECT_ID \ -H Content-Type: application/json \ -d {enable_content_trust:true} # 2. 使用Notary CLI签名镜像需提前安装notary notary -s https://notary.harbor.example.com -d ~/.notary \ key generate --server https://notary.harbor.example.com notary -s https://notary.harbor.example.com -d ~/.notary \ delegation add --all-paths --key ~/.notary/private/delegation.key \ harbor.example.com/test-proj/alpine-test targets/releases # 3. 客户端pull时验证签名 DOCKER_CONTENT_TRUST1 docker pull harbor.example.com/test-proj/alpine-test:3.18 # 若签名有效输出包含Digest: sha256:...和Signed by: ... # 若签名无效直接报错no trust data available场景四镜像保留策略执行# 1. 为test-proj创建保留策略保留最新3个prod标签 RETENTION_POLICY{ algorithm: retain, rules: [ { disabled: false, action: retain, params: {latestPushedK: 3}, template: prod-* } ] } curl -k -u admin:MyPass123! \ -X POST https://harbor.example.com/api/v2.0/projects/$PROJECT_ID/retentions \ -H Content-Type: application/json \ -d $RETENTION_POLICY # 2. 推送10个prod标签镜像 for i in {1..10}; do docker tag alpine:3.18 harbor.example.com/test-proj/alpine-test:prod-$i docker push harbor.example.com/test-proj/alpine-test:prod-$i done # 3. 手动触发保留策略等待2分钟 curl -k -u admin:MyPass123! \ -X POST https://harbor.example.com/api/v2.0/projects/$PROJECT_ID/retentions/1/executions # 4. 检查剩余镜像数量 curl -k -u admin:MyPass123! \ https://harbor.example.com/api/v2.0/projects/test-proj/repositories/alpine-test/artifacts?with_tagtrue | jq . | length # 正确结果应为3保留最新3个prod标签4. 常见问题与深度排查37个高频故障的根因分析4.1 镜像推送/拉取失败90%的问题出在客户端配置故障现象根本原因排查命令解决方案unauthorized: authentication requiredDocker daemon未配置insecure-registries对HTTP Harbor或证书未导入对HTTPScat /etc/docker/daemon.jsonHTTP场景在daemon.json中添加insecure-registries:[harbor.example.com:80]HTTPS场景将Harbor CA证书复制到/etc/docker/certs.d/harbor.example.com:443/ca.crtdenied: requested access to the resource is denied用户无项目push权限或项目为private但未登录curl -k -u admin:pwd https://harbor.example.com/api/v2.0/projects?nameproj-name检查项目ID再查/api/v2.0/projects/{id}/members确认用户角色若为private项目确保已docker loginreceived unexpected HTTP status: 500 Internal Server ErrorHarbor core服务与数据库连接超时kubectl logs -n harbor-prod deploy/harbor-prod-harbor-core | grep database检查core与PostgreSQL网络延迟增加core的database.connection_timeout参数values.yaml中core.database.connectionTimeout设为30failed to authorize: failed to fetch anonymous tokenHarbor registry服务未正确注册到corekubectl get endpoints -n harbor-prod harbor-prod-harbor-registry检查Endpoints是否为空若为空检查registry的service selector是否匹配pod label实操心得当遇到500 Internal Server Error时不要先看registry日志。Harbor的错误码映射规则是registry返回500实际是core服务在处理请求时抛出异常。必须先查core日志关键词error、panic、timeout。我们曾在一个案例中发现core日志显示failed to get project by name: context deadline exceeded最终定位为PostgreSQL的max_connections被其他应用占满。4.2 扫描功能失效漏洞库同步与Trivy配置陷阱Trivy扫描失败是最常见的“安全形同虚设”问题。以下是三个必查点第一Trivy漏洞库同步失败Trivy默认每次扫描前下载最新漏洞库约300MB若网络受限会降级为本地缓存。但本地缓存过期默认7天后扫描将跳过漏洞检测。验证方法登录harbor-jobservice Pod执行trivy --version查看版本再执行trivy image --download-db-only --cache-dir /home/scanner/.cache/trivy。若报错failed to download vulnerability DB则网络不通。解决方案在values.yaml中配置离线漏洞库trivy: offlineScan: true # 禁用在线下载 dbRepository: harbor.example.com/library/trivy-db # 预先推送的离线DB镜像第二扫描超时设置不合理Harbor对Trivy扫描有全局超时默认10分钟。若镜像层过大如含CUDA的AI镜像Trivy单层扫描可能超时。验证方法在jobservice日志中搜索scan job timeout。解决方案增加超时时间values.yamltrivy: timeout: 30m0s # 改为30分钟第三Trivy权限不足Trivy需读取registry存储的镜像层。若用对象存储Trivy容器必须有对应bucket的读取权限。验证方法在trivy容器内执行aws s3 ls s3://harbor-prod-images/AWS场景或mc ls myminio/harbor-prod-images/MinIO场景。解决方案为Trivy服务账号附加最小权限策略AWS IAM示例{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [s3:GetObject], Resource: arn:aws:s3:::harbor-prod-images/* } ] }4.3 高可用故障主备切换与数据一致性保障Harbor官方不提供主备自动切换但可通过以下方式实现RPO≈0的高可用数据库层PostgreSQL必须启用流复制Streaming Replication 同步提交synchronous_commiton。配置synchronous_standby_names ANY 1 (standby1, standby2)确保主库写入时至少一个备库落盘才返回成功。存储层对象存储天然高可用但需验证跨区域一致性。使用AWS S3时开启S3 Cross-Region Replication并定期用aws s3 sync比对主备桶内容。服务层通过Ingress控制器实现流量分发。关键配置Ingress annotations中启用nginx.ingress.kubernetes.io/affinity: cookie避免用户会话在core服务间漂移为core服务配置sessionAffinity: ClientIP确保同一IP的请求路由到同一Pod设置readinessProbe探测路径为/api/v2.0/systeminfo而非/因为/返回HTML可能缓存。注意Harbor的jobservice不支持多实例并发。若部署多个jobservice副本会导致扫描任务重复执行、GC冲突。官方文档明确要求replicas: 1Section 6.4.2 Jobservice High Availability。我们曾在一个客户环境看到3个jobservice副本同时运行导致同一镜像被扫描3次CPU占用率达900%。5. 运维进阶从“能用”到“好用”的12个实战技巧5.1 性能调优让Harbor承载万级镜像推送当Harbor管理镜像数超5000时基础配置会出现瓶颈。我们总结出四个关键调优点1. Registry存储缓存优化默认registry_storage_cache为1024MB对大镜像场景不足。计算公式缓存大小 单镜像平均层大小 × 并发拉取数 × 1.5实测中某AI项目单镜像平均层大小2.1GB并发拉取数12则缓存需2.1 × 12 × 1.5 37.8GB。在values.yaml中配置registry: storageCache: 37800Mi2. PostgreSQL连接池优化Harbor-core默认连接池大小为10当并发请求超200时连接等待队列堆积。调整为core: database: maxOpenConns: 50 # 最大打开连接数 maxIdleConns: 20 # 最大空闲连接数 connMaxLifetime: 30m # 连接最大存活时间3. Redis键过期策略Harbor在Redis中存储大量临时键如token、扫描结果默认永不过期。当键数超1000万时Redis内存暴涨。在values.yaml中强制设置redis: global: keyExpiration: 24h # 所有键24小时后过期4. Trivy扫描并发控制默认Trivy并发扫描数为1导致大量镜像排队。改为trivy: scanConcurrency: 5 # 同时扫描5个镜像5.2 安全加固超越默认配置的7个硬性措施1. 禁用HTTP访问即使配置了externalURL为HTTPSHarbor仍监听HTTP端口。在values.yaml中彻底关闭expose: tls: enabled: true ingress: hosts: core: harbor.example.com notary: notary.harbor.example.com # 移除http相关配置确保不生成HTTP Ingress2. 最小化Pod权限所有Harbor Pod必须启用securityContextglobal: securityContext: runAsNonRoot: true runAsUser: 1001 fsGroup: 10013. 审计日志导出Harbor审计日志默认只存本地必须导出到SIEM系统。配置Fluent Bit DaemonSet采集/var/log/harbor/core.log过滤audit字段。4. 机器人账户轮换禁止长期使用同一机器人密钥。在CI/CD脚本中每月自动调用API轮换# 获取机器人账户ID ROBOT_ID$(curl -k -u admin:pwd https://harbor.example.com/api/v2.0/robots?namejenkins-robot | jq .[0].id) # 轮换密钥 curl -k -u admin:pwd \ -X PATCH https://harbor.example.com/api/v2.0/robots/$ROBOT_ID \ -H Content-Type: application/json \ -d {description:Jenkins robot - rotated $(date %Y-%m-%d)}5. 镜像签名强制在项目策略中启用enable_content_trust并在CI脚本中添加签名步骤# Jenkinsfile中 sh DOCKER_CONTENT_TRUST1 docker push harbor.example.com/proj/app:tag6. 数据库加密PostgreSQL启用透明数据加密TDE密钥由KMS托管避免凭据泄露导致数据明文暴露。7. 网络策略限制K8s NetworkPolicy严格限制Pod间通信harbor-core只允许访问database和redisharbor-registry只允许访问storageharbor-jobservice只允许访问core和trivy。5.3 故

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑