K8s 玩家必看!3 分钟搞定 Harbor 私有仓库部署,镜像管理从此不迷路

K8s 玩家必看!3 分钟搞定 Harbor 私有仓库部署,镜像管理从此不迷路

🔥 K8s 玩家必看!3 分钟搞定 Harbor 私有仓库部署,镜像管理从此不迷路 🔥

还在为 K8s 集群里的镜像存储发愁?🤔 手动上传太麻烦?公共仓库速度慢?今天这篇干货绝对能救你!

最近好多小伙伴私信问:“在 K8s 里部署 Harbor 到底怎么露服务才靠谱?Ingress 配置总踩坑咋办?” 别慌!小编亲测了 N 种方案,终于整理出这套保姆级 Ingress 暴露 Harbor 教程—— 从环境检查到镜像推拉,每一步都带实操命令,连证书配置这种细节都替你想到了!

看看这集群环境(1 主 3 从 K8s 节点 + Rocky Linux 系统),是不是和你的配置很像?👇 跟着步骤走,保证你一次成功,评论区蹲一个 “部署成功” 的反馈哦~ 😎

环境信息

  • k8s集群信息
[root@k8s-master-01 ~]# kubectl get node -o wide
NAME            STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                      KERNEL-VERSION                 CONTAINER-RUNTIME
k8s-master-01   Ready    control-plane   16d   v1.33.1   10.228.22.20   <none>        Rocky Linux 9.6 (Blue Onyx)   5.14.0-570.21.1.el9_6.x86_64   containerd://2.1.1
k8s-worker-01   Ready    <none>          16d   v1.33.1   10.228.22.21   <none>        Rocky Linux 9.6 (Blue Onyx)   5.14.0-570.21.1.el9_6.x86_64   containerd://2.1.1
k8s-worker-02   Ready    <none>          16d   v1.33.1   10.228.22.22   <none>        Rocky Linux 9.6 (Blue Onyx)   5.14.0-570.21.1.el9_6.x86_64   containerd://2.1.1
k8s-worker-03   Ready    <none>          16d   v1.33.1   10.228.22.23   <none>        Rocky Linux 9.6 (Blue Onyx)   5.14.0-570.21.1.el9_6.x86_64   containerd://2.1.1
  • 操作系统信息
[root@k8s-master-01 ~]# uname -a
Linux k8s-master-01 5.14.0-570.21.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Jun 10 18:07:35 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
[root@k8s-master-01 ~]# helm version
version.BuildInfo{Version:"v3.18.3", GitCommit:"6838ebcf265a3842d1433956e8a622e3290cf324", GitTreeState:"clean", GoVersion:"go1.24.4"}
  • 查看 PV 相关信息
[root@k8s-master-01 ~]# kubectl get sc
NAME         PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-rbd-sc   rbd.csi.ceph.com   Delete          Immediate           true                   10d
[root@k8s-master-01 ~]# helm ls -n ingress-nginx
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
ingress-nginx   ingress-nginx   1               2025-07-03 15:13:50.123926111 +0800 CST deployed        ingress-nginx-4.12.3    1.12.3     
[root@k8s-master-01 ~]# kubectl get pod -n ingress-nginx 
NAME                             READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-hgv9x   1/1     Running   0          24h
ingress-nginx-controller-mqxl7   1/1     Running   0          24h
ingress-nginx-controller-vwpk8   1/1     Running   0          24h

采用 ingress 方式暴露部署 – 部署 harbor

添加harbor helm仓库:

helm repo add harbor https://helm.goharbor.io

官方提供四种方式暴露 Harbor service:

  1. Ingress: 借助Ingress暴露服务,K8S集群中已经部署ingress nginx controller。
  2. ClusterIP: 使用ClusterIP暴露服务,只能在集群内部进行访问。
  3. NodePort: 使用NodePort暴露服务,通过NodeIP:NodePort进行访问。
  4. LoadBalancer: 使用云供应商提供的LB进行访问。

部署harbor仓库,使用ingress暴露服务。ingress-nginx使用的是NodePort方式暴露自身,需要在externalURL中配置其 NodePort 端口号:31407

[root@k8s-master-01 ~]# kubectl get svc -n ingress-nginx 
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.105.195.129   <none>        80:32049/TCP,443:31407/TCP   24h
ingress-nginx-controller-admission   ClusterIP   10.100.124.121   <none>        443/TCP                      24h

通过下面的命令使用 helm 部署 harbor。需要根据你的实际情况对命令参数进行调整。

helm upgrade --install harbor harbor/harbor --namespace harbor --create-namespace 
  --set expose.type=ingress 
  --set expose.ingress.className=nginx 
  --set expose.ingress.hosts.core=harbor.nici.cn 
  --set expose.ingress.hosts.notary=notary.nici.cn 
  --set externalURL=https://harbor.nici.cn:31407 
  --set harborAdminPassword="Harbor12345" 
  --set persistence.persistentVolumeClaim.registry.storageClass="csi-rbd-sc" 
  --set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass="csi-rbd-sc" 
  --set persistence.persistentVolumeClaim.database.storageClass="csi-rbd-sc" 
  --set persistence.persistentVolumeClaim.redis.storageClass="csi-rbd-sc" 
  --set persistence.persistentVolumeClaim.trivy.storageClass="csi-rbd-sc"

资源检查

[root@k8s-master-01 ~]# kubectl get pod -n harbor -o wide
NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE            NOMINATED NODE   READINESS GATES
harbor-core-77f9f8cdc-nxzpn          1/1     Running   0          23h   172.16.36.226    k8s-worker-01   <none>           <none>
harbor-database-0                    1/1     Running   0          25h   172.16.7.155     k8s-worker-03   <none>           <none>
harbor-jobservice-7f74cf8d48-gbdsc   1/1     Running   0          36s   172.16.118.116   k8s-worker-02   <none>           <none>
harbor-portal-5b6b5f7494-4rgsn       1/1     Running   0          25h   172.16.118.113   k8s-worker-02   <none>           <none>
harbor-redis-0                       1/1     Running   0          25h   172.16.7.156     k8s-worker-03   <none>           <none>
harbor-registry-78c5c489ff-v64b9     2/2     Running   0          23h   172.16.118.115   k8s-worker-02   <none>           <none>
harbor-trivy-0                       1/1     Running   0          25h   172.16.36.224    k8s-worker-01   <none>           <none>
[root@k8s-master-01 ~]# kubectl get pvc -n harbor
NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
data-harbor-redis-0               Bound    pvc-df572579-013c-4e29-8ed2-d5cad140f49a   1Gi        RWO            csi-rbd-sc     <unset>                 25h
data-harbor-trivy-0               Bound    pvc-c69def7b-8fb6-439c-8ed0-c428ddb28723   5Gi        RWO            csi-rbd-sc     <unset>                 25h
database-data-harbor-database-0   Bound    pvc-18f0b12e-885e-4e25-86a4-be488fe8b998   1Gi        RWO            csi-rbd-sc     <unset>                 25h
harbor-jobservice                 Bound    pvc-4ad9015f-8627-4b59-ad3b-5a4406b36d0f   1Gi        RWO            csi-rbd-sc     <unset>                 25h
harbor-registry                   Bound    pvc-10692c77-552d-49b2-88a9-2c05776f72dd   5Gi        RWO            csi-rbd-sc     <unset>                 25h
[root@k8s-master-01 ~]# kubectl get ingress -n harbor
NAME             CLASS   HOSTS            ADDRESS          PORTS     AGE
harbor-ingress   nginx   harbor.nici.cn   10.105.195.129   80, 443   25h

客户端访问测试,在客户端配置域名解析后即可访问。用户名:admin 密码:Harbor12345
K8s 玩家必看!3 分钟搞定 Harbor 私有仓库部署,镜像管理从此不迷路

客户端上传镜像

导出 CA 证书

kubectl -n harbor get secrets harbor-ingress -o jsonpath="{.data.ca.crt}" | base64 -d >ca.crt

复制 CA 证书到服务器中

[root@k8s-master-01 ~]# mkdir -p /etc/containerd/certs.d/harbor.nici.cn
[root@k8s-master-01 ~]# cp ca.crt /etc/containerd/certs.d/harbor.nici.cn/
[root@k8s-master-01 ~]# systemctl restart containerd.service 

使用nerdctl下载镜像

[root@k8s-master-01 ~]# nerdctl pull nginx
docker.io/library/nginx:latest:                                                   resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:13920fe73b382aa9017f7cf38b1377bc46ffb605fe980eb00f61aad26311ebf7: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:9592f5595f2b12c2ede5d2ce9ec936b33fc328225a00b3901b96019e3dd83528:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ee95256df0301df55618ec5c24f6bf41b6d005d3026e0e67e95fef0b0fbc2691:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:3da95a905ed546f99c4564407923a681757d89651a388ec3f1f5e9bf5ed0b39d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:6c8e51cf00871b029c189d3e2145e2307bbba361bb62e20b696c18b2e8cd2f52:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9bbbd7ee45b78c411208ea69e41a52a06a7e3872dfd0235e79bbb637e4789c1d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:48670a58a68fc689138b916491d7c5aa6ea6fb2e4227a7edef275ec7003c9569:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ce7132063a5679c245d63b972b414a24de1686b42f8231c8df6f703c50a5ac38:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:23e05839d684c6d82bd5fd45968bb8997da3a639f1fe8ca502a4edbcffa8655d:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 21.9s    

