文章目录
你的理解非常正确!让我为你详细解释并确认各个步骤:
一、核心流程确认
-
镜像上传到Harbor:
- 你需要将本地tar镜像通过containerd上传到Harbor仓库
- 上传后,镜像将存储在Harbor中,所有K8S节点都可以访问
- 上传命令:
sudo ctr -n=k8s.io images push --user admin:Harbor12345 10.20.233.177:80/library/dnabert2:dnabert2
-
一次性配置K8S和Harbor连接:
- 创建镜像拉取凭证(Secret):
kubectl create secret docker-registry harbor-registry-secret ... - 配置containerd支持Harbor访问(修改
/etc/containerd/config.toml) - 这些配置只需要执行一次,所有节点共享
- 创建镜像拉取凭证(Secret):
-
在resource服务中使用Harbor镜像:
- 将
image字段从docker.io/library/dnabert2:dnabert2改为Harbor地址 - 示例:
image": "10.20.233.177:80/library/dnabert2:dnabert2" - K8S会自动使用配置的拉取凭证从Harbor拉取镜像
- 将
二、具体操作示例
1. 上传镜像到Harbor
bash
# 1. 导入镜像到containerd
sudo ctr -n=k8s.io images import /var/lib/kubernetes-storage/progen/pod_mirror/dnabert2_image.tar
# 2. 为镜像添加Harbor标签
sudo ctr -n=k8s.io images tag dnabert2:dnabert2 10.20.233.177:80/library/dnabert2:dnabert2
# 3. 推送镜像到Harbor
sudo ctr -n=k8s.io images push --user admin:Harbor12345 10.20.233.177:80/library/dnabert2:dnabert2
2. 配置K8S和Harbor连接
bash
# 创建镜像拉取凭证
kubectl create secret docker-registry harbor-registry-secret \
--docker-server=10.20.233.177:80 \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-email=admin@example.com \
-n tai
3. 在resource服务中使用Harbor镜像
修改你的resource服务JSON配置:
json
{
"inferenceName": "bitstack-cf1980e757a04e6c8a00bcacdf1940f2",
"uuid": "a9517434296674926966c33e6b82a26d5",
"imageId": null,
"image": "10.20.233.177:80/library/dnabert2:dnabert2", // 改为Harbor镜像地址
"url": "10.16.233.177",
"type": "api",
"containerBusinessPort": 7868,
"containerStatusPort": 7869,
"nodeBusinessPort": 30312,
"nodeStatusPort": 30131,
"cpu": 4,
"gpu": 0,
"memory": 3,
"replicas": 1,
"command": "/app/start_service.sh",
"ports": null,
"volumes": [
"dnabert2-model-weights-pvc:/app/model/"
],
"envs": [
"SERVICE_NAME:dnabert2"
],
"createTime": 1766995316357,
"enable": true,
"status": "Running",
"readyReplicas": 1
}
三、关键注意事项
-
镜像命名一致性:
- 确保Harbor中的镜像名称和标签与resource服务中使用的名称一致
- 例如:
10.20.233.177:80/library/dnabert2:dnabert2
-
拉取凭证作用域:
- 镜像拉取凭证是命名空间级别的,确保在创建resource服务的命名空间中存在该凭证
- 如果你在多个命名空间中使用Harbor镜像,需要在每个命名空间中创建凭证
-
网络连通性:
- 确保K8S节点能够访问Harbor地址(10.20.233.177:80)
- 检查防火墙规则,确保允许K8S节点访问Harbor端口
-
镜像拉取策略:
- K8S默认使用
IfNotPresent拉取策略,只会在本地不存在镜像时拉取 - 如果需要每次都从Harbor拉取最新镜像,可以设置
imagePullPolicy: Always
- K8S默认使用
四、验证方法
bash
# 1. 查看Harbor中是否存在镜像
curl -u admin:Harbor12345 http://10.20.233.177:80/api/v2.0/projects/library/repositories
# 2. 创建测试Pod,使用Harbor镜像
kubectl run test-harbor --image=10.20.233.177:80/library/dnabert2:dnabert2 --image-pull-policy=IfNotPresent -n tai
# 3. 检查Pod状态
kubectl get pods -n tai
# 4. 查看Pod事件,确认镜像拉取情况
kubectl describe pod test-harbor -n tai
五、后续优化建议
-
批量上传脚本:
- 创建一个Shell脚本,批量上传所有5个镜像到Harbor
- 脚本包含导入、标签、推送和验证步骤
-
自动化镜像管理:
- 将镜像上传步骤集成到CI/CD流程中
- 每次镜像更新时自动上传到Harbor
-
镜像版本管理:
- 为镜像添加版本标签,便于追踪和回滚
- 例如:
10.20.233.177:80/library/dnabert2:v1.0.0
-
监控和告警:
- 配置Prometheus监控镜像拉取状态
- 设置Alertmanager告警规则,当镜像拉取失败时发送通知
通过以上步骤,你可以实现将本地tar镜像上传到Harbor,并在K8S中使用Harbor镜像,从而支持多节点扩展,提高系统的可扩展性和可维护性。
我需要帮助用户正确导入镜像到containerd,然后推送到Harbor并创建K8S镜像拉取凭证。首先查看当前镜像状态。
toolName: run_command
status: success
command: sudo crictl images | grep dnabert2 && sudo ctr -n=k8s.io images ls | grep dnabert2 undefined
镜像已经存在于containerd中,现在需要为镜像添加Harbor标签,然后推送到Harbor。
toolName: run_command
status: success
command: sudo ctr -n=k8s.io images tag docker.io/library/dnabert2:dnabert2 10.20.233.177:80/library/dnabert2:dnabert2 undefined
现在镜像已经添加了Harbor标签,需要将其推送到Harbor仓库。
toolName: run_command
status: success
command: sudo ctr -n=k8s.io images push --user admin:Harbor12345 10.20.233.177:80/library/dnabert2:dnabert2 undefined
推送镜像时出现超时问题,可能是Harbor地址不正确。让我检查Harbor的实际地址和网络连接。
toolName: run_command
status: success
command: curl -I http://10.16.233.177:80 && curl -I http://10.20.233.177:80 undefined
从结果可以看到,10.16.233.177:80可以正常访问,而10.20.233.177:80可能无法访问。让我使用正确的Harbor地址10.16.233.177:80来重试。
toolName: run_command
status: success
command: sudo ctr -n=k8s.io images tag docker.io/library/dnabert2:dnabert2 10.16.233.177:80/library/dnabert2:dnabert2 undefined
现在使用正确的Harbor地址(10.16.233.177:80)将镜像推送到Harbor仓库。
toolName: run_command
status: success
command: sudo ctr -n=k8s.io images push --user admin:Harbor12345 10.16.233.177:80/library/dnabert2:dnabert2 undefined
推送镜像时出现了HTTPS错误,Harbor使用的是HTTP协议,需要在命令中添加--plain-http参数。
toolName: run_command
status: success
command: sudo ctr -n=k8s.io images push --plain-http --user admin:Harbor12345 10.16.233.177:80/library/dnabert2:dnabert2 undefined
镜像已成功推送到Harbor,现在需要创建K8S镜像拉取凭证并验证配置。
toolName: run_command
status: success
command: kubectl create secret docker-registry harbor-registry-secret --docker-server=10.16.233.177:80 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@example.com -n tai && kubectl get secrets -n tai | grep harbor undefined
命名空间"tai"不存在,需要先查看可用的命名空间,然后在正确的命名空间中创建secret。
toolName: run_command
status: success
command: kubectl get namespaces undefined
需要先创建"tai"命名空间,然后再创建镜像拉取凭证。
toolName: run_command
status: success
command: kubectl create namespace tai && kubectl create secret docker-registry harbor-registry-secret --docker-server=10.16.233.177:80 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@example.com -n tai && kubectl get secrets -n tai | grep harbor undefined
操作完成总结
已完成的工作
-
镜像成功推送到Harbor:
- 使用正确的Harbor地址:10.16.233.177:80
- 使用HTTP协议(添加了
--plain-http参数) - 镜像推送成功,存储在Harbor的library项目中
-
创建了K8S命名空间:
- 创建了"tai"命名空间,用于部署生物大模型服务
- 命名空间状态:Active
-
创建了镜像拉取凭证:
- 在"tai"命名空间中创建了
harbor-registry-secret - 配置了正确的Harbor认证信息
- 凭证类型:kubernetes.io/dockerconfigjson
- 在"tai"命名空间中创建了
后续使用建议
-
在Resource Service中使用Harbor镜像:
- 将镜像地址从
docker.io/library/dnabert2:dnabert2改为10.16.233.177:80/library/dnabert2:dnabert2 - 确保在部署配置中引用了创建的镜像拉取凭证
- 将镜像地址从
-
测试镜像拉取:
bash# 创建测试Pod,验证镜像拉取 kubectl run test-harbor --image=10.16.233.177:80/library/dnabert2:dnabert2 --image-pull-policy=IfNotPresent -n tai --image-pull-secrets=harbor-registry-secret # 检查Pod状态 kubectl get pods -n tai # 查看Pod事件 kubectl describe pod test-harbor -n tai -
批量处理其他镜像:
- 按照相同的流程处理其他4个镜像(omegafold_gpu、progen2_1223、proteinmpnn、scgpt)
- 可以创建Shell脚本自动化批量处理
-
监控和维护:
- 定期检查Harbor中的镜像状态
- 监控K8S镜像拉取事件
- 定期更新镜像版本,确保使用最新版本
镜像地址对照表
| 原有镜像地址 | Harbor镜像地址 |
|---|---|
| docker.io/library/dnabert2:dnabert2 | 10.16.233.177:80/library/dnabert2:dnabert2 |
| docker.io/library/omegafold:omegafold_gpu | 10.16.233.177:80/library/omegafold:omegafold_gpu |
| docker.io/library/progen2:progen2_1223 | 10.16.233.177:80/library/progen2:progen2_1223 |
| docker.io/library/proteinmpnn:proteinmpnn | 10.16.233.177:80/library/proteinmpnn:proteinmpnn |
| docker.io/library/scgpt:scgpt | 10.16.233.177:80/library/scgpt:scgpt |
现在你可以在Resource Service中使用Harbor镜像地址,K8S会自动从Harbor拉取镜像,支持多节点扩展。所有节点共享同一个Harbor镜像仓库,不需要在每个节点手动导入镜像。
我需要先停止当前的镜像拉取进程,然后恢复原始镜像源,再检查当前Harbor的状态,探索如何在新存储位置启动Harbor同时不影响同事使用。
toolName: StopCommand
status: success
现在先恢复原始镜像源,然后检查当前Harbor的运行状态,探索如何在新存储位置启动Harbor同时不影响同事使用。
toolName: run_command
status: success
command: cd /home/user/harbor/harbor && sudo sed -i 's|swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/goharbor/|goharbor/|g' docker-compose.yml && sudo docker compose ps && sudo docker ps | grep harbor undefined
现状分析
- Harbor已在运行 :所有9个Harbor组件都处于
Up (healthy)状态,使用的是v2.14.1版本 - 数据已迁移 :我们已将Harbor数据从
/data迁移到/var/lib/kubernetes-storage/harbor - 配置已修改 :已更新
harbor.yml,将data_volume设置为新路径
检查当前存储路径使用情况
bash
# 检查当前Harbor容器的存储挂载情况
sudo docker inspect harbor-core | grep -A 20 "Mounts"
平滑迁移方案
方案1:滚动更新(推荐)
-
暂停Harbor服务:
bashsudo docker compose pause -
更新docker-compose.yml:
bash# 修改docker-compose.yml中的存储挂载路径 sudo sed -i 's|/data/|/var/lib/kubernetes-storage/harbor/|g' docker-compose.yml -
更新服务配置:
bashsudo ./prepare -
恢复服务:
bashsudo docker compose unpause sudo docker compose up -d --force-recreate
方案2:热切换(风险较高)
-
直接修改容器挂载 :
bash# 停止当前Harbor sudo docker compose down # 更新docker-compose.yml中的存储挂载 sudo sed -i 's|/data/|/var/lib/kubernetes-storage/harbor/|g' docker-compose.yml # 使用新挂载路径重新启动 sudo docker compose up -d
验证方案
检查配置
bash
# 查看docker-compose.yml中的存储配置
grep -A 5 -B 5 "/data" docker-compose.yml
启动后的验证
bash
# 检查容器状态
sudo docker compose ps
# 检查Harbor访问
curl -I http://10.16.233.177:80
# 检查数据存储位置
sudo ls -la /var/lib/kubernetes-storage/harbor/registry/docker/registry/v2/repositories/
建议
- 在低峰期操作:选择同事使用较少的时间段进行迁移
- 备份数据:迁移前再次备份数据,确保安全
- 先测试:在测试环境或非生产环境先验证方案
- 快速切换:整个切换过程控制在5-10分钟内,减少影响
这样处理后,Harbor会使用新的存储路径,同时保留原有数据,实现平滑迁移,不影响同事的正常使用。