在 GitHub Actions 中集成 minikube 作为 CI 步骤:从集群启动到镜像构建与部署验证

发布时间:2026/9/19 21:08:51
在 GitHub Actions 中集成 minikube 作为 CI 步骤:从集群启动到镜像构建与部署验证 在 GitHub Actions 中集成 minikube 作为 CI 步骤从集群启动到镜像构建与部署验证【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube本指南以 minikube 官方教程文档 setup_minikube_in_github_actions.md 为主体讲解如何在 GitHub Actions 工作流中使用medyagh/setup-minikubeAction 一键安装并启动本地 Kubernetes 集群并围绕每次 PR 自动构建镜像、部署应用、验证服务的完整 CI 流水线结合当前仓库源码深入剖析minikube image build、minikube service、minikube docker-env等核心命令的底层实现。读完本文你将能够独立搭建一个可复制的 minikube-in-GitHub-Actions 测试环境。为什么要在 GitHub Actions 中运行 minikube在持续集成CI环境中验证 Kubernetes 应用最直接的方式是让流水线里真的跑起一个 Kubernetes 集群。minikube 支持在 CI 中运行相关背景可见 continuous_integration.md大多数 CI 环境本身运行在虚拟机内可能不支持嵌套虚拟化因此在 CI 中推荐使用none直接在宿主机上运行或docker把 Kubernetes 节点跑在 Docker 容器里两种驱动。GitHub Actions 的ubuntu-latest运行器自带 Docker天然适合用docker驱动启动 minikube。为了让这一过程可复现社区提供了medyagh/setup-minikubeGitHub Action它负责下载指定版本的 minikube 二进制、安装对应版本的kubectl并完成集群启动使后续步骤可以像本地开发一样直接使用minikube与kubectl命令。最小化接入在 workflow 中启动 minikube在 GitHub Actions workflow 中安装并启动一个 minikube 集群只需在steps中加入如下一步steps: - name: start minikube id: minikube uses: medyagh/setup-minikubelatest这一步完成之后当前 job 的后续步骤即可直接执行minikube与kubectl命令与集群交互。更多关于该 Action 的参数如minikube-version、driver、kubernetes-version等可查阅 GitHub Actions Marketplace 上的 setup-minikube 页面。使用latest虽然书写最简但在生产流水线中更推荐固定到具体的 Action 版本号如v2或某个 release tag以保证 CI 行为可预期、可复现。完整示例每次 PR 构建镜像并部署到 minikube官方教程提供了一个完整的端到端示例每当仓库收到新的 Pull Request工作流自动完成检出代码 → 启动 minikube → 验证集群 → 构建镜像 → 部署应用 → 验证服务全流程。前置条件仓库中有一个可用的Dockerfile用于构建应用镜像有一份有效的deployment.yaml且其中的 Pod 模板设置了imagePullPolicy: Never后文会解释原因。创建 workflow 文件将以下 YAML 复制到仓库的.github/workflows/pr.ymlname: CI on: - pull_request jobs: job1: runs-on: ubuntu-latest name: build example and deploy to minikube steps: - uses: actions/checkoutv4 with: repository: medyagh/local-dev-example-with-minikube - name: Start minikube uses: medyagh/setup-minikubelatest - name: Try the cluster! run: kubectl get pods -A - name: Build image run: | minikube image build -t local/devex:v1 . - name: Deploy to minikube run: kubectl apply -f deploy/k8s.yaml kubectl wait --forconditionready pod -l applocal-devex - name: Test service URLs run: | minikube service list minikube service local-devex-svc --url echo ------------------opening the service------------------ curl $(minikube service local-devex-svc --url)这个示例 workflow 会在每次 PR 到来时依次执行检出源代码通过actions/checkoutv4拉取示例仓库代码安装并启动 minikube由medyagh/setup-minikubelatest完成尝试使用集群直接执行kubectl get pods -A验证集群可用构建 Docker 镜像使用 minikube 的镜像构建能力在集群内构建镜像应用部署 YAML 到 minikube执行kubectl apply验证服务创建成功通过minikube service检查服务地址并访问。注意原文档中步骤 4 提到该步骤使用 minikube 的docker-env特性。在当前版本的示例中这一步已被更直接的minikube image build取代其详细命令文档见 image.md两者都是让镜像进入集群的途径原理差异在下一节说明。示例 Deployment 与 Service 清单示例中配套的部署清单deploy/k8s.yaml同时声明了一个 Deployment 和一个 NodePort 类型的 ServiceapiVersion: apps/v1 kind: Deployment metadata: name: example spec: selector: matchLabels: app: example replicas: 2 template: metadata: labels: app: example spec: containers: - name: example-api imagePullPolicy: Never image: local/example:latest resources: limits: cpu: 50m memory: 100Mi requests: cpu: 25m memory: 10Mi ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: example spec: type: NodePort selector: app: example ports: - port: 8080 targetPort: 8080其中两个关键点需要特别注意imagePullPolicy: Never镜像由 CI 直接构建进 minikube 的容器运行时本地已经存在因此必须禁止 kubelet 尝试从远程镜像仓库拉取远程并不存在local/example:latest否则 Pod 会因拉取失败而无法启动resources资源声明为容器设置 CPU 与内存的requests/limits避免 CI 环境中资源被过度占用这也是面向共享运行器的良好实践。源码级解析CI 中三条核心命令的底层原理示例 workflow 的核心操作可以归结为三件事把镜像送进集群、把资源部署上去、把服务暴露出来并验证。以下结合当前仓库源码说明其实现。镜像构建minikube image buildminikube image build的命令实现在 cmd/minikube/cmd/image.go 的buildImageCmdL278-L336中。从代码可以看到命令用法为minikube image build PATH | URL | -支持构建本地目录、远程 URL 或从标准输入读取构建上下文若传入的是本地目录会先调用createTar将其打成 tar 流L269-L275再交给节点上的容器运行时完成构建构建实际由machine.BuildImage执行构建发生在 minikube 节点内部因此产物镜像直接存在于集群的容器运行时中天然对集群可见无需额外的镜像推送或加载步骤。该命令还支持若干实用 flag注册见 L409-L415Flag说明-t, --tag string为构建出的新镜像打标签如示例中的local/devex:v1-f, --file string指定 Dockerfile 路径可选默认使用构建上下文根目录的 Dockerfile--push构建后推送镜像需配合 tag--build-env keyvalue向构建过程传递环境变量--build-opt keyvalue向构建工具传递任意参数-n, --node string指定在哪个节点上构建默认主控制平面--all在多节点集群的所有节点上构建这也解释了为何示例中构建后即可直接kubectl apply部署镜像已在集群运行时内配合imagePullPolicy: Never即可免去镜像仓库环节。此外minikube image子命令还包含load、save、pull、push、tag、ls、rm等操作见同文件init()中对各子命令的注册可作为 CI 中镜像管理能力的补充。命令行代理minikube kubectl --示例中直接使用kubectl命令这依赖于 setup-minikube Action 已为你安装好与集群版本匹配的 kubectl。作为对照minikube 自身还提供minikube kubectl子命令其实现在 cmd/minikube/cmd/kubectl.gokubectlCmdL45-L147它会按集群的 Kubernetes 版本缓存并执行对应版本的 kubectl 二进制KubectlCommandL160-L171避免本机 kubectl 与集群版本不匹配的问题。例如minikube kubectl -- get pods -A在自行编写 CI 脚本不依赖 setup-minikube Action时这一能力可以保证客户端与服务端版本一致。服务暴露与验证minikube service工作流的最后一步通过minikube service验证部署结果minikube service list列出集群中所有服务minikube service local-devex-svc --url仅输出服务的访问 URL不打开浏览器便于在脚本中捕获地址curl $(minikube service local-devex-svc --url)直接发起 HTTP 请求完成端到端连通性验证。该命令实现在 cmd/minikube/cmd/service.goserviceCmdL65-L184。--url对应其中的serviceURLMode开关L188开启后命令只把 URL 打印到标准输出而不再打开浏览器这正是脚本化 CI 场景所需的无交互模式。其它常用 flag 包括-n, --namespace string指定服务所在命名空间默认default--all转发命名空间内所有服务--https使用 https 而非 http 打开服务 URL--wait int/--interval int等待服务就绪的时间秒与每次检查的时间间隔秒。在 Docker 驱动下minikube service会通过startKicServiceTunnelL197-L250建立 SSH 隧道把节点端口转发到宿主机因此curl可以直接从 runner 访问到集群内的服务。补充传统docker-env方案的实现位置原文档提到构建镜像可借助docker-env特性其命令实现在 cmd/minikube/cmd/docker-env.gominikube docker-env输出一组环境变量如DOCKER_HOST、DOCKER_TLS_VERIFY、DOCKER_CERT_PATH使本机 docker CLI 直接指向 minikube 内的 Docker Engine从而在本机执行docker build即可把镜像构建到集群内。该命令的完整参数说明见 docker-env.md主要 flag 包括--no-proxy、--shell、--ssh-host、--ssh-add、-u/--unset、-o/--output等并仅支持docker与containerd两种运行时dockerEnvSupportedL675-L684。相比docker-env需要手动eval环境变量示例中采用的minikube image build是更简单、也更适合 CI 脚本的单命令方案。部署验证的常见问题与排查要点结合上述源码行为在实际落地该 workflow 时建议关注以下几点imagePullPolicy: Never不能省略镜像只存在于 minikube 的容器运行时内任何仓库都没有该镜像若删掉这一行kubelet 会尝试从默认镜像仓库拉取local/example:latest并失败Pod 将长期处于ImagePullBackOff确认构建上下文与镜像名一致minikube image build -t local/devex:v1 .中的 tag 必须与 Deployment 中image:字段完全一致否则部署时仍会尝试拉取不存在的镜像用kubectl wait等待就绪示例中在kubectl apply后立即用kubectl wait --forconditionready pod -l applocal-devex等待 Pod 就绪这是避免部署还没完成就开始 curl 导致偶发失败的关键步骤minikube service --url的输出可能包含多行当服务有多个端口或节点时可能输出多个 URL脚本中建议对输出做拆分处理Docker 驱动下的minikube service需要 SSH 隧道若隧道未就绪可适当增大--wait固定版本以保障可复现性生产环境建议将 setup-minikube 固定到具体版本并为 minikube 集群指定明确的 minikube / Kubernetes 版本参数。小结在 GitHub Actions 中运行 minikube本质上就是把本地单机 Kubernetes 开发环境搬到 CI runner 上用medyagh/setup-minikube完成安装与启动用minikube image build将镜像直接构建进集群运行时配合imagePullPolicy: Never的 Deployment 清单完成部署最后用minikube service --url与curl完成端到端验证。这套模式既不需要额外的镜像仓库也不依赖复杂的集群编排适合作为 Kubernetes 应用在 PR 阶段的轻量级回归测试方案。文中涉及的 workflow 示例、Deployment/Service 清单均可直接复制到你的仓库中使用相关命令的完整参数可继续查阅 image.md、docker-env.md 与 service.md 等命令文档。【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询