作为 10 年经验的运维专家,我全程用 “人话” 拆解 Harbor 的漏洞扫描、签名验证、冷热镜像管理 ——放弃 Helm,纯 Docker Compose 部署,适配 K8S 1.33,每个环节都给 “能直接复制的操作步骤 + 生产级案例”,不绕理论,只讲落地。

先明确基础前提

  1. 版本选择:Harbor v2.11.0(对 K8S 1.33 兼容性最好,Docker 部署最稳定,内置 Trivy 扫描、Cosign 签名支持);
  2. 环境要求:Linux 服务器(CentOS 7/8 或 Ubuntu 20.04+),Docker 20.10+,Docker Compose v2+,4 核 8G 以上(生产建议 8 核 16G);
  3. 核心名词白话版
    • 漏洞扫描:给镜像 “做体检”,查 CVE 高危漏洞(比如 Log4j),不合格不让 K8S 用;
    • 签名验证:给镜像 “盖防伪章”,确保没被篡改,只有盖章的镜像能进 K8S;
    • 冷热镜像:常用镜像(热)存在本地,不常用的(冷)挪到便宜的对象存储(比如 MinIO),省硬盘钱。

一、第一步:Docker 部署 Harbor(带全功能)

1. 环境准备

# 1. 安装Docker和Docker Compose(已装的跳过)
# 安装Docker
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
# 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 2. 下载Harbor安装包(v2.11.0)
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar -zxvf harbor-offline-installer-v2.11.0.tgz
cd harbor

# 3. 生成证书(Harbor必须用HTTPS,否则K8S签名验证会报错)
mkdir -p /data/cert
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /data/cert/harbor.key -x509 -days 3650 -out /data/cert/harbor.crt
# 交互时填信息,核心填:Common Name=Harbor服务器IP/域名(比如192.168.1.100)

2. 配置 Harbor(关键:开启扫描、签名、存储适配)

复制并修改配置文件:

cp harbor.yml.tmpl harbor.yml
vim harbor.yml

修改后的核心配置(删掉注释,只留关键项,人话标注):

hostname: 192.168.1.100  # 你的Harbor服务器IP/域名
http:
  port: 80
https:
  port: 443
  certificate: /data/cert/harbor.crt  # 刚才生成的证书
  private_key: /data/cert/harbor.key
harbor_admin_password: Admin123!  # 管理员密码,生产改复杂点
database:
  password: root123
  max_idle_conns: 100
  max_open_conns: 900
data_volume: /data  # Harbor本地存储目录(热镜像存在这)
trivy:  # 漏洞扫描引擎(必开)
  enabled: true
  ignore_unfixed: false  # 不忽略未修复的漏洞
  severity: "CRITICAL,HIGH"  # 只扫高危/严重漏洞
  skip_update: false  # 自动更漏洞库
registry:
  storage:  # 后续冷热镜像要用的对象存储配置(先留空,后面配MinIO再补)
    filesystem:
      rootdirectory: /storage
  delete:
    enabled: true  # 允许删除镜像(冷热管理需要)
#lifecycle_policy:  # 生命周期管理(冷热镜像),部署后在UI配更简单

3. 启动 Harbor

# 预配置
./prepare
# 启动(Docker Compose方式)
docker-compose up -d

# 验证启动(所有容器都是Up状态)
docker-compose ps
# 输出示例:
# NAME                COMMAND                  SERVICE             STATUS              PORTS
# harbor-core         "/harbor/entrypoint.…"   core                running (healthy)
# harbor-db           "/docker-entrypoint.…"   postgresql          running (healthy)
# harbor-jobservice   "/harbor/entrypoint.…"   jobservice          running (healthy)
# harbor-portal       "nginx -g 'daemon of…"   portal              running (healthy)
# harbor-registry     "/home/harbor/entryp…"   registry            running (healthy)
# harbor-trivy        "/home/scanner/entry…"   trivy               running (healthy)
# nginx               "nginx -g 'daemon of…"   proxy               running (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
# redis               "redis-server /etc/r…"   redis               running (healthy)

登录验证:浏览器访问 https://192.168.1.100,账号 admin,密码 Admin123!,能进 UI 就说明部署成功。

二、漏洞扫描(Trivy 引擎)—— 给镜像做 “体检”

