打造Harbor私有化容器世界
- January 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镜像,同时利用其强大的安全和身份验证等功能。