在 Kubernetes 集群中,容器镜像的存储与管理至关重要。Harbor 是一个开源的企业级 Docker 镜像仓库,提供安全、可扩展的镜像管理功能。本文将详细介绍如何在 Kubernetes 中配置 Harbor 作为公共服务,实现对镜像的高效管理。
1. 为什么选择 Harbor
Harbor 作为镜像仓库,具备以下显著优点:
- 安全性:支持角色访问控制(RBAC)、镜像签名、镜像扫描,确保镜像的安全。
- 企业级功能:包括镜像复制、镜像清理、日志审计等,适用于大规模集群环境。
-
与 Kubernetes 集成良好:Harbor 可以轻松集成到 Kubernetes 中,提供私有镜像仓库服务。
以下是 Harbor 架构的示意图:graph TD A[用户请求] --> B[Harbor API] B --> C[镜像管理] C --> D[存储后端]
2. 部署 Harbor 的准备工作
在部署 Harbor 之前,需要满足以下基本条件:
- Kubernetes 集群:需要一个已经部署好的 Kubernetes 集群。
- Helm:Helm 是 Kubernetes 的包管理工具,用于简化 Harbor 的安装和管理。
-
持久化存储:Harbor 需要持久化存储用于存放镜像数据和元数据信息。
3. 使用 Helm 安装 Harbor
Helm 可以简化在 Kubernetes 集群中安装应用程序的过程。以下是安装 Harbor 的步骤。
3.1 安装 Helm
如果未安装 Helm,可以使用以下命令进行安装:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
解释:
- 通过
curl
命令下载并安装 Helm,方便进行 Kubernetes 应用的管理。
3.2 添加 Harbor 的 Helm 仓库
helm repo add harbor https://helm.goharbor.io helm repo update
解释:
-
helm repo add
:添加 Harbor 的 Helm Chart 仓库。 -
helm repo update
:更新 Helm 仓库,确保获取到最新版本的 Harbor Chart。3.3 使用 Helm 安装 Harbor
helm install harbor harbor/harbor --namespace harbor --create-namespace
解释:
-
helm install
:使用 Helm 安装 Harbor。 -
--namespace harbor
:将 Harbor 安装到harbor
命名空间。 -
--create-namespace
:创建harbor
命名空间(如果不存在)。4. 配置 Harbor 的外部访问
Harbor 安装完成后,需要配置其外部访问,以便用户和 Kubernetes 集群可以访问 Harbor。
4.1 配置 Ingress 控制器
Harbor 通过 Ingress 资源来暴露服务,使得外部可以通过域名访问。以下是一个 Ingress 配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: harbor-ingress namespace: harbor annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: rules:
- host: harbor.example.com
http:
paths: - path: /
pathType: Prefix
backend:
service:
name: harbor-core
port:
number: 80
tls: - hosts:
- harbor.example.com
secretName: harbor-tls**解释**:
-
host: harbor.example.com
:定义外部访问 Harbor 的域名。 -
service.name: harbor-core
:指定 Ingress 需要暴露的服务。 -
tls
:配置 HTTPS 访问,使用harbor-tls
证书。4.2 创建 TLS 证书
为了保证访问的安全性,推荐为 Harbor 配置 TLS 证书。可以使用
cert-manager
或其他工具来生成证书,并将其应用到 Kubernetes 中。5. 将 Harbor 配置为 Kubernetes 镜像仓库
为了在 Kubernetes 集群中使用 Harbor 存储镜像,需要将 Harbor 仓库地址添加到集群的 Docker 配置中。
5.1 配置 Docker Daemon
在每个 Kubernetes 节点上,更新 Docker Daemon 的配置文件
/etc/docker/daemon.json
,添加 Harbor 的地址:{ "insecure-registries": ["harbor.example.com"] }
解释:
-
insecure-registries
:用于指定信任的镜像仓库地址(如果使用 HTTPS,需配置正确的 TLS 证书)。
更新完成后,重启 Docker 服务:systemctl restart docker
6. 推送镜像到 Harbor
完成 Harbor 的安装和配置后,可以将镜像推送到 Harbor,以供 Kubernetes 集群使用。
6.1 Docker 登录 Harbor
首先,使用 Docker 登录 Harbor:
docker login harbor.example.com
解释:
- 使用 Harbor 的域名进行登录,输入用户名和密码。
6.2 标记并推送镜像
将镜像标记为 Harbor 仓库的格式,并推送到 Harbor:
docker tag nginx:latest harbor.example.com/library/nginx:latest docker push harbor.example.com/library/nginx:latest
解释:
-
docker tag
:为本地的 nginx 镜像添加一个新的标签,指向 Harbor 仓库。 -
docker push
:将镜像推送到 Harbor 的library
项目下。7. 使用 Harbor 镜像部署应用
在 Kubernetes 集群中,可以直接使用推送到 Harbor 的镜像来部署应用。以下是一个简单的 Deployment 示例:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers:
- name: nginx
image: harbor.example.com/library/nginx:latest
ports: - containerPort: 80
**解释**:
-
image: harbor.example.com/library/nginx:latest
:使用存储在 Harbor 中的 nginx 镜像。8. 监控和管理 Harbor
Harbor 提供了丰富的管理和监控功能,可以帮助用户更好地了解镜像的使用情况。
8.1 镜像扫描
Harbor 集成了 Clair 和 Trivy 等镜像扫描工具,帮助用户检测镜像中的安全漏洞。
8.2 日志审计
通过 Harbor 的日志审计功能,可以记录所有用户的操作,包括镜像的推送、拉取、删除等,确保对操作的可追溯性。
9. 总结
通过在 Kubernetes 集群中配置 Harbor,可以有效地管理和保护容器镜像,提升集群的安全性和资源利用率。Harbor 的企业级功能使得它在镜像管理上具备显著优势,特别是在大规模集群和生产环境中尤为适用。通过 Helm 安装 Harbor 并配置外部访问,能够为 Kubernetes 提供一个可靠的私有镜像仓库,确保集群中所有应用的镜像来源可控、安全。
? 学习建议:- 在测试环境中多次尝试安装和配置 Harbor,熟悉 Helm Chart 的安装过程。
- 结合 Ingress 和 TLS 证书,确保 Harbor 的外部访问安全可靠。
- 充分利用 Harbor 的镜像扫描和日志审计功能,提升镜像的安全性管理。