部署 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
测试
从 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
测试 push
推送镜像到 Harbor
docker push registry.todoit.tech/library/gohttpserver:latest
可以看到 gohttpserver 已经被推送到了 Harbor
测试 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
如图所示,则表示拉取成功。
结合 GitLab CI/CD
创建机器人账户
前往 Harbor > 系统管理 > 机器人账户,添加一个机器人账户
点击添加,仅有一次机会复制 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。
配置从私有仓库 Harbor 拉取镜像
创建 Secret,命名为 harbor-auth:
kubectl create secret docker-registry harbor-auth \
--docker-server='registry.todoit.tech' \
--docker-username='robot$gitlab' \
--docker-password=RViJBlr3zkt07GW8Q8xQEvUQjfMo7xV4
打开 gohttpserver 项目,编辑 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 流水线。
参考: