Kubernetes开发的Skaffold审查



一年半之前,即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运行该程序( 示例来自文档 )。 这使您可以使用可以使用脚本调用的任何收集器。
  • 在测试阶段,已经提到的容器结构测试得到支持;
  • 提供部署:
    • Kubectl;
    • 头盔
    • kustomize。

因此,可以将Skaffold称为一种用于构建CI / CD框架 。 这是使用时的工作流程示例(来自项目文档):



Skaffold的作品总体上是什么样的?

  1. 该实用程序监视源目录中的更改。 如果对文件进行了修改,它们将与Kubernetes集群中的应用程序容器同步。 如果可能的话,不重新组装图像。 否则,将有一个新图像。
  2. 使用容器结构测试检查组装后的映像,将其标记并发送到Docker Registry。
  3. 之后,将部署映像-将其部署在Kubernetes集群中。
  4. 如果启动是使用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 # 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服务(用于内部路由)。 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      , //   ,    # 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 

    如您所见,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 # 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 ,而不是一次全部推出。

更多练习


值得一提的是,在创建新项目时,可以使用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的一部分-总的来说,目前,我们有理由相信该项目将在此后幸福地发展。

聚苯乙烯


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN474692/


All Articles