K8S 从Harbor当中拉取镜像 连接方法

文章目录

你的理解非常正确!让我为你详细解释并确认各个步骤:

一、核心流程确认

  1. 镜像上传到Harbor

    • 你需要将本地tar镜像通过containerd上传到Harbor仓库
    • 上传后,镜像将存储在Harbor中,所有K8S节点都可以访问
    • 上传命令:sudo ctr -n=k8s.io images push --user admin:Harbor12345 10.20.233.177:80/library/dnabert2:dnabert2
  2. 一次性配置K8S和Harbor连接

    • 创建镜像拉取凭证(Secret):kubectl create secret docker-registry harbor-registry-secret ...
    • 配置containerd支持Harbor访问(修改/etc/containerd/config.toml
    • 这些配置只需要执行一次,所有节点共享
  3. 在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
}

三、关键注意事项

  1. 镜像命名一致性

    • 确保Harbor中的镜像名称和标签与resource服务中使用的名称一致
    • 例如:10.20.233.177:80/library/dnabert2:dnabert2
  2. 拉取凭证作用域

    • 镜像拉取凭证是命名空间级别的,确保在创建resource服务的命名空间中存在该凭证
    • 如果你在多个命名空间中使用Harbor镜像,需要在每个命名空间中创建凭证
  3. 网络连通性

    • 确保K8S节点能够访问Harbor地址(10.20.233.177:80)
    • 检查防火墙规则,确保允许K8S节点访问Harbor端口
  4. 镜像拉取策略

    • K8S默认使用IfNotPresent拉取策略,只会在本地不存在镜像时拉取
    • 如果需要每次都从Harbor拉取最新镜像,可以设置imagePullPolicy: Always

四、验证方法

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

五、后续优化建议

  1. 批量上传脚本

    • 创建一个Shell脚本,批量上传所有5个镜像到Harbor
    • 脚本包含导入、标签、推送和验证步骤
  2. 自动化镜像管理

    • 将镜像上传步骤集成到CI/CD流程中
    • 每次镜像更新时自动上传到Harbor
  3. 镜像版本管理

    • 为镜像添加版本标签,便于追踪和回滚
    • 例如:10.20.233.177:80/library/dnabert2:v1.0.0
  4. 监控和告警

    • 配置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

操作完成总结

已完成的工作

  1. 镜像成功推送到Harbor

    • 使用正确的Harbor地址:10.16.233.177:80
    • 使用HTTP协议(添加了--plain-http参数)
    • 镜像推送成功,存储在Harbor的library项目中
  2. 创建了K8S命名空间

    • 创建了"tai"命名空间,用于部署生物大模型服务
    • 命名空间状态:Active
  3. 创建了镜像拉取凭证

后续使用建议

  1. 在Resource Service中使用Harbor镜像

    • 将镜像地址从docker.io/library/dnabert2:dnabert2改为10.16.233.177:80/library/dnabert2:dnabert2
    • 确保在部署配置中引用了创建的镜像拉取凭证
  2. 测试镜像拉取

    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
  3. 批量处理其他镜像

    • 按照相同的流程处理其他4个镜像(omegafold_gpu、progen2_1223、proteinmpnn、scgpt)
    • 可以创建Shell脚本自动化批量处理
  4. 监控和维护

    • 定期检查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

现状分析

  1. Harbor已在运行 :所有9个Harbor组件都处于Up (healthy)状态,使用的是v2.14.1版本
  2. 数据已迁移 :我们已将Harbor数据从/data迁移到/var/lib/kubernetes-storage/harbor
  3. 配置已修改 :已更新harbor.yml,将data_volume设置为新路径

检查当前存储路径使用情况

bash 复制代码
# 检查当前Harbor容器的存储挂载情况
sudo docker inspect harbor-core | grep -A 20 "Mounts"

平滑迁移方案

方案1:滚动更新(推荐)

  1. 暂停Harbor服务

    bash 复制代码
    sudo docker compose pause
  2. 更新docker-compose.yml

    bash 复制代码
    # 修改docker-compose.yml中的存储挂载路径
    sudo sed -i 's|/data/|/var/lib/kubernetes-storage/harbor/|g' docker-compose.yml
  3. 更新服务配置

    bash 复制代码
    sudo ./prepare
  4. 恢复服务

    bash 复制代码
    sudo docker compose unpause
    sudo docker compose up -d --force-recreate

方案2:热切换(风险较高)

  1. 直接修改容器挂载

    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/

建议

  1. 在低峰期操作:选择同事使用较少的时间段进行迁移
  2. 备份数据:迁移前再次备份数据,确保安全
  3. 先测试:在测试环境或非生产环境先验证方案
  4. 快速切换:整个切换过程控制在5-10分钟内,减少影响

这样处理后,Harbor会使用新的存储路径,同时保留原有数据,实现平滑迁移,不影响同事的正常使用。

相关推荐
陈陈CHENCHEN2 小时前
【Kubernetes】K8s 1.35 配置 Docker 作为容器运行时
docker·kubernetes
勇气要爆发2 小时前
Kubernetes (K8S):云时代的“超级舵手”
云原生·容器·kubernetes
杜子不疼.2 小时前
Spring Cloud Alibaba 微服务架构:注册中心 + 配置中心搭建
微服务·云原生·架构
java_logo3 小时前
MinerU Docker 部署指南:PDF 结构化解析服务实践
docker·容器·pdf·mineru·mineru部署·mineru部署文档·mineru部署教程
大新新大浩浩3 小时前
ubuntu2204 + k8s 1.32.5 +GPU-Operator 24.9.2搭建GPU-k8s平台
云原生·容器·kubernetes
❀͜͡傀儡师3 小时前
Docker打造全能媒体中心Plex
docker·容器·媒体
懒鸟一枚3 小时前
k8s 之minikube安装看k8s
云原生·容器·kubernetes
qq_4557608516 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器
Mintopia18 小时前
🐱 LongCat-Image:当AI绘画说上了流利的中文,还减掉了40斤参数 | 共绩算力
人工智能·云原生·aigc