登录 harbor 仓库

[root@k8s-master-01 ~]# nerdctl login -u admin -p Harbor12345 harbor.nici.cn
WARN[0000] WARNING! Using --password via the CLI is insecure. Use --password-stdin. 

WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/

Login Succeeded

标记镜像

[root@k8s-master-01 ~]# nerdctl tag nginx:latest harbor.nici.cn/library/nginx:latest

推送镜像

[root@k8s-master-01 ~]# nerdctl push harbor.nici.cn/library/nginx:latest
INFO[0000] pushing as a reduced-platform image (application/vnd.oci.image.index.v1+json, sha256:273027a41b6c23ff42b184991e20311b85e8f9ff51bae4dd2106f70a2538623f) 
index-sha256:273027a41b6c23ff42b184991e20311b85e8f9ff51bae4dd2106f70a2538623f:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:13920fe73b382aa9017f7cf38b1377bc46ffb605fe980eb00f61aad26311ebf7: done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ee95256df0301df55618ec5c24f6bf41b6d005d3026e0e67e95fef0b0fbc2691:    done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:9592f5595f2b12c2ede5d2ce9ec936b33fc328225a00b3901b96019e3dd83528:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:3da95a905ed546f99c4564407923a681757d89651a388ec3f1f5e9bf5ed0b39d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9bbbd7ee45b78c411208ea69e41a52a06a7e3872dfd0235e79bbb637e4789c1d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:48670a58a68fc689138b916491d7c5aa6ea6fb2e4227a7edef275ec7003c9569:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:6c8e51cf00871b029c189d3e2145e2307bbba361bb62e20b696c18b2e8cd2f52:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ce7132063a5679c245d63b972b414a24de1686b42f8231c8df6f703c50a5ac38:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:23e05839d684c6d82bd5fd45968bb8997da3a639f1fe8ca502a4edbcffa8655d:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 7.1 s 

客户端拉取镜像

[root@k8s-master-01 ~]# nerdctl pull harbor.nici.cn/library/nginx:latest
harbor.nici.cn/library/nginx:latest:                                              resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:273027a41b6c23ff42b184991e20311b85e8f9ff51bae4dd2106f70a2538623f:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:13920fe73b382aa9017f7cf38b1377bc46ffb605fe980eb00f61aad26311ebf7: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:9592f5595f2b12c2ede5d2ce9ec936b33fc328225a00b3901b96019e3dd83528:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9bbbd7ee45b78c411208ea69e41a52a06a7e3872dfd0235e79bbb637e4789c1d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:3da95a905ed546f99c4564407923a681757d89651a388ec3f1f5e9bf5ed0b39d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:6c8e51cf00871b029c189d3e2145e2307bbba361bb62e20b696c18b2e8cd2f52:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ce7132063a5679c245d63b972b414a24de1686b42f8231c8df6f703c50a5ac38:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:48670a58a68fc689138b916491d7c5aa6ea6fb2e4227a7edef275ec7003c9569:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:23e05839d684c6d82bd5fd45968bb8997da3a639f1fe8ca502a4edbcffa8655d:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ee95256df0301df55618ec5c24f6bf41b6d005d3026e0e67e95fef0b0fbc2691:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 4.8 s                                                                    total:  41.9 M (8.7 MiB/s)                                       

🎉 搞定!你的 K8s 集群终于有了专属镜像仓库 🎉

从 Helm 部署到 Ingress 配置,再到证书导入和镜像推拉测试,一套流程走下来是不是超顺畅?其实 Harbor 部署没那么难,关键是找对暴露方式和配置细节~

如果部署时遇到卡在某个步骤(比如 Ingress 端口映射、证书不生效),欢迎在评论区留言具体报错,小编会抽时间一一解答!👇

觉得有用的话,别忘了点赞 + 在看,再转发给身边正在搞 K8s 的同事 —— 毕竟,好教程要和同路人分享才更有价值呀~ 我们下期技术干货再见!😉

K8s 玩家必看!3 分钟搞定 Harbor 私有仓库部署,镜像管理从此不迷路

此文章为原创文章,作者:胖哥叨逼叨,如若转载,请与我联系并注明出处:https://www.pangshare.com/4108.htm

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2025年6月18日 下午5:04
下一篇 2小时前

相关推荐

发表回复

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