用于 Kubernetes 开发的 Skaffold 回顾

用于 Kubernetes 开发的 Skaffold 回顾

一年半前,即 5 年 2018 月 XNUMX 日,Google 发布了 CI/CD 开源项目的第一个 alpha 版本,名为 脚手架其目标是创建“简单且可重复的 Kubernetes 开发”,以便开发人员可以专注于开发而不是管理。 Skaffold 有什么有趣的地方? 事实证明,它有一些技巧可以使其成为开发人员甚至运营工程师的强大工具。 让我们熟悉一下该项目及其功能。

NB:顺便说一句,我们已经在我们的通用中简要讨论过 Skaffold 开发者工具审查,他们的生活与 Kubernetes 息息相关。

理论。 目的和能力

因此,一般来说,Skaffold 解决了 CI/CD 周期(在构建、推送、部署阶段)自动化的问题,为开发人员提供及时的反馈,即能够快速接收后续代码更改的结果 - 以在 Kubernetes 集群中运行的更新应用程序的形式。 它可以在不同的电路(开发、阶段、生产...)中工作,为此 Skaffold 帮助描述了相应的部署流程。

Skaffold的源代码是用Go编写的, 分发者 根据免费的 Apache License 2.0 (GitHub)。

我们来看看主要功能和特点。 第一个包括以下内容:

  • 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 开发的 Skaffold 回顾

斯卡福德的作品总体来说是什么样的?

  1. 该实用程序监视源代码目录中的更改。 如果对文件进行修改,它们会与 Kubernetes 集群中的应用程序 pod 同步。 如果可能,无需重新组装图像。 否则,将组装一个新图像。
  2. 使用容器结构测试检查组装的镜像,标记并发送到 Docker 注册表。
  3. 之后,镜像就被部署了——部署在 Kubernetes 集群中。
  4. 如果启动是使用命令初始化的 skaffold dev,然后我们开始从应用程序接收日志,Skaffold 等待更改以再次重复所有操作。

用于 Kubernetes 开发的 Skaffold 回顾
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 # 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 重新组装时:

用于 Kubernetes 开发的 Skaffold 回顾

首先,您可以看到缓存正在被使用。 接下来,组装、部署应用程序并转发端口。 既然指定了 --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,只是不监视更改),使用不同的配置。

在卡塔科达上有 领导 举个例子就更容易了。 但它提供了一个带有 Kubernetes、应用程序和 Skaffold 的现成沙箱。 如果您有兴趣亲自尝试基础知识,这是一个不错的选择。

Skaffold 的一种可能的用例是在远程集群上进行开发。 并不是每个人都愿意在自己的硬件上运行 Minikube,然后推出应用程序并期望它能够充分运行......在这种情况下,Skaffold 完美地解决了问题,这一点可以得到 Reddit 工程师的证实,例如,我们有已经讨论过了 писали 在我们的博客中。

而在 本出版物 您可以从 Weaveworks 找到创建生产管道的示例。

结论

Skaffold 是一个方便的工具,用于构建管道,涉及将应用程序部署到 Kubernetes,并且主要关注开发需求。 它使得创建考虑到开发人员的基本需求的“短”管道变得非常容易,但如果需要,您可以组织更大的流程。 作为在 CI/CD 流程中使用 Skaffold 的明显示例之一 给出 这样 测试项目 使用 Kubernetes、gRPC、Istio 和 OpenCensus Tracing 功能的 10 个微服务。

Skaffold 在 GitHub 上已经拥有近 8000 多个 star,由 Google 开发,是 Google容器工具 ——总的来说,目前有充分的理由相信该项目将永远幸福地发展。

PS

另请阅读我们的博客:

来源: habr.com

添加评论