使用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

image

创建测试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

image

拉取Helm Charts

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

image

垃圾回收

在垃圾回收期间,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
}

image

使用http连接另一个harbor

image

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

image

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

image

代理缓存

原理

  • 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
posted @ 2026-03-27 11:21  立勋  阅读(19)  评论(0)    收藏  举报