
一年半之前,即2018年3月5日,Google发布了其CI / CD开源项目的第一个Alpha版本
Skaffold ,其目标是为
Kubernetes创建一个“简单且可复制的开发”,以便开发人员可以专注于开发,并且不在管理上。 Skaffold可能感兴趣的是什么? 事实证明,他的袖子上有几张王牌,因此,他可以成为开发人员的强大工具,甚至可以成为运营工程师。 我们将熟悉该项目及其功能。
NB :顺便说一句,我们已经在针对与Kubernetes息息相关的开发人员的工具概述中简要讨论了Skaffold。理论 目的和特点
因此,总体而言,Skaffold解决了CI / CD周期自动化的问题(在构建,推送,部署阶段),为开发人员提供了及时的反馈,即 快速获得下一个代码更改结果的能力-以在Kubernetes集群中运行的更新应用程序的形式。 而且它可以在不同的轮廓(开发,阶段,生产...)下工作,为此,Skaffold可以帮助描述合适的展开管线。
Skaffold的源代码是用Go编写的,并根据免费的Apache License 2.0(
GitHub )进行分发。
考虑主要功能和特点。 第一个包括以下内容:
- Skaffold提供了用于创建CI / CD管道的工具。
- 允许您在后台监视源代码中的更改,并开始自动过程,将代码构建到容器映像中,将这些映像发布到Docker Registry并将它们部署到Kubernetes集群。
- 将存储库中的文件与容器中的工作目录同步。
- 使用容器结构测试自动测试。
- 转发端口。
- 读取容器中运行的应用程序的日志。
- 帮助调试用Java,Node.js,Python,Go编写的应用程序。
现在介绍功能:
- Skaffold本身没有群集端组件 。 也就是说,您无需额外配置Kubernetes即可使用该实用程序。
- 适用于您的应用程序的不同管道 。 是否需要在开发过程中,然后在舞台或生产环境中在本地Minikube中推出代码? 为此,提供了配置文件和用户配置,环境变量和标志,使您可以为一个应用程序描述不同的管道。
- 命令行界面 YAML中仅控制台实用程序和配置。 在网络上,您可以找到有关尝试创建实验性GUI的参考 ,但是目前,这可能仅意味着有人需要它,但并非真正需要它。
- 模块化 。 Skaffold不是独立的联合体,而是寻求将单独的模块或现有解决方案用于特定任务。
后者的插图:
- 在组装阶段,您可以使用:
- docker在本地,使用kaniko的群集中或在Google Cloud Build中构建;
- 本地Bazel;
- Jib Maven和Jib Gradle在本地或在Google Cloud Build上;
- 自定义构建脚本在本地运行。 如果您需要为该程序集运行另一个(更灵活/熟悉的...)解决方案,请在脚本中对其进行描述,以便Skaffold运行该程序( 示例来自文档 )。 这使您可以使用可以使用脚本调用的任何收集器。
- 在测试阶段,已经提到的容器结构测试得到支持;
- 提供部署:
因此,可以将Skaffold称为一种
用于构建CI / CD的
框架 。 这是使用时的工作流程示例(来自项目文档):

