部署 Harbor 作为 Docker 镜像仓库

部署 Harbor

添加仓库

helm repo add harbor https://helm.goharbor.io
helm search repo harbor/harbor
# NAME            CHART VERSION   APP VERSION     DESCRIPTION
# harbor/harbor   1.9.1           2.5.1           An open source trusted cloud native registry th...

修改可配置项

生成 values.yaml 文件

helm show values harbor/harbor --version 1.9.1 > values.yaml

修改 values.yaml 文件

expose:
  type: ingress
  tls:
    enabled: true
    certSource: secret
    secret:
      secretName: 'registry-letsencrypt-tls'
      notarySecretName: 'notary-letsencrypt-tls'
  ingress:
    hosts:
      core: registry.todoit.tech
      notary: notary.todoit.tech
    annotations:
      cert-manager.io/cluster-issuer: letsencrypt-dns01 # 配置自动生成 https 证书
      # kubernetes.io/tls-acme: "true"
      kubernetes.io/ingress.class: 'nginx'
      ingress.kubernetes.io/ssl-redirect: 'true'
      ingress.kubernetes.io/proxy-body-size: '0'
      nginx.ingress.kubernetes.io/ssl-redirect: 'true'
      nginx.ingress.kubernetes.io/proxy-body-size: '0'

externalURL: https://registry.todoit.tech

persistence:
  enabled: true
  resourcePolicy: 'keep'
  persistentVolumeClaim:
    registry:
      storageClass: 'nfs-client'
    chartmuseum:
      storageClass: 'nfs-client'
    jobservice:
      storageClass: 'nfs-client'
    database:
      storageClass: 'nfs-client'
    redis:
      storageClass: 'nfs-client'

因为作者的 k8s 集群是部署在一台 ARM64 机器上,而 Harbor 官方并没有提供 arm64 的镜像,因此作者需要寻找替代品。

将 values.yaml 文件中的 repository: goharbor 全部替换成 repository: cdkey51,image tag 替换成 v2.2.3

修改 values.yaml 文件,关闭如下几个服务

chartmuseum:
  enabled: false
trivy:
  enabled: false
notary:
  enabled: false

如果你想知道最终生成的模版,可以使用 helm template 命令。

helm template -f values.yaml --namespace harbor --version 1.9.1  harbor/harbor > harbor.yaml

安装

创建名字空间

kubectl create ns harbor

以下命令可以安装 Harbor

helm install -f values.yaml harbor harbor/harbor --version 1.9.1 -n harbor

以下命令可以更新 Harbor

helm upgrade -f values.yaml harbor harbor/harbor --version 1.9.1 -n harbor

如果有需要,以下命令可以卸载 Harbor

helm uninstall harbor -n harbor

登录

首先完成域名映射

192.168.32.64 registry.todoit.tech

如果没有在 values.yaml 文件更改默认配置的话,用户名是 admin,密码是 Harbor12345

README-2022-07-02-17-47-19

测试

从 Docker Hub 拉取一个用于测试的镜像

docker pull listenzz/gohttpserver:latest

将下载的镜像使用 tag 命令变更地址

docker tag listenzz/gohttpserver:latest registry.todoit.tech/library/gohttpserver:latest

通过 Docker 登录 Harbor

docker login -u admin -p Harbor12345 registry.todoit.tech

README-2022-07-02-17-55-35

测试 push

推送镜像到 Harbor

docker push registry.todoit.tech/library/gohttpserver:latest

可以看到 gohttpserver 已经被推送到了 Harbor

README-2022-07-02-17-59-59

测试 pull

移除本地镜像,准备测试拉取镜像环境

docker image rm listenzz/gohttpserver
docker image rm registry.todoit.tech/library/gohttpserver

执行如下命令,查看镜像

docker images
# REPOSITORY                TAG              IMAGE ID       CREATED         SIZE

可以看到,本地已经没有 gohttpserver 镜像,执行 docker pull 命令,从 Harbor 拉取镜像。

docker pull registry.todoit.tech/library/gohttpserver:latest

如图所示,则表示拉取成功。

README-2022-07-02-18-05-04

结合 GitLab CI/CD

创建机器人账户

前往 Harbor > 系统管理 > 机器人账户,添加一个机器人账户

README-2022-07-02-18-34-03

点击添加,仅有一次机会复制 token,这就是新建机器人账户的密码,把它保存好。

RViJBlr3zkt07GW8Q8xQEvUQjfMo7xV4

修改 GitLab CI/CD 环境变量

前往 GitLab > 项目 > Settings > CI/CD,修改我们曾在 实践 GitLab CI/CD 设置过的环境变量。

有几个点需要注意:

  • 我们使用 Docker Hub 作为镜像仓库时,CI_REGISTRY_IMAGE 可以使用短路径,如 listenzz/gohttpserver,但使用其它镜像仓库时,CI_REGISTRY_IMAGE 需要是完整路径,如 registry.todoit.tech/library/gohttpserver。

  • 我们的机器人完整名称是 robot$gitlab, 但 $ 需要转义,因此 CI_REGISTRY_USER 填的是 robot$$gitlab

    填坑:新版的 gitlab 不再需要转义,直接填写 robot$gitlab 即可。

  • CI_REGISTRY_PASSWORD 就是我们在创建 Harbor 机器人时,仅有一次机会保存的 token。

  • CI_REGISTRY 是我们的 Harbor 地址,在本例中是 registry.todoit.tech。

README-2022-07-02-19-43-44

配置从私有仓库 Harbor 拉取镜像

创建 Secret,命名为 harbor-auth:

kubectl create secret docker-registry harbor-auth \
  --docker-server='registry.todoit.tech' \
  --docker-username='robot$gitlab' \
  --docker-password=RViJBlr3zkt07GW8Q8xQEvUQjfMo7xV4

打开 gohttpserveropen in new window 项目,编辑 deploy.yaml 文件,修改 image 地址,以及添加 imagePullSecrets。

imagePullSecrets:
  - name: harbor-auth
containers:
  - name: gohttpserver
    image: registry.todoit.tech/library/gohttpserver:latest

可以先在本地测试,看看镜像是否能被拉取成功。

kubectl delete -f deploy/depoy.yaml
kubectl apply -f deploy/depoy.yaml

确定没问题后,提交代码,打上 tag,推送到 GitLab,触发 CI/CD 流水线。


参考:

上次更新: