在k8s集群中搭建一个harbor私有仓库
在使用容器化部署微服务时,自己开发的微服务需要打包成镜像并推送至镜像仓库中,以便k8s可以使用这些镜像构建容器。 可以使用云服务商提供的私有仓库,但有些情况下出于网络、安全等方面的考虑,搭建自有仓库可能更加合适。
本文记录下使用harbor搭建私有仓库的过程。
# 前提条件
- 一个可用域名,非必须,没有域名使用ip也可以。本文以
registry.tst.cn
为例说明。 - 一个正常运行的k8s集群。
- 一个可用的storageClass, 如
nfs-client
。
# 安装
使用 bitnami/harbor (opens new window) 搭建。
在 k8s master 节点上执行以下命令:
helm install harbor-release \
--set service.type=NodePort \
--set global.storageClass=nfs-client \
--set trivy.enabled=false \
--set service.nodePorts.https=31268 \
--set externalURL=https://registry.tst.cn \
--set nginx.tls.commonName=registry.tst.cn \
--set adminPassword=admin \
oci://registry-1.docker.io/bitnamicharts/harbor
安装过程中,可能会遇到共享文件夹不存在,导致pvc创建不成功,此时使用 kubectl describe
命令查看报错信息,将缺失的文件夹创建出来,并使用 chmod
将其 mode 修改为 777.
[test-user@localhost ~]$ sudo ls -la /mnt/nfs-share/
total 12
drwxr-xr-x 9 nfsnobody nfsnobody 4096 Nov 2 00:52 .
drwxr-xr-x. 3 root root 23 Oct 23 00:59 ..
drwxrwxrwx 4 root root 63 Nov 2 00:38 default-data-harbor-release-postgresql-0-pvc-3c2f8635-c3ef-4bb5-b6cd-00ecb091cc2c
drwxrwxrwx 2 root root 6 Nov 2 00:52 default-harbor-release-jobservice-pvc-cb7257cd-3f3e-4efc-9819-a043ba09c29c
drwxrwxrwx 2 root root 6 Nov 2 00:47 default-harbor-release-jobservice-scandata-pvc-58a20ee1-8c8b-4a17-854d-bfdbf99cb30c
drwxrwxrwx 2 root root 6 Nov 2 00:40 default-harbor-release-registry-pvc-01c3399a-d13d-4076-b0d7-b75204b0433f
drwxrwxrwx 3 root root 27 Nov 2 00:40 default-redis-data-harbor-release-redis-master-0-pvc-c20af3b5-60ff-49cb-918e-e4c57b1dcc0b
执行成功后,可以根据该命令的输出获取访问地址和初始用户名密码。 如果不启用https,登录会报错。
# 配置免端口访问
在 registry.tst.cn
指向的服务器上安装nginx,并配置TCP流量流量转发,即可实现免端口访问。
- 安装nginx stream模块:
sudo yum install -y nginx-mod-stream
- 在nginx.conf的http块之后添加:
stream { server { listen 443; proxy_pass localhost:31268; } }
- 重新加载nginx:
sudo systemctl restart nginx
# pull镜像
以 containerd
为例配置。
所有节点上都需要执行如下操作:
- 在
containerd
的配置文件/etc/containerd/config.toml
中添加配置,如果节点上没有这个文件,导出当前配置并创建该文件:containerd config default > /etc/containerd/config.toml
- 修改配置文件,找到
[plugins."io.containerd.grpc.v1.cri".registry.configs]
,并在其下添加如下配置:[plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.tst.cn"] [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.tst.cn".tls] insecure_skip_verify = true #ca_file = "/etc/containerd/registry.tst.cn/ca.crt" # CA 证书 #cert_file = "/etc/containerd/registry.tst.cn/registry.tst.cn.crt" # harbor 证书 #key_file = "/etc/containerd/registry.tst.cn/registry.tst.cn.key" # harbor 私钥 [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.tst.cn".auth] username = "admin" password = "admin"
- 重启:
systemctl restart containerd
- 测试创建pod
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: tese-container image: registry.tst.cn/library/hello-world:1.0.0
# push镜像
以 docker
为例配置。
由于 harbor
启用了 https
,其证书是使用 harbor-ca
签发的,该 CA 是不被信任的,因此需要先将其添加至 docker
中:
- 下载
harbor
的CA证书,进入harbor之后,依次点击:projects -> {select a project} -> Repositories -> REGISTRY CERTIFICATE
- 保存至
docker
的证书目录,格式/etc/docker/certs.d/${domain_name}/ca.cert
,如本例中为:/etc/docker/certs.d/registry.tst.cn/ca.crt
- 重启
docker
服务:sudo systemctl restart docker
随后即可正常push镜像:
- 为镜像打标签:
docker tag hello-world:1.0.0 registry.tst.cn/library/hello-world:1.0.0
- push镜像:
docker push registry.tst.cn/library/hello-world:1.0.0
上次更新: 2023/12/08, 06:34:37