一年半前,即 5 年 2018 月 XNUMX 日,Google 发布了 CI/CD 开源项目的第一个 alpha 版本,名为
NB:顺便说一句,我们已经在我们的通用中简要讨论过 Skaffold
理论。 目的和能力
因此,一般来说,Skaffold 解决了 CI/CD 周期(在构建、推送、部署阶段)自动化的问题,为开发人员提供及时的反馈,即能够快速接收后续代码更改的结果 - 以在 Kubernetes 集群中运行的更新应用程序的形式。 它可以在不同的电路(开发、阶段、生产...)中工作,为此 Skaffold 帮助描述了相应的部署流程。
Skaffold的源代码是用Go编写的,
我们来看看主要功能和特点。 第一个包括以下内容:
- Skaffold 提供用于创建 CI/CD 管道的工具。
- 允许您在后台监视源代码的更改,并运行将代码组装到容器映像中的自动化过程,在 Docker 注册表中发布这些映像并将它们部署到 Kubernetes 集群。
- 将存储库中的文件与容器中的工作目录同步。
- 使用容器结构测试自动测试。
- 转发端口。
- 读取容器中运行的应用程序的日志。
- 帮助调试用 Java、Node.js、Python、Go 编写的应用程序。
现在介绍一下功能:
- Skaffold本身没有集群端组件。 也就是说,无需进一步配置 Kubernetes 即可使用此实用程序。
- 适合您应用的不同管道。 您在开发时是否需要将代码部署到本地 Minikube,然后再进行阶段或生产? 为此目的有
型材 以及用户配置、环境变量和标志,它们允许您描述一个应用程序的不同管道。 - CLI。 仅 YAML 中的控制台实用程序和配置。 在互联网上,您可以找到尝试创建的参考资料
实验性图形用户界面 不过,目前这很可能只是意味着有人需要他,但并不是真的。 - 模块化。 Skaffold 不是一个独立的收割机,而是努力使用单独的模块或现有的解决方案来完成特定任务。
后者的说明:
- 在组装阶段您可以使用:
- docker 在本地、使用 kaniko 的集群中或在 Google Cloud Build 中构建;
- 本地巴泽尔;
- Jib Maven 和 Jib Gradle 本地或 Google Cloud Build 中;
- 自定义构建脚本在本地运行。 如果您需要运行另一个(更灵活/熟悉/...)构建解决方案,脚本中会对此进行描述,以便 Skaffold 启动它(
文档中的示例 )。 这允许您使用任何可以通过脚本调用的收集器;
- 在测试阶段,已经提到过
容器结构测试 ; - 对于部署,提供以下内容:
- 库贝克特;
- 舵;
- 定制。
正因如此,Skaffold 堪称独一无二 构建 CI/CD 的框架。 这是使用它时的示例工作流程(来自项目文档):
斯卡福德的作品总体来说是什么样的?
- 该实用程序监视源代码目录中的更改。 如果对文件进行修改,它们会与 Kubernetes 集群中的应用程序 pod 同步。 如果可能,无需重新组装图像。 否则,将组装一个新图像。
- 使用容器结构测试检查组装的镜像,标记并发送到 Docker 注册表。
- 之后,镜像就被部署了——部署在 Kubernetes 集群中。
- 如果启动是使用命令初始化的
skaffold dev
,然后我们开始从应用程序接收日志,Skaffold 等待更改以再次重复所有操作。
Skaffold 操作主要阶段图解
实践。 尝试斯卡福德
为了演示 Skaffold 的使用,我将举一个例子
安装脚手架:
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 # tree
.
├── leeroy-app
│ ├── app.go
│ ├── Dockerfile
│ └── kubernetes
│ └── deployment.yaml
├── leeroy-web
│ ├── Dockerfile
│ ├── kubernetes
│ │ └── deployment.yaml
│ └── web.go
├── README.adoc
└── skaffold.yaml
4 directories, 8 files
leeroy-app 和 leeroy-web 包含 Go 代码和用于在本地构建此代码的简单 Dockerfile:
~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .
我不会给出应用程序代码 - 知道这一点就足够了 leeroy-web
接受请求并将其代理给 leeroy-app
。 因此在文件中 Deployment.yaml
有一项服务仅用于 app
(用于内部路由)。 Pod 端口 web
我们会将其转发给我们自己以便快速访问该应用程序。
它看起来像什么 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 создает кластер в отдельной виртуальной машине, // придется проникнуть внутрь, чтобы найти образы # minikube ssh $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB
正如您所看到的,斯卡福德自己给这些图像添加了标签。 顺便说一句,支持多种标记策略。
- 进一步在配置中指出
context: ./leeroy-app/
, IE。 指定收集图像的上下文。 - 在部署阶段,我们确定将使用 kubectl 和掩码来获取必要的清单。
-
PortForward
:类似于我们通常使用的转发端口的方式kubectl port-forward
,我们指示 Skaffold 调用此命令。 在本例中,本地端口 9000 被转发到 Deployment 中的 8080,名称为leeroy-web
.
是时候启动了 skaffold dev
:团队将创建一个持续的“反馈循环”,即它不仅会收集所有内容并将其部署到集群,还会告诉您当前 pod 的状态、监视更改并更新 pod 的状态。
这是启动结果 skaffold dev --port-forward
重新组装时:
首先,您可以看到缓存正在被使用。 接下来,组装、部署应用程序并转发端口。 既然指定了 --port-forward
, Skaffold 将端口转发到 web
,正如他被问到的,但是在这里 app
他自行决定投掷(选择最近的免费投掷)。 此后,我们收到来自应用程序的第一个日志。
我们来看看它是否有效?
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!
修改文件 leeroy-app/app.go
- 几秒钟过去了...然后:
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!
与此同时,Skaffold 本身在控制台中显示的内容与之前相同,但有一点例外:它只推出了 leeroy-app
,而且不是一下子全部完成。
多练
还值得一提的是,在创建新项目时,可以使用以下命令引导 Skaffold 的配置 init
,非常方便。 另外,还可以写几个配置:在默认配置上进行开发,然后用命令roll to stage run
(与相同的过程 dev
,只是不监视更改),使用不同的配置。
在卡塔科达上有
Skaffold 的一种可能的用例是在远程集群上进行开发。 并不是每个人都愿意在自己的硬件上运行 Minikube,然后推出应用程序并期望它能够充分运行......在这种情况下,Skaffold 完美地解决了问题,这一点可以得到 Reddit 工程师的证实,例如,我们有已经讨论过了
而在
结论
Skaffold 是一个方便的工具,用于构建管道,涉及将应用程序部署到 Kubernetes,并且主要关注开发需求。 它使得创建考虑到开发人员的基本需求的“短”管道变得非常容易,但如果需要,您可以组织更大的流程。 作为在 CI/CD 流程中使用 Skaffold 的明显示例之一
Skaffold 在 GitHub 上已经拥有近 8000 多个 star,由 Google 开发,是
PS
另请阅读我们的博客:
- «
为 Kubernetes 上运行的应用程序开发人员提供的工具 “; - «
werf - 我们在 Kubernetes 中的 CI / CD 工具(概述和视频报告) “; - «
Garden v0.10.0:您的笔记本电脑不需要 Kubernetes “; - «
Kubernetes 提示和技巧:关于本地开发和网真 “。
来源: habr.com