ozeol公司为什么只要库存,harbor镜像仓库

Harbor 最核心的功能就是给 docker registry 添加上一层权限保护的功能,要实现这个功能,就需要我们在使用 docker login、pull

Harbor的核心功能是为docker注册表添加上层权限保护。为了实现这个功能,我们需要在使用docker登录、pull、push等命令时进行拦截,并先进行一些权限相关的验证。还

c05d384763f747959c06234fb8aca2d2~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=9MWePAAqU7ADvUsklU%2BS2T0OmaM%3D

Harbor 是一个由CNCF 基金会托管的开源、可信的云原生Docker 注册表项目,可通过添加安全性、身份权限等常用功能来存储、签名和扫描图像内容。此外,它还支持在注册表之间复制映像,并提供更高级的安全功能,例如用户管理、访问控制和活动审核。新版本还增加了对Helm 仓库托管的支持。 Harbor的核心功能是为docker注册表添加上层权限保护。为了实现这个功能,我们需要在使用docker登录、pull、push等命令时进行拦截,并先进行一些权限相关的验证。事实上,DockerRegistry v2 已经提供了对这组操作的支持,集成了安全认证功能,将安全认证暴露给外部服务,并允许外部服务来实现。

Harbor 认证原理

上面我们提到了dockerregistry v2 向外部服务暴露了安全认证,但是它是如何暴露的呢?作为例子来说明认证过程,我们可以使用docker login https://registry 在命令行中输入qikqiak.com。

Docker客户端获取用户输入的docker登录命令,并将其转换为调用引擎API的RegistryLogin方法。 RegistryLogin 方法通过http 调用注册表服务的auth 方法。现在,对于服务,将调用loginV2 方法,并且/v2/接口对请求进行身份验证。此时的请求不包含token信息。除了返回401 错误之外,请求身份验证的位置也会在标头中返回。服务器地址注册客户端收到上述响应结果后,联系返回的认证服务器,发起认证请求。发送到认证服务器的请求标头包含加密的用户名和密码,此时认证服务器必须将加密的用户名和密码与实际的认证系统结合起来。当从数据库查询用户凭据或连接到LDAP 服务进行身份验证时,成功的身份验证会返回令牌信息,客户端会保留返回的令牌并将请求发送到注册表。现在我们需要检索我们获得的令牌。请求验证成功,返回状态码200。 Docker客户端收到返回的200状态码,表示操作成功,并在控制台显示“登录成功”。此时,整个登录流程如下流程图所示:49b80f95949543e7bbbf39a6fa7384a1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=8bXucmIBWgE7VnbA8d67IDRjK2M%3D

要完成上述登录验证过程,需要记住两件重要的事情: 如何让注册中心服务知道我的服务认证地址?注册中心如何识别我们提供的认证服务生成的令牌?

关于第一个问题,Registry服务本身提供了一个配置文件,允许您指定配置信息,例如:

.auth: token: Realm: token-realm service: token-service Issuer:registry-token-issuer rootcertbundle: 您可以使用/root/certs/bundle.1.2.3.4.5.6.7.8 指定领域。 Harbor 的配置如下:

有关配置registry的信息,请参考官方文档:https://docs.docker.com/registry/configuration/第二个问题是registry如何识别返回的token文件?如果token是按照registry的要求生成的,registry能识别吗?那么认证服务器不应该随机生成token,而应该根据registry的要求生成token。那么我们如何生成它呢?在Docker注册表源代码中,可以看到令牌是通过JWT(JSON Web Token)实现的,可以按需生成JWT令牌。熟悉golang的同学可以克隆并查看Harbor的代码。 Harbor使用的是Web开发框架beego,源码读起来并不是特别困难。你可以很容易地看到Harbor是如何实现上面描述的认证服务部分的。

4f52745524cf44e6a10044f72c07f82e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=19fz4Tc0ERDliMMJjojS%2B1pvPxM%3D

2. 安装

Harbor包含许多组件,您可以使用Helm安装Harbor的高可用版本。这也和生产环境的部署方式是一致的。安装高可用性版本之前必须满足以下先决条件:

Kubernetes 集群版本1.10 或更高版本

