使用harbor
使用docker登录harbor
方法1:永久配置信任 Harbor 证书(推荐生产环境)
- 下载harbor证书
![image]()
- 创建证书目录(必须按此路径命名)。将下载的harbor证书放到这里
mkdir -p /etc/docker/certs.d/core.harbor.domain/
- 重启docker,使用docker登录
systemctl restart docker
# 凭据会以未加密的形式存储在/root/.docker/config.json
docker login core.harbor.domain
方法2:修改 Docker 配置文件全局跳过 TLS 验证(不推荐)
- 配置docker
vim /etc/docker/daemon.json
{
"insecure-registries": ["core.harbor.domain"]
}
systemctl restart docker
- 登录harbor,按提示输入用户名和密码
docker login core.harbor.domain
使用docker推送镜像到harbor
- 准备测试镜像
# 从国内下载镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:latest
# 改标签,方便后续实验
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:latest docker.io/library/busybox:latest
- 推送镜像到harbor的library项目,
# 在项目中标记镜像
docker tag SOURCE_IMAGE[:TAG] core.harbor.domain/library/REPOSITORY[:TAG]
# 推送镜像到当前项目
docker push core.harbor.domain/library/REPOSITORY[:TAG]
在K8S中从harbor拉取镜像
基于现有凭据创建 Secret
- 前提是已经成功运行了docker login,且/root/.docker/config.json路径下有凭据
kubectl create secret generic harbor-download --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson
containerd信任harbor证书
- 拷贝harbor的证书到k8s节点主机的/usr/local/share/ca-certificates路径下,文件名必须 .crt 结尾
- 更新证书信任列表
update-ca-certificates
- 重启containerd
systemctl restart containerd
- 测试下载
ctr images pull core.harbor.domain/library/harbor-busybox:latest

创建测试pod
- pod将从harbor拉取镜像
- 需要确保k8s各个节点hosts文件有core.harbor.domain的地址解析
- 确保/etc/resolv.conf、/run/systemd/resolve/resolv.conf的nameserver配置正确。后者是kubelet的默认解析文件,在/var/lib/kubelet/config.yaml文件的resolvConf字段中
cat <<EOF> private-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: private-container
spec:
containers:
- name: private-container
image: core.harbor.domain/library/harbor-busybox@sha256:0124622a5e535aa839c9f2d58ae95be4202bbeb2bb32917f4feaef28ab9cff44
command: ["sleep","3600"]
imagePullSecrets:
- name: harbor-download
EOF
kubectl apply -f private-container.yaml
- 查看pod运行状态
![image]()
推送Helm Charts
使helm信任harbor的自签名证书
# 拷贝harbor证书到节点
cp ca.crt /usr/local/share/ca-certificates/
# 更新信任列表
update-ca-certificates
使用helm登录harbor
helm registry login core.harbor.domain
推送
# 在项目中打包 chart
helm package CHART_PATH
# 推送 chart 到当前项目
helm push CHART_PACKAGE oci://core.harbor.domain/helm_library

拉取Helm Charts
- 点击artifcats 旁的文件图标会复制下载命令
helm pull oci://core.harbor.domain/helm_library/harbor --version 1.17.2

垃圾回收
在垃圾回收期间,Harbor会释放项目中未标记blob使用的存储空间
Blob本质是镜像层(layer),一个镜像可能包含多层Blob,每层都是一个独立的文件
Blob用digest(SHA256)唯一标识,多个镜像可以共享同一个Blob(层复用)
Harbor中blob只有被至少一个artifact/digest引用才算“已标记”。当blob不再被任何镜像引用(即没有tag指向它,也没有artifact依赖它),就变成未标记blob
自定义OCI构件
自定义 OCI 构件是利用 OCI 规范存储和管理非标准镜像内容的能力。它不仅可以存储 Docker 镜像,还能存储 Helm chart、SBOM、二进制包或其他任何需要版本管理和分发的文件。Harbor 对其完全支持,可以打 tag、拉取、存储、删除,遵循 OCI digest 唯一性。
复制
使用https连接另一个harbor
- 使用helm在harbor-2命名空间中创建release,名为myharbor-2
- 登录源harbor,仓库管理--新建目标
- 启用 Ingress,配域名core.harbor-2.domain
- values.yaml文件中 externalURL: https://core.harbor-2.domain
- CoreDNS 加解析,配置为ingress-nginx-controller的IP
kubectl edit configmap coredns -n kube-system
# 添加如下内容
hosts {
10.100.193.106 core.harbor-2.domain
fallthrough
}

使用http连接另一个harbor
- 这里使用的是service的DNS记录,格式如下
- externalURL: http://myharbor-2-core.harbor-2.svc.clx.com

- 源harbor,复制管理--新建规则

- 目标harbor
- 复制规则中的名称空间test,对应目标harbor中的项目test

代理缓存
原理
- Harbor 代理缓存通过缓存远程镜像仓库(如 Docker Hub)的内容,减少外网访问,提高镜像拉取速度,适用于 CI/CD 和高频镜像拉取场景。
- 第一次 pull → 去 Docker Hub 拉 → 缓存到 Harbor
- 第二次 pull → 直接从 Harbor 取
使用方法
- 仓库管理--新建目标,创建要被代理的仓库
- 项目--新建项目--填写项目名--开启镜像代理
- 使用<harbor_servername>/<proxy_project_name>作为前缀来引用代理缓存项目。例如:docker pull core.harbor.domain/proxy-k8s/pause:3.9
分布式分发
Harbor 分布式分发通过 replication 机制,实现多个 Harbor 实例之间的镜像同步,常用于多集群或多地域场景,提高镜像分发效率并增强灾备能力
P2P预热
Harbor 分布式分发通过 replication 机制,实现多个 Harbor 实例之间的镜像同步,常用于多集群或多地域场景,提高镜像分发效率并增强灾备能力
分发组件dragonfly
节点信任harbor证书
# 将harbor证书下载主机节点
mv ca.crt /usr/local/share/ca-certificates/
# 更新证书信任列表
update-ca-certificates



浙公网安备 33010602011771号