1. 技术逻辑(人话版)

  1. 镜像推到 Harbor → 触发 Trivy 扫描任务;
  2. Trivy 把镜像一层层拆开,查里面的软件包(比如 deb/apk)、依赖(比如 Python 包)有没有 CVE 漏洞;
  3. 对比每天自动更的漏洞库,标记漏洞等级(Critical/High/Medium/Low);
  4. 你可以设 “规矩”:有高危漏洞的镜像,不让 K8S 拉取;
  5. K8S 那边通过 “准入控制器” 校验 ——Harbor 告诉 K8S 这个镜像不合格,K8S 就拒绝创建 Pod。

2. 详细操作步骤

步骤 1:配置 Harbor 自动扫描规则
  1. 登录 Harbor UI → 新建项目(比如 prod,生产环境)→ 进入项目→ 点击 “配置”→ “漏洞扫描”;
  2. 勾选:
    • 推送时自动扫描(镜像一推就体检);
    • 拒绝拉取有 Critical/High 漏洞的镜像(不合格直接拦);
  3. 保存配置。
步骤 2:测试漏洞扫描(手动 + 自动)
# 1. 登录Harbor(Docker客户端)
docker login https://192.168.1.100 -u admin -p Admin123!
# 注意:如果报证书错误,把Harbor的证书拷贝到/etc/docker/certs.d/192.168.1.100/
mkdir -p /etc/docker/certs.d/192.168.1.100/
cp /data/cert/harbor.crt /etc/docker/certs.d/192.168.1.100/ca.crt
systemctl restart docker

# 2. 推送一个有高危漏洞的镜像(比如nginx:1.19)
docker tag nginx:1.19 192.168.1.100/prod/nginx:1.19
docker push 192.168.1.100/prod/nginx:1.19

# 3. 看扫描结果:
# 方式1:Harbor UI → prod项目 → nginx:1.19 → 能看到扫描报告(比如有2个Critical漏洞);
# 方式2:命令行看Trivy日志
docker logs harbor-trivy
步骤 3:K8S 1.33 侧校验(拒绝不合格镜像)

Harbor 通过 “准入控制器(Admission Webhook)” 让 K8S 认 Harbor 的扫描结果,步骤:

  1. 在 Harbor 生成 Webhook 配置
    • 登录 Harbor UI → 系统管理 → 集成 → 添加集成 → 选择 “Kubernetes Admission Controller”;
    • 填写 K8S 信息:
      • K8S API Server 地址:比如https://192.168.1.200:6443(K8S master 节点地址);
      • 认证方式:选择 “Service Account”,粘贴 K8S 的 sa token(从 kube-system 命名空间找);
      • CA 证书:粘贴 K8S 的 ca.crt(/etc/kubernetes/pki/ca.crt);
    • 勾选 “校验漏洞扫描结果” → 保存。
  2. 在 K8S 创建镜像拉取 Secret
kubectl create secret docker-registry harbor-auth \
  --docker-server=192.168.1.100 \
  --docker-username=admin \
  --docker-password=Admin123! \
  --namespace=default
  1. 测试 K8S 拒绝不合格镜像:创建 pod.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: bad-nginx
spec:
  containers:
  - name: nginx
    image: 192.168.1.100/prod/nginx:1.19  # 有高危漏洞的镜像
  imagePullSecrets:
  - name: harbor-auth

执行部署:

kubectl apply -f pod.yaml
# 会返回错误:Error from server: admission webhook "validator.harbor.io" denied the request: 镜像存在Critical漏洞,拒绝拉取

3. 漏洞扫描案例(生产场景)

场景:电商平台生产环境镜像准入
  • 需求:所有推到 prod 项目的镜像,必须无 Critical/High 漏洞,否则禁止部署;
  • 操作流程
    1. 开发推送 nginx:1.19 到 prod → Harbor 自动扫描,发现 2 个 Critical 漏洞(CVE-2024-1234、CVE-2024-5678);
    2. 运维在 Harbor UI 查看扫描报告,通知开发升级 nginx 到 1.26;
    3. 开发推送修复后的 nginx:1.26 → Harbor 扫描通过(无高危漏洞);
    4. 运维在 K8S 部署 nginx:1.26 → Pod 正常创建;
    5. 效果:杜绝有高危漏洞的镜像进生产,避免被黑客利用漏洞攻击。

三、签名验证(Cosign)—— 给镜像 “盖防伪章”

