借助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有对应权限。
- 使用Docker时,需挂载
镜像清理
本地构建的镜像不会自动删除,需在Action收尾步骤添加清理命令,避免节点磁盘占用过高:docker rmi my-app:${{ github.sha }} || true安全替代方案
若不想挂载Docker socket(存在权限泄露风险),可使用Kaniko直接构建镜像并推送到节点的containerd存储,或用Buildx的local输出模式将镜像导入containerd,避免暴露容器运行时的socket。
内容的提问来源于stack exchange,提问作者hegash
相关产品推荐
相关产品推荐

