杰理之超距不回连问题【篇】
2026/6/26 22:58:10
作为 10 年经验的运维专家,我全程用 “人话” 拆解 Harbor 的漏洞扫描、签名验证、冷热镜像管理 ——放弃 Helm,纯 Docker Compose 部署,适配 K8S 1.33,每个环节都给 “能直接复制的操作步骤 + 生产级案例”,不绕理论,只讲落地。
# 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)复制并修改配置文件:
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配更简单# 预配置 ./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 就说明部署成功。
# 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-trivyHarbor 通过 “准入控制器(Admission Webhook)” 让 K8S 认 Harbor 的扫描结果,步骤:
kubectl create secret docker-registry harbor-auth \ --docker-server=192.168.1.100 \ --docker-username=admin \ --docker-password=Admin123! \ --namespace=defaultapiVersion: 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漏洞,拒绝拉取注:K8S 1.33 对 Cosign v2 + 支持最好,放弃旧的 Notary,只讲 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就对了# 生成密钥(密码设为Sig123!,生产要存在Vault里) cosign generate-key-pair --key-password-file <(echo "Sig123!") # 生成两个文件:cosign.key(私钥,绝对保密)、cosign.pub(公钥,要上传到Harbor)# 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# 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: 镜像无合法签名,拒绝拉取# 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(存冷镜像)docker-compose down;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./prepare docker-compose up -ddocker push 192.168.1.100/prod/test:v1;docker pull 192.168.1.100/prod/test:v1→ Harbor 自动从 MinIO 把镜像拉回本地(热镜像);Harbor 这三个核心功能,本质是:
作为 10 年运维,你可以先在测试环境按上面的 Docker 部署步骤走一遍,重点验证 “扫描阻断”“签名阻断”“冷热迁移” 三个核心场景,再根据生产环境的合规、成本需求调整规则(比如漏洞等级、签名密钥管理、冷存周期),全程适配 K8S 1.33,核心是 “Harbor 定规则,K8S 做执行”,确保镜像全生命周期可控。