打造Harbor私有化容器世界
- 1/26/2024
在当今高度容器化的软件开发环境中,安全、高效地管理和分发容器镜像至关重要。Harbor 🔗,作为一座现代化的码头,为您提供了在这片容器化海洋中航行的完美航线。它不仅是一个强大的私有 Docker 镜像仓库,更是一个功能丰富、安全可控的集成平台,助您轻松应对容器镜像的挑战。
Harbor 的魅力所在:
-
🌐 私有化镜像存储:拥有一个安全可靠的内部镜像仓库,完全在您的掌控之中。
-
🚀 多节点同步:无缝实现镜像的多节点同步和复制,确保镜像的高可用性和流畅性。
-
🛡️ 安全管控:通过详细的权限和角色管理,保障您的镜像数据的安全,轻松应对权限管理的挑战。
-
🕵️ 漏洞扫描与审计:集成 Trivy 漏洞扫描,帮助您及时发现潜在的安全问题,并提供全面的审计功能。
-
🔄 LDAP/AD 集成:轻松整合企业目录服务,简化用户和组的管理流程。
-
📦 Helm Chart 仓库:作为 Helm Chart 的理想仓库,支持方便的 Chart 管理和分享。
Harbor 提供了多种安装方式 🔗,在 Kubernetes 环境中,我们可以使用 Helm Chart 方便地部署 Harbor。
配置 NFS 存储
因为 Harbor 所使用的服务都需要进行数据持久化,因此在部署 Harbor 之前,我们务必配置适当的存储解决方案。为了实现存储的动态分配,我们选择使用 Kubernetes 的 StorageClass。
首先,我们需要在 Kubernetes 集群中配置一个支持动态分配的 NFS 存储。通过以下的 YAML 文件,我们定义了一个名为 harbor-storage 的存储类(StorageClass):
kubectl apply -f -<<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: harbor-storage
provisioner: nfs-provisioner
EOF
这一步的目的是为 Harbor 提供一个可靠的、动态分配存储资源的方案。请确保 NFS provisioner 的设置与此处的存储类定义一致。有关 NFS provisioner 的具体安装和配置过程,请参考:如何在 K8s 中使用 nfs-subdir-external-provisioner。
通过这样的存储配置,Harbor 将能够在运行时动态分配所需的存储资源,确保您的数据能够安全、高效地存储和访问。这是确保 Harbor 正常运行的重要一步,为您提供一个稳固的基础,让您能够充分发挥 Harbor 在容器镜像管理方面的优势。
安装 Harbor Helm Chart
在访问 Harbor 时,我们有多种访问方式可供选择。在这里,我们以 Ingress 和 NodePort 两种方式为例,通过在安装 Harbor 时配置不同的参数来实现不同的访问方式。
注意:helm 版本需要3.10.0 🔗以上版本。
Ingress 访问
# add repo
helm repo add harbor https://helm.goharbor.io
# install
helm install harbor harbor/harbor -n harbor \
--version 1.14.0 \
--set expose.type=ingress \
--set expose.ingress.hosts.core=harbor.lomtom.cn \
--set expose.ingress.className=nginx \
# config externalURL
--set externalURL=https://harbor.lomtom.cn \
# Specified storageClass
--set persistence.persistentVolumeClaim.registry.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.database.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.redis.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.trivy.storageClass=harbor-storage \
# Specified image(option)
--set nginx.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-nginx-photon \
--set portal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-portal \
--set core.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-core \
--set jobservice.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-jobservice \
--set registry.registry.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-registry-photon \
--set registry.controller.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-registryctl \
--set trivy.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-trivy-adapter-photon \
--set database.internal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-db \
--set redis.internal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-redis-photon \
--set exporter.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-exporter
上述命令中的配置参数说明如下:
--set expose.type=ingress: 指定 Harbor 的访问方式为 Ingress。--set expose.ingress.hosts.core=harbor.lomtom.cn: 指定 Ingress 中的域名,即通过该域名访问 Harbor。--set expose.ingress.className=nginx: 指定 Ingress 的类别为 nginx,该参数来源可在安装ingress-nginx-controller 🔗 可以指定。--set externalURL=https://harbor.lomtom.cn: 配置 Harbor 的外部 URL,即 Harbor 的公共访问地址,需与expose.ingress.hosts.core的域名保持一致。--set persistence.persistentVolumeClaim.*.storageClass=harbor-storage: 指定存储类为harbor-storage,此值需与上一步配置的 StorageClass 名称保持一致。--set *.image.repository: 指定各个服务所需镜像地址和名称,在默认镜像拉取不下来时可以指定。
更多参数说明可参考harbor-helm 配置 🔗
NodePort
# add repo
helm repo add harbor https://helm.goharbor.io
# install
helm install harbor harbor/harbor -n harbor \
--version 1.14.0 \
--set expose.type=nodePort \
--set expose.tls.enabled=false \
# config externalURL
--set externalURL=http://127.0.0.1:30002 \
# Specified storageClass
--set persistence.persistentVolumeClaim.registry.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.database.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.redis.storageClass=harbor-storage \
--set persistence.persistentVolumeClaim.trivy.storageClass=harbor-storage \
# Specified image(option)
--set nginx.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-nginx-photon \
--set portal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-portal \
--set core.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-core \
--set jobservice.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-jobservice \
--set registry.registry.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-registry-photon \
--set registry.controller.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-registryctl \
--set trivy.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-trivy-adapter-photon \
--set database.internal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-db \
--set redis.internal.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-redis-photon \
--set exporter.image.repository=swr.cn-east-3.myhuaweicloud.com/lomtom-common/goharbor-harbor-exporter
上述命令中的配置参数说明如下:
--set expose.type=nodePort: 指定 Harbor 的访问方式为 nodePort。--set externalURL=http://127.0.0.1:30002: 配置 Harbor 的外部 URL,即 Harbor 的公共访问地址,端口默认为 30002--set persistence.persistentVolumeClaim.*.storageClass=harbor-storage: 指定存储类为harbor-storage,此值需与上一步配置的 StorageClass 名称保持一致。--set *.image.repository: 指定各个服务所需镜像地址和名称,在默认镜像拉取不下来时可以指定。
验证
查看 Pod 运行状态:
➜ ~ kubectl get pod -n harbor
NAME READY STATUS RESTARTS AGE
harbor-core-65fb956f55-vxv29 1/1 Running 0 15m
harbor-database-0 1/1 Running 0 15m
harbor-jobservice-5b76f488f5-f86mr 1/1 Running 3 (14m ago) 15m
harbor-nginx-765758659-xf8sw 1/1 Running 0 15m
harbor-portal-64896f58c4-szjc7 1/1 Running 0 15m
harbor-redis-0 1/1 Running 0 15m
harbor-registry-69c69585b4-d56bj 2/2 Running 0 15m
harbor-trivy-0 1/1 Running 0 15m
以上命令输出显示了 Harbor 运行中的各个组件的状态,确保所有的 Pod 都处于 Running 状态,这表明 Harbor 已经成功部署和运行。
接下来,您可以通过访问配置的 externalURL 来登录 Harbor。在登录页面填写默认用户名:admin,密码:Harbor12345 即可完成登录。登录后,您可以开始使用 Harbor 来管理和分发 Docker 镜像,同时利用其强大的安全和身份验证等功能。
本文为原创内容,欢迎分享与引用,请保留作者与原文链接。