You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

借助ARC自托管Runner免镜像仓库一步完成K8s镜像构建与部署

无需推送镜像仓库,直接在K8s自托管Runner完成构建与部署的可行方案

完全可以跳过外部镜像仓库的推送拉取步骤,直接在运行于K8s集群的自托管Runner上完成镜像构建和部署。核心原因是Runner Pod运行在集群节点上,构建的镜像可以直接被该节点的容器运行时访问,只要配置得当,K8s就能直接使用本地镜像启动Pod。

具体实现步骤

  • 构建镜像并加载到节点容器运行时
    在GitHub Action步骤中,直接用Docker或BuildKit构建镜像并加载到本地:

    # 构建并加载镜像到本地容器运行时
    docker build -t my-app:${{ github.sha }} .
    # 如果使用Buildx,需添加--load参数将镜像加载到本地(默认Buildx输出到镜像仓库)
    docker buildx build --load -t my-app:${{ github.sha }} .
    
  • 修改K8s部署配置,使用本地镜像
    在Deployment/YAML文件中,指定本地构建的镜像标签,并设置imagePullPolicy强制使用本地镜像:

    spec:
      containers:
      - name: my-app
        image: my-app:${{ github.sha }}
        imagePullPolicy: Never # 完全不尝试拉取镜像,仅使用本地存在的版本
        # 或使用IfNotPresent:本地存在则用本地,不存在再尝试拉取
    

    执行kubectl apply -f deployment.yaml完成部署。

关键注意事项

  • 节点亲和性配置
    镜像仅存在于Runner所在的节点,必须给Deployment添加节点亲和性,确保Pod被调度到同一节点:

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                # 可通过Runner环境变量动态获取节点名,比如${{ runner.node.name }}
                - runner-node-01
    
  • 权限配置
    自托管Runner的Pod需要拥有访问节点容器运行时的权限:

    • 使用Docker时,需挂载/var/run/docker.sock到Runner Pod;
    • 使用containerd时,需挂载/run/containerd/containerd.sock,并确保Runner的ServiceAccount有对应权限。
  • 镜像清理
    本地构建的镜像不会自动删除,需在Action收尾步骤添加清理命令,避免节点磁盘占用过高:

    docker rmi my-app:${{ github.sha }} || true
    
  • 安全替代方案
    若不想挂载Docker socket(存在权限泄露风险),可使用Kaniko直接构建镜像并推送到节点的containerd存储,或用Buildx的local输出模式将镜像导入containerd,避免暴露容器运行时的socket。

内容的提问来源于stack exchange,提问作者hegash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:10