Helm 2.8.0 或更高版本高可用Ingress 控制器高可用PostgreSQL 9.6 或更高版本(Harbor 不部署数据库HA) 高可用Redis 服务(Harbor 不处理) PVCHarbor 的大部分可在节点或外部对象存储之间共享的组件都是无状态的,因此您只需添加pod 的副本即可确保您的组件分布在尽可能多的节点上。存储层必须提供高可用的PostgreSQL和Redis集群来存储应用数据和存储PVC或对象。镜子和舵图存储。

f32b30f8bb2f4894a06241ffdd1ef4a0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=2NNeFfKqoiRjd64Zf5DWUlkecJA%3D

2.1 首先添加 Chart 仓库地址:

# 添加图表存储库$ helm repo add Harbor https://helm.goharbor.io # 更新$ helm repo update # 在安装Harbor 之前先拉取版本1.9.2 $ helm pull Harbor/harbor –untar – Unzip -version 1.9.2 There有很多可配置的参数,您可以在安装过程中使用–set 指定它们,或者使用values.yaml 直接编辑Values 文件。

Ingress是通过expose.ingress.hosts.core和Expose.ingress.hosts.notary外部URL配置的。为此,请通过将database.type配置为外部来配置externalURL外部PostgreSQL,并添加database.external的信息。您必须手动创建三个空数据:Harbor Core、Notary Server 和Notary Signer。 Harbor通过将redis.type设置为external并填写redis.external部分,在启动时自动创建外部Redis表结构。 Harbor在2.1.0版本中为Redis引入了Sentinel模式。这可以通过配置sentinel_master_set来启用。主机地址可设置为host_sentinel1:port_sentinel1、host_sentinel2:port_sentinel3。也可以参考文档https://community.pivotal.io/s/article/How-to-setup-HAProxy-and-Redis-Sentinel-for-automatic-failover- Between-Redis-Master-and-Slave-servers进行配置它可以。一个位于Redis HAProxy 前面并公开单个入口点。存储需要一个默认的StorageClass,它会在K8S集群内自动生成PV来存储图像、图表和任务日志。如果指定StorageClass,则可以通过persistence.persistent VolumeClaim.registry.storageClass、persistence.persistentVolumeClaim.chartmuseum.storageClass 和persistence.persistentVolumeClaim.jobservice.storageClass 进行配置。另外,accessMode必须设置为ReadWriteMany以保证PV。可以跨越不同的共享存储。此外,您可以指定现有的PVC 来存储数据。这可以通过现有的声明进行配置。如果您没有可在节点之间共享的PVC,则可以使用外部存储将图像和图形(支持的外部存储:azure、gcs、s3 swift、oss)和任务日志存储到数据库。通过将persistence.imageChartStorage.type 设置为所需的值并填写相应部分,将jobservice.jobLogger 设置为数据库副本:portal.replicas、core.replicas、jobservice.replicas、registry.replicas、chartmuseum 设置副本。例如,这里我们配置主域名为Harbor.k8s.local,并通过nfs-client的StorageClass提供存储。我之前安装过GitLab。由于postgresql 和reids 数据库现在是分开安装的,因此您还可以配置Harbor 以使用这两个外部数据库。这样可以减少资源占用(这两个数据库可以认为是HA模式)。但是,如果要使用外部数据库,则必须先手动创建数据库。例如,这里我们使用GitLab提供的数据库。接下来,进入pod 并创建三个数据库:harbor、notary_server 和notary_signer。

$ kubectl get pods -n kube-ops -l name=postgresqlNAME 就绪状态重新启动年龄postgresql-75b8447fb5-th6bw 1/1 运行1 2d$ kubectl exec -it postgresql-75b8447fb5-th6bw /bin/bash -n kube-opskubectl exec [ POD ] [COMMAND] 已弃用,并将在未来版本中删除。请改用kubectl exec [POD] — [COMMAND]。 root@postgresql-75b8447fb5-th6bw:/var/lib/postgresql# sudo su – postgrespostgres@postgresql-75b8447fb5 -th6bw:~$ psqlpsql (12.3 (Ubuntu 12.3-1.pgdg18.04+1)) 输入Masu。 postgres=# 创建数据库harbor所有者postgres;CREATE DATABASEpostgres=# 授予postgres对数据库harbor的所有权限;GRANTpostgres=# GRANT ALL PRIVILEGES ON DATABASE port to gitlab;GRANT# Todo: 另外两个同样的方式创建数据库:notary_server , notary_signer.postgres-# \q # 准备好数据库后,您可以使用自己的自定义值。要安装的文件(完整的自定义值文件)是:

# value-prod.yamlexternalURL: https://harbor.k8s.localharborAdminPassword: Harbor12345logLevel: debugexpose: type: ingress tls: Enabled: true ingress: className: nginx # 指定输入类hosts: 36 0 Harbor.k8s.local notary: notary.k8s.localpersistence: Enabled: true resourcePolicy: ‘keep’persistentVolumeClaim:registry: # 如果您需要高可用性,具有多个副本的组件应使用支持ReadWriteMany 的后端。 # 这里我们使用nfs,但生产环境不建议使用nfs storageClass: ‘nfs-client’ # 为了高可用,多副本的组件使用ReadWriteMany,默认ReadWriteOnce accessMode: ReadWriteMany size: 5Gi Chartmuseum: storageClass: ‘nfs-client’ accessMode: ReadWriteMany size: 5Gi jobservice: storageClass: ‘nfs-client’ accessMode: ReadWriteMany size: 1Gi trivy333 60 storageClass: ‘nfs-client’ accessMode: ReadWriteMany size: 2Gidatabase: type: external external: 60’postgresql.kube-ops.svc.cluster.local’port:’5432’username:’gitlab’ password: ‘passw0rd’ coreDatabase: ‘harbor’ notaryServerDatabase: ‘notary_server’ notarySignerDatabase: ‘notary_signer’redis: type33 360 external external: addr: dis.kube-ops.svc .cluster.local:6379’# 对于默认副本,如果需要高可用,只需设置replica=2 Portal: 副本: 1core: 副本: 1jobservice: 副本: 1registry: 副本: 1chartmuseum: 副本: trivy: 副本: 1not ary: 服务器: 副本: 1 签名者: 副本: 1 这些配置信息是: Harbor 值的默认Chart 包会覆盖这些值,因此您现在可以直接安装它们。