1. 技术逻辑(人话版)

  1. 你用 Cosign 生成 “密钥对”(私钥自己存,公钥上传到 Harbor);
  2. 给镜像签名(用私钥加密镜像信息),签名和镜像绑在一起存在 Harbor;
  3. Harbor 设 “规矩”:只有带合法签名的镜像才能被拉取;
  4. K8S 通过准入控制器校验签名 —— 没签名 / 签名假的,直接拒绝部署。

注:K8S 1.33 对 Cosign v2 + 支持最好,放弃旧的 Notary,只讲 Cosign。

2. 详细操作步骤

步骤 1:安装 Cosign
# 下载Cosign(Linux版)
wget https://github.com/sigstore/cosign/releases/download/v2.2.0/cosign-linux-amd64
chmod +x cosign-linux-amd64
mv cosign-linux-amd64 /usr/local/bin/cosign

# 验证
cosign version  # 输出v2.2.0就对了
步骤 2:生成签名密钥对
# 生成密钥(密码设为Sig123!,生产要存在Vault里)
cosign generate-key-pair --key-password-file <(echo "Sig123!")
# 生成两个文件:cosign.key(私钥,绝对保密)、cosign.pub(公钥,要上传到Harbor)
步骤 3:Harbor 配置签名验证规则
  1. 登录 Harbor UI → 进入 prod 项目 → 配置 → 签名验证;
  2. 勾选 “强制签名验证”(只有签名镜像能拉取);
  3. 点击 “添加公钥” → 选择本地的 cosign.pub 文件 → 命名为 “prod-sign-key” → 保存。
步骤 4:给镜像签名并推送
# 1. 给镜像打标签
docker tag nginx:1.26 192.168.1.100/prod/nginx:1.26

# 2. 用Cosign签名(输入私钥密码Sig123!)
cosign sign --key cosign.key 192.168.1.100/prod/nginx:1.26

# 3. 推送镜像到Harbor
docker push 192.168.1.100/prod/nginx:1.26
步骤 5:K8S 1.33 侧校验签名
  1. 回到 Harbor 的 “Kubernetes Admission Controller” 集成页面 → 勾选 “校验镜像签名” → 保存;
  2. 测试:推送一个未签名的镜像,部署 K8S Pod:
# unsigned-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: unsigned-nginx
spec:
  containers:
  - name: nginx
    image: 192.168.1.100/prod/nginx:1.26-unsigned  # 未签名镜像
  imagePullSecrets:
  - name: harbor-auth

执行部署:

kubectl apply -f unsigned-pod.yaml
# 返回错误:Error from server: admission webhook "validator.harbor.io" denied the request: 镜像无合法签名,拒绝拉取

3. 签名验证案例(生产场景)

场景:金融行业镜像防篡改
  • 需求:生产镜像必须由运维团队签名,防止镜像被篡改(比如植入挖矿程序);
  • 操作流程
    1. 运维生成统一 Cosign 密钥对,私钥加密存在 Vault,公钥上传到 Harbor 的 prod 项目;
    2. 开发构建完镜像,提交给运维审核 → 审核通过后,运维用私钥签名;
    3. 签名后的镜像推到 Harbor,Harbor 验证签名合法;
    4. 黑客尝试上传未签名的恶意 nginx 镜像到 prod → K8S 拉取时触发签名校验,直接拒绝;
    5. 效果:确保只有授权、未被篡改的镜像能部署,符合金融合规要求。

四、冷热镜像管理(存储分层)—— 省硬盘钱

1. 技术逻辑(人话版)

  1. 热镜像:最近 7 天被拉取过的镜像,存在 Harbor 本地存储(/data),访问快;
  2. 冷镜像:超过 7 天没被访问的镜像,自动挪到 MinIO(对象存储),Harbor 只留镜像 “目录信息”;
  3. 解冻:冷镜像被拉取时,Harbor 自动从 MinIO 把镜像拉回本地,恢复成热镜像;
  4. 核心:用 Harbor 的 “生命周期规则” 自动管理,本地存常用的,便宜存储存冷门的。

2. 详细操作步骤

步骤 1:Docker 部署 MinIO(作为冷存储)
# 1. 创建MinIO数据目录
mkdir -p /data/minio

# 2. 启动MinIO(Docker方式)
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /data/minio:/data \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin123" \
  minio/minio server /data --console-address ":9001"

