Harbor 作为企业级的容器镜像仓库,在 Kubernetes 生态中扮演着核心的镜像管理角色。下面这个表格能帮你快速抓住其核心价值和在案例中的体现:
| 特性维度 | 核心价值 | 在线书店案例体现 |
|---|---|---|
| 统一镜像源 | 为集群所有节点提供稳定、快速的私有镜像拉取源,避免依赖公网。 | 所有服务镜像(如book-service, user-service)均从内部Harbor拉取。 |
| 基于项目的访问控制 (RBAC) | 实现镜像的权限隔离,不同团队管理各自项目。 | 为前端、后端团队创建独立项目,成员只能访问被授权的项目。 |
| 安全扫描 | 集成漏洞扫描工具,提升供应链安全。 | 推送镜像时自动扫描,阻止含高危漏洞的镜像部署。 |
| 高可用与持久化 | 确保镜像仓库稳定运行,数据不丢失。 | 采用外部对象存储和数据库,即使Pod重建数据也完好。 |
下面,我们以一个名为"BookStore"的在线书店微服务项目为例,详细介绍如何从零搭建Harbor,并将其无缝集成到Kubernetes集群中,实现CI/CD流水线。
🔧 安装与配置 Harbor
1. 选择部署模式与前提准备
首先,根据你的环境选择最合适的部署方式:
| 部署方式 | 适用场景 | 关键步骤/命令 |
|---|---|---|
| Helm Chart (K8s内) | 生产环境,希望与K8s统一管理。 | helm repo add harbor https://helm.goharbor.io |
| Docker Compose | 开发、测试环境,快速独立部署。 | 下载离线包,编辑harbor.yml,运行./install.sh。 |
前提准备:确保你的服务器已安装符合版本的 Docker 和 Docker Compose 。
2. 关键配置详解
在启动安装前,需要仔细配置 harbor.yml(Docker Compose方式)或自定义的 values.yaml(Helm方式)。以下是几个关键配置点:
- 外部访问与证书 :生产环境必须启用HTTPS。
- 持久化存储:必须为 Harbor 配置持久化存储,以防止数据丢失 。
- 管理员密码 :务必修改 默认的管理员密码(
harborAdminPassword)。
配置完成后,执行安装脚本(Docker Compose方式)或 Helm 命令即可启动所有服务。通过 docker-compose ps或 kubectl get pods -n harbor确认所有组件状态为 Running或 Ready。
📥 集成 Harbor 与 Kubernetes
要让 Kubernetes 集群能够从私有的 Harbor 仓库拉取镜像,需要进行如下配置,其核心流程是通过创建一个包含 Harbor 认证信息的 Secret 来实现的:
css
flowchart TD
A[在K8s集群中创建Secret] --> B{配置Pod使用Secret}
B --> C[方式一: Pod/Deployment中直接引用]
B --> D[方式二: 添加到ServiceAccount<br>实现命名空间级自动引用]
C --> E[Kubelet使用Secret拉取镜像]
D --> E
具体操作步骤如下:
-
创建镜像拉取密钥(ImagePullSecret)
在打算部署应用的命名空间下,创建一个
docker-registry类型的 Secret 。inikubectl create secret docker-registry harbor-regcred \ --docker-server=harbor.yourcompany.com \ --docker-username=admin \ --docker-password=yourpassword \ --namespace=your-namespace -
在应用部署中引用该 Secret
在你的 Deployment YAML 中,通过
imagePullSecrets字段指明使用刚才创建的 Secret 。yamlapiVersion: apps/v1 kind: Deployment metadata: name: book-service spec: template: spec: containers: - name: book-service image: harbor.yourcompany.com/bookstore/book-service:v1.0.0 # 必须是完整地址 imagePullSecrets: # 引用密钥 - name: harbor-regcred请注意,
image字段必须是 完整的镜像地址,包含仓库地址、项目路径和标签 。
🚀 项目实战:在线书店的镜像管理
假设你正在部署上述"在线书店"应用,它包含 book-service(图书服务)和 user-service(用户服务)。
-
在 Harbor 中创建项目
登录 Harbor Web UI,为"在线书店"创建两个项目:
bookstore/backend和bookstore/frontend,并分别为后端和前端开发团队配置推送和拉取权限。 -
推送镜像到 Harbor
在 CI/CD 流水线或开发者本地,构建好镜像后,将其推送到 Harbor 对应的项目中 。
bash# 1. 为本地镜像打上符合Harbor规范的标签 docker tag book-service:latest harbor.yourcompany.com/bookstore/backend/book-service:v1.0.0 # 2. 登录Harbor(需要先在客户端配置信任证书或insecure-registry) docker login harbor.yourcompany.com # 3. 推送镜像 docker push harbor.yourcompany.com/bookstore/backend/book-service:v1.0.0 -
在 Kubernetes 中部署
编写 Deployment YAML 文件,
image字段指定为 Harbor 中的镜像地址,并正确引用imagePullSecrets,然后应用配置 。kubectl apply -f book-service-deployment.yaml -n bookstore
🛡️ 企业级增强功能与高可用
- 启用漏洞扫描:在 Harbor 中启用 Trivy 等扫描器,并配置策略,阻止携带高危漏洞的镜像被拉取 。
- 高可用与性能优化:对于生产环境,应考虑 Harbor 组件本身的高可用 。
🧩 常见问题排查 (Troubleshooting)
-
Pod 状态为
ImagePullBackOff或ErrImagePull:- 检查镜像地址和标签 :使用
docker pull <镜像完整地址>在节点上手动测试。 - 检查 Secret:确认 Secret 所在命名空间与 Pod 一致,且用户名密码正确。
- 检查证书:确保 Kubernetes 节点信任 Harbor 的 HTTPS 证书 。
- 检查镜像地址和标签 :使用
-
Harbor 服务无法访问:
- 检查 Ingress Controller 或 NodePort 服务是否正常 。
-
推送镜像失败:
- 检查客户端 Docker 守护进程的
insecure-registries配置(仅限 HTTP 或自签名证书测试环境)或是否信任了 Harbor 的 CA 证书 。
- 检查客户端 Docker 守护进程的