$ cd Harbor$ helm Upgrade –install Harbor -f value-prod.yaml -n kube-opsRelease ‘harbor’ 不存在。我现在正在安装它。 NAME: HarborLAST DEPLOYED: Thu Jul 7 17:31:43 2022NAMESPACE: kube-opsSTATUS:deployedREVISION3336 0 1 测试套件: 无注意: 请等待几分钟,让Harbor 部署完成。然后,您将能够访问Harbor 门户(https://harbor.k8s.local)。有关更多信息,请参阅https://github.com/goharbor/harbor。安装通常会在一段时间后成功。

$ Helm LS-N Kube-OPSNAME 命名空间修订更新状态图表应用程序版本Harbor Kube-OPS 1 2022-07-07 1733333:43547 +0800 CST 部署的HARB 或-1.9.2 2.5.2 $ kubectl get pods -n kube -ops -l app=HarborNAME 就绪状态重新启动AGEharbor-chartmuseum-544ddbcb64-nvk7w 1/1 运行0 30mharbor-core-7fd9964685-lqqw2 1/1 运行0 30mharbor-jobservice-6dbd89c59-vvzx5 1/1 运行0 30mhar bor-notary -server-76 b8859bf- 82f5q 1 /1 运行0 30mharbor-notary-signer-869d9bf585-kbwwg 1/1 运行0 30mharbor-portal-74db6bb688-2w79p 1/1 运行0 35mharbor-registry-695db89bfd- v9wwt 2/2 运行0 3 0mharbor-三重- 0 1 /1 运行0 35m安装后,会将Harbor.k8s.local域名解析到Ingress控制器的流量入口,可以在浏览器中通过该域名访问。

$ kubectl get ingress -n kube-opsNAME

CLASS HOSTS ADDRESS PORTS AGEharbor-ingress nginx harbor.k8s.local 80, 443 12sharbor-ingress-notary nginx notary.k8s.local 80, 443 12s用户名使用默认的 admin,密码则是上面配置的默认 Harbor12345,需要注意的是要使用 https 进行访问(默认也会跳转到 https),否则登录可能提示用户名或密码错误:
b96bd2d39ad345efa4b36f7f8acb4b8c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=RxmWfdhKht8ssQ%2FCKKuFHDqsgCI%3D
登录过后即可进入 Harbor 的 Dashboard 页面:
bd1f6f89034f4a4ba905cfe71e582d9d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=jIbOm3pc3nYZkQTFaoO7K2E7uNM%3D
可以看到有很多功能,默认情况下会有一个名叫 library 的项目,该项目默认是公开访问权限的,进入项目可以看到里面还有 Helm Chart 包的管理,可以手动在这里上传,也可以对该项目里面的镜像进行一些其他配置。

3. 推送镜像

首先将私有镜像仓库配置到 containerd 中去,修改 containerd 的配置文件 /etc/containerd/config.toml:
[plugins.”io.containerd.grpc.v1.cri”.registry] [plugins.”io.containerd.grpc.v1.cri”.registry.mirrors] [plugins.”io.containerd.grpc.v1.cri”.registry.mirrors.”docker.io”] endpoint = [“https://bqr1dr1n.mirror.aliyuncs.com”] [plugins.”io.containerd.grpc.v1.cri”.registry.configs] [plugins.”io.containerd.grpc.v1.cri”.registry.configs.”harbor.k8s.local”.tls] insecure_skip_verify = true [plugins.”io.containerd.grpc.v1.cri”.registry.configs.”harbor.k8s.local”.auth] username = “admin” password = “Harbor12345″在 plugins.”io.containerd.grpc.v1.cri”.registry.configs 下面添加对应 harbor.k8s.local 的配置信息,insecure_skip_verify = true 表示跳过安全校验,然后通过 plugins.”io.containerd.grpc.v1.cri”.registry.configs.”harbor.k8s.local”.auth 配置 Harbor 镜像仓库的用户名和密码。
配置完成后重启 containerd:
$ systemctlrestart containerd1.使用 nerdctl 来进行登录:
$ nerdctl login -u admin harbor.k8s.localEnter Password:ERRO[0004] failed to call tryLoginWithRegHost error=”failed to call rh.Client.Do: Get \”https://harbor.k8s.local/v2/\”: x509: certificate signed by unknown authority” i=0FATA[0004] failed to call rh.Client.Do: Get “https://harbor.k8s.local/v2/”: x509: certificate signed by unknown authority[root@master1 ~]#可以看到还是会报证书相关的错误,只需要添加一个 –insecure-registry 参数即可解决该问题:
$ nerdctl login -u admin –insecure-registry harbor.k8s.localEnter Password:WARN[0004] skipping verifying HTTPS certs for “harbor.k8s.local”WARNING: Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded拉取镜像:
$ nerdctl pull busybox:1.35.0docker.io/library/busybox:1.35.0: resolved |++++++++++++++++++++++++++++++++++++++|index-sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68: done |++++++++++++++++++++++++++++++++++++++|manifest-sha256:8cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd: done |++++++++++++++++++++++++++++++++++++++|config-sha256:d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c: done |++++++++++++++++++++++++++++++++++++++|layer-sha256:fc0cda0e09ab32c72c61d272bb409da4e2f73165c7bf584226880c9b85438e63: done |++++++++++++++++++++++++++++++++++++++|elapsed: 83.7s将镜像重新 tag 成 Harbor 上的镜像地址:
$ nerdctl tag busybox:1.35.0 harbor.k8s.local/library/busybox:1.35.0再执行 push 命令即可将镜像推送到 Harbor 上:
$ nerdctl push –insecure-registry harbor.k8s.local/library/busybox:1.35.0INFO[0000] pushing as a reduced-platform image (application/vnd.docker.distribution.manifest.list.v2+json, sha256:29fe0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726)WARN[0000] skipping verifying HTTPS certs for “harbor.k8s.local”index-sha256:29fe0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726: done |++++++++++++++++++++++++++++++++++++++|manifest-sha256:8cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd: done |++++++++++++++++++++++++++++++++++++++|config-sha256:d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c: done |++++++++++++++++++++++++++++++++++++++|elapsed: 6.9 s total: 2.2 Ki (333.0 B/s)推送完成后,我们就可以在 Portal 页面上看到这个镜像的信息了:
8cf8c6c9a68740229e7e136da228df6d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717761848&x-signature=%2FkwF6%2F8zeILmlQn06oNjsvzwbCU%3D
测试 pull:
$ nerdctl rmi harbor.k8s.local/library/busybox:1.35.0Untagged: harbor.k8s.local/library/busybox:1.35.0@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68Deleted: sha256:cf4ac4fc01444f1324571ceb0d4f175604a8341119d9bb42bc4b2cb431a7f3a5$ nerdctl rmi busybox:1.35.0Untagged: docker.io/library/busybox:1.35.0@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68Deleted: sha256:cf4ac4fc01444f1324571ceb0d4f175604a8341119d9bb42bc4b2cb431a7f3a5$ nerdctl pull –insecure-registry harbor.k8s.local/library/busybox:1.35.0WARN[0000] skipping verifying HTTPS certs for “harbor.k8s.local”harbor.k8s.local/library/busybox:1.35.0: resolved |++++++++++++++++++++++++++++++++++++++|index-sha256:29fe0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726: done |++++++++++++++++++++++++++++++++++++++|manifest-sha256:8cde9b8065696b65d7b7ffaefbab0262d47a5a9852bfd849799559d296d2e0cd: done |++++++++++++++++++++++++++++++++++++++|config-sha256:d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c: done |++++++++++++++++++++++++++++++++++++++|layer-sha256:fc0cda0e09ab32c72c61d272bb409da4e2f73165c7bf584226880c9b85438e63: done |++++++++++++++++++++++++++++++++++++++|elapsed: 0.7 s total: 2.2 Ki (3.2 KiB/s)$ nerdctl imagesREPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZEharbor.k8s.local/library/busybox 1.35.0 29fe0126b13c 17 seconds ago linux/amd64 1.2 MiB 757.7 KiB通过 nerdctl 或者 ctr 命令访问 Harbor 镜像仓库的时候即使跳过证书校验或者配置上 CA 证书也是会出现证书错误的,这个时候我们需要去跳过证书校验或者指定证书路径。
# 解决办法1.指定 -k 参数跳过证书校验。$ ctr images pull –user admin:Harbor12345 -k harbor.k8s.local/library/busybox:1.35.0# 解决办法2.指定CA证书、Harbor 相关证书文件路径。$ ctr images pull –user admin:Harbor12345 –tlscacert ca.crt harbor.k8s.local/library/busybox:1.35.0但是如果直接使用 ctrctl 则是有效的:
$ crictl pull harbor.k8s.local/library/busybox@sha256:29fe0126b13c3ea2641ca42c450fa69583d212dbd9b7b623814977b5b0945726Image is up to date for sha256:d8c0f97fc6a6ac400e43342e67d06222b27cecdb076cbf8a87f3a2a25effe81c在 Kubernetes 中去使用时,需要将 Harbor 的认证信息以 Secret 的形式添加到集群中去:
$ kubectl create secret \docker-registry harbor-auth \–docker-server=https://harbor.k8s.local \–docker-username=admin \–docker-password=Harbor12345 \–docker-email=info@ydzs.io -n default使用私有镜像仓库来创建 Pod:
# test-harbor.yamlapiVersion: v1kind: Podmetadata: name: harbor-registry-testspec: containers: – name: test image: harbor.k8s.local/library/busybox:1.35.0 args: -sleep-“3600” imagePullSecrets: – name: harbor-auth1.2.3.4.5.6.7.8.9.10.11.12.13.14.查看 Pod 是否能正常获取镜像:
$ kubectl describe pod harbor-registry-testName: harbor-registry-testNamespace: defaultPriority: 0Node: node1/192.168.0.107Start Time: Thu, 07 Jul 2022 18:52:39 +0800# ……Events: Type Reason Age From Message —- —— —- —- ——- Normal Scheduled 10s default-scheduler Successfully assigned default/harbor-registry-test to node1 Normal Pulling 10s kubelet Pulling image “harbor.k8s.local/library/busybox:1.35.0” Normal Pulled 5s kubelet Successfully pulled image “harbor.k8s.local/library/busybox:1.35.0” in 4.670528883s Normal Created 5s kubelet Created container test Normal Started 5s kubelet Started container test到这里证明上面我们的私有镜像仓库搭建成功了,大家可以尝试去创建一个私有的项目,然后创建一个新的用户,使用这个用户来进行 pull/push 镜像,Harbor 还具有其他的一些功能,比如镜像复制,Helm Chart 包托管等等,大家可以自行测试,感受下 Harbor 和官方自带的 registry 仓库的差别。

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/83163.html

Like (0)
小条的头像小条
Previous 2024年5月31日 下午8:03
Next 2024年5月31日 下午8:04

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注