打造Harbor私有化容器世界

机器人
摘要
lomtom

在当今高度容器化的软件开发环境中,安全、高效地管理和分发容器镜像至关重要。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镜像,同时利用其强大的安全和身份验证等功能。

lomtom

标题:打造Harbor私有化容器世界

作者:lomtom

链接:https://lomtom.cn/document/ddhnh3ba2v3pm