# 3. 登录MinIO控制台:http://192.168.1.100:9001 → 账号minioadmin,密码minioadmin123
# 4. 创建桶:harbor-cold(存冷镜像)
步骤 2:配置 Harbor 对接 MinIO(冷存储)
  1. 停止 Harbor:docker-compose down
  2. 修改 harbor.yml 的 registry.storage 配置:
registry:
  storage:
    s3:  # MinIO兼容S3协议
      accesskey: "minioadmin"
      secretkey: "minioadmin123"
      region: "us-east-1"  # 随便填,MinIO不校验
      endpoint: "192.168.1.100:9000"  # MinIO地址
      secure: false  # 测试用http,生产改https
      bucket: "harbor-cold"
      rootdirectory: "/registry"
  delete:
    enabled: true
  1. 重新配置并启动 Harbor:
./prepare
docker-compose up -d
步骤 3:配置冷热镜像生命周期规则
  1. 登录 Harbor UI → 进入 prod 项目 → 生命周期规则 → 添加规则;
  2. 规则配置(纯人话):
    • 规则名称:prod-cold-rule
    • 触发条件:镜像 7 天内未被拉取
    • 动作:迁移到冷存储(MinIO)
    • 例外:保留最新 5 个镜像版本(核心版本不冷存)
    • 执行频率:每天凌晨 2 点(业务低峰期)
  3. 保存规则 → 手动点击 “执行” 测试。
步骤 4:验证冷热迁移
  1. 推送测试镜像:docker push 192.168.1.100/prod/test:v1
  2. 7 天内不访问该镜像 → 查看 MinIO 控制台 → harbor-cold 桶里会出现 test:v1 的文件;
  3. 拉取该镜像:docker pull 192.168.1.100/prod/test:v1 → Harbor 自动从 MinIO 把镜像拉回本地(热镜像);
  4. 查看 Harbor 存储:UI → 系统管理 → 存储管理 → 能看到 “本地存储” 和 “冷存储” 的占用比例。

3. 冷热镜像管理案例(生产场景)

场景:互联网公司存储成本优化
  • 需求:公司有 1000 + 镜像,大部分是历史版本,占用 10TB 本地 SSD,成本高;
  • 操作流程
    1. 部署 MinIO(用机械硬盘,成本是 SSD 的 1/10);
    2. 配置规则:prod 项目 90 天未访问的镜像迁冷存储,365 天未访问的删除;test 项目 30 天未访问迁冷存储,90 天删除;
    3. 执行规则后,本地存储从 10TB 降到 2TB,冷存储仅占 5TB,每年省 80% 存储成本;
    4. 某天需要拉取 6 个月前的历史镜像(修复线上 bug)→ Harbor 自动解冻,拉取后自动回冷;
  • 效果:不影响业务,大幅降成本,同时保留历史镜像可追溯。

五、K8S 1.33 适配关键避坑点(运维必看)

  1. 证书问题:K8S 1.33 对 HTTPS 证书要求严格,Harbor 必须用合法证书(自签的要拷贝到 K8S 节点的 /etc/docker/certs.d);
  2. 准入控制器:K8S 1.33 的 Admission Webhook 要求 CA 证书有效期≥30 天,且必须是 PEM 格式;
  3. 镜像拉取 Secret:K8S 1.33 的 ImagePullSecret 必须是 v1 版本,命令行创建的默认就是,不用改;
  4. Cosign 版本:必须用 v2.0+,K8S 1.33 不认 v1 的签名格式;
  5. 存储驱动:Harbor 的本地存储建议用 ext4,MinIO 用 xfs,避免 K8S 1.33 的 CSI 驱动兼容问题。

六、总结(纯人话)

Harbor 这三个核心功能,本质是:

  • 漏洞扫描:防漏洞 → 镜像有高危漏洞,K8S 不让用;
  • 签名验证:防篡改 → 镜像没运维的 “防伪章”,K8S 不让用;
  • 冷热管理:降成本 → 不用的镜像挪到便宜存储,要用再拿回来。

作为 10 年运维,你可以先在测试环境按上面的 Docker 部署步骤走一遍,重点验证 “扫描阻断”“签名阻断”“冷热迁移” 三个核心场景,再根据生产环境的合规、成本需求调整规则(比如漏洞等级、签名密钥管理、冷存周期),全程适配 K8S 1.33,核心是 “Harbor 定规则,K8S 做执行”,确保镜像全生命周期可控。

更多推荐