Skaffold的作品总体上是什么样的?
- 该实用程序监视源目录中的更改。 如果对文件进行了修改,它们将与Kubernetes集群中的应用程序容器同步。 如果可能的话,不重新组装图像。 否则,将有一个新图像。
- 使用容器结构测试检查组装后的映像,将其标记并发送到Docker Registry。
- 之后,将部署映像-将其部署在Kubernetes集群中。
- 如果启动是使用
skaffold dev
命令初始化的,那么我们开始从应用程序接收日志,并且Skaffold希望所做的更改会再次重复所有步骤。
脚手架里程碑图练习 尝试脚手架
为了演示Skaffold的用法,我将以
该项目的
GitHub存储库中的示例为例。 顺便说一句,
您可以找到许多考虑了各种细节的其他示例。 所有操作将在Minikube中本地执行。 安装很简单,需要几分钟,因此需要kubectl才能开始。
安装支架:
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 chmod +x skaffold sudo mv skaffold /usr/local/bin skaffold version v0.37.1
让我们用必要的示例克隆Skaffold存储库:
git clone https://github.com/GoogleContainerTools/skaffold cd skaffold/examples/microservices
我选择了一个包含两个Pod的示例,每个Pod都包含一个Go上的小应用程序。 一个应用程序是前端(leeroy-web),对第二个应用程序的重定向请求是后端(leeroy-app)。 让我们看看它的外观:
~/skaffold/examples/microservices
leeroy-app和leeroy-web包含Go代码和简单的Dockerfile,以在本地构建此代码:
~/skaffold/examples/microservices
我不会提供应用程序代码-足以知道
leeroy-web
接受请求并将其代理到
leeroy-app
。 因此,在
Deployment.yaml
文件中,仅针对该
app
服务(用于内部路由)。
web
pod端口将被扔给我们以快速访问该应用程序。
skaffold.yaml
是什么
skaffold.yaml
:
~/skaffold/examples/microservices # cat skaffold.yaml apiVersion: skaffold/v1beta13 kind: Config build: artifacts: - image: leeroy-web context: ./leeroy-web/ - image: leeroy-app context: ./leeroy-app/ deploy: kubectl: manifests: - ./leeroy-web/kubernetes/* - ./leeroy-app/kubernetes/* portForward: - resourceType: deployment resourceName: leeroy-web port: 8080 localPort: 9000
上面介绍了所有上述步骤。 除了此配置外,还有一个具有全局设置的文件
~/.skaffold/config
。 可以手动或通过CLI对其进行编辑-例如,如下所示:
skaffold config set --global local-cluster true
此命令将
local-cluster
全局变量设置为
true
,之后,Skaffold将不会尝试将图像“推送”到远程注册表中。 如果在本地进行开发,则也可以使用此命令在本地添加图像。
返回
skaffold.yaml
:
- 在
build
阶段,我们指示您需要在本地收集和保存映像。 首次启动组装后,我们将看到以下内容:
// .. Minikube , // ,
如您所见,Skaffold独立测试了图像。 顺便说一下,支持几种标记策略。 - 在配置
context: ./leeroy-app/
指定了以下内容context: ./leeroy-app/
,即 指定了组合图像的上下文。 - 在部署阶段,确定我们将对所需的清单使用kubectl和掩码。
PortForward
:类似于我们通常使用kubectl port-forward
,我们给出了Skaffold指令来调用此命令。 在这种情况下,本地端口9000被转发到Deployment中的8080,名称为leeroy-web
。
是时候开始
skaffold dev
:团队将创建一个持续的“反馈循环”,即 不仅收集所有内容并将其安装在集群中,而且还告知当前Pod的状态,将监视更改并更新Pod的状态。
这是重新组装时运行
skaffold dev --port-forward
的结果:

首先,很明显,正在使用缓存。 接下来-组装,部署应用程序,转发端口。 由于指定了
--port-forward
,因此Skaffold会根据请求将端口转发到
web
,但他会酌情转发该
app
(他选择了最接近的免费
app
)。 之后,我们从应用程序中获取了第一个日志。
检查性能?
~/skaffold/examples/microservices
修改
leeroy-app/app.go
-花费几秒钟...并且:
~/skaffold/examples/microservices
同时,Skaffold本身也与以前一样带到控制台,但有一点例外:它只推出了
leeroy-app
,而不是一次全部推出。
更多练习
值得一提的是,在创建新项目时,可以使用
init
命令引导Skaffold的配置,这非常方便。 此外,您可以编写几个配置:默认情况下在配置上进行开发,然后使用另一个配置通过
run
命令(与
dev
相同的过程,只是不遵循更改)进入阶段。
Katacoda有一个
教程,其中包含一个更简单的示例。 但是它提供了一个带有Kubernetes,应用程序和Skaffold的现成沙箱。 如果您有兴趣自己尝试一些基础知识,那么这是一个不错的选择。
Skaffold的一个可能用例是在远程集群上进行开发。 并非每个人都愿意在自己的硬件上运行Minikube,然后推出应用程序并等待其正常运行...在这种情况下,Skaffold可以完美地解决任务,例如Reddit工程师可以确认这一点,正如我们在博客中已经
提到的那样。
在Weaveworks的
此出版物中 ,您可以找到创建生产管道的示例。
结论
Skaffold是构建管道的便捷工具,该管道涉及将应用程序推广到Kubernetes,并且主要关注开发需求。 有了它,创建一个考虑开发人员基本需求的“短”管道非常简单,但是,如果您愿意,您可以组织更雄心勃勃的流程。 作为在CI / CD流程中使用Skaffold的说明性示例之一
,给出了一个使用Kubernetes,gRPC,Istio和OpenCensus Tracing的功能的10种微服务的
测试项目 。
Skaffold已经在GitHub上获得了近8000颗星,由Google开发,并且是
GoogleContainerTools的一部分-总的来说,目前,我们有理由相信该项目将在此后幸福地发展。
聚苯乙烯
另请参阅我们的博客: