为 Kubernetes 上运行的应用程序开发人员提供的工具

为 Kubernetes 上运行的应用程序开发人员提供的工具

现代运营方法解决了许多紧迫的业务问题。 容器和编排器可以轻松扩展任何复杂性的项目,简化新版本的发布,使它们更加可靠,但同时它们也给开发人员带来了额外的问题。 程序员首先关心的是他的代码:架构、质量、性能、优雅——而不是它在 Kubernetes 中如何工作,以及如何在进行最小的更改后测试和调试它。 因此,积极开发 Kubernetes 工具也是很自然的事情,帮助解决即使是最“古老”的开发人员的问题,让他们能够专注于主要事情。

这篇评论提供了一些工具的简要信息,这些工具可以让代码在 Kubernetes 集群的 pod'ax 中运行的程序员的生活变得更轻松。

简单的助手

Kubectl-调试

  • 底线: 将容器添加到 Pod 并查看其中发生了什么.
  • GitHub上.
  • GH 简要统计数据:715 颗星、54 次提交、9 名贡献者。
  • 语言:去。
  • 许可证:Apache 许可证 2.0。

kubectl 的这个插件允许您在感兴趣的 pod 内创建一个额外的容器,它将与其他容器共享进程命名空间。 您可以在其中调试 pod 的操作:检查网络、监听网络流量、跟踪感兴趣的进程等。

您还可以通过运行切换到进程容器 chroot /proc/PID/root - 当您需要在清单中设置的容器中获取根 shell 时,这会非常方便 securityContext.runAs.

该工具简单有效,因此对每个开发人员都有用。 我们在中写了更多相关内容 单独的文章.

网真

  • 底线: 将应用程序传输到您的计算机。 本地开发和调试.
  • 网站 ; GitHub上.
  • GH 简要统计数据:2131 颗星、2712 次提交、33 名贡献者。
  • 语言:Python。
  • 许可证:Apache 许可证 2.0。

此管理单元的想法是在本地用户计算机上启动一个包含应用程序的容器,并代理集群与容器之间的所有流量。 这种方法允许您通过简单地在您喜欢的 IDE 中编辑文件来进行本地开发:结果将立即可用。

本地运行的优点是编辑方便、即时结果、能够以通常的方式调试应用程序。 缺点是它对连接速度要求很高,当您必须使用具有相当高 RPS 和流量的应用程序时,这一点尤其明显。 此外,Telepresence 在 Windows 上存在卷安装问题,这对于习惯该操作系统的开发人员来说可能是一个决定性的限制。

我们已经分享了使用网真的经验 这里.

同步

  • 底线: 代码与集群中的容器几乎瞬时同步.
  • GitHub上.
  • GH 简要统计数据:555 颗星、362 次提交、11 名贡献者。
  • 语言:去。
  • 许可证:Apache 许可证 2.0。

该实用程序允许您将本地目录的内容与集群中运行的容器的目录同步。 这样的工具非常适合脚本编程语言的开发人员,他们的主要问题是将代码交付到正在运行的容器。 Ksync 就是为了缓解这个头痛问题而设计的。

当通过命令初始化一次时 ksync init 集群中创建一个DaemonSet,用于监控所选容器的文件系统的状态。 开发人员在他的本地计算机上运行命令 ksync watch,它监视配置和运行 syncthing,直接与集群同步文件。

剩下的就是指示 ksync 同步什么内容。 例如,这个命令:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

...将创建一个名为的观察者 myproject它将搜索带有标签的 Pod app=backend 并尝试同步本地目录 /home/user/myproject/ 带目录 /var/www/myproject/ 在名为的容器中 php.

根据我们的经验,关于ksync的问题和注意事项:

  • 必须在 Kubernetes 集群节点上使用 overlay2 作为 Docker 的存储驱动程序。 该实用程序不能与任何其他实用程序一起使用。
  • 使用 Windows 作为客户端操作系统时,文件系统观察程序可能无法正常工作。 在处理大型目录(具有大量嵌套文件和目录)时会注意到此错误。 我们创造了 相关问题 在syncthing项目中,但目前还没有任何进展(自XNUMX月初以来)。
  • 使用文件 .stignore 指定不需要同步的路径或文件模式(例如,目录 app/cache и .git).
  • 默认情况下,只要文件发生更改,ksync 就会重新启动容器。 对于 Node.js 来说这很方便,但对于 PHP 来说这是完全没有必要的。 最好关闭 opcache 并使用该标志 --reload=false.
  • 配置始终可以在 $HOME/.ksync/ksync.yaml.

壁球

  • 底线: 直接在集群中调试进程.
  • GitHub上.
  • GH 简要统计数据:1154 颗星、279 次提交、23 名贡献者。
  • 语言:去。
  • 许可证:Apache 许可证 2.0。

该工具设计用于直接在 Pod 中调试进程。 该实用程序简单且交互式,允许您选择所需的调试器 (见下文) 还有namespace+pod,这个过程需要你介入。 目前支持:

  • delve - 用于 Go 应用程序;
  • GDB - 通过目标远程+端口转发;
  • 用于调试 Java 应用程序的 JDWP 端口转发。

在 IDE 方面,仅在 VScode 中提供支持(使用 扩张),但是,当前(2019)年的计划包括 Eclipse 和 Intellij。

为了调试进程,Squash 在集群节点上运行一个特权容器,因此您必须首先熟悉其功能 安全模式 以避免安全问题。

完整的解决方案

让我们继续讨论重炮——更“大规模”的项目,旨在立即满足开发人员的许多需求。

NB:在这个列表中,当然,我们的开源实用程序有一席之地 韦尔夫 (以前称为 dapp)。 然而,我们已经不止一次地写过并讨论过它,因此决定不将其包含在评论中。 对于那些希望更熟悉其功能的人,我们建议阅读/收听该报告“werf 是我们在 Kubernetes 中用于 CI/CD 的工具“。

开发空间

  • 底线: 适合那些想要开始在 Kubernetes 中工作,但又不想深入研究丛林的人.
  • GitHub上.
  • GH 简要统计数据:630 颗星,1912 次提交,13 名贡献者。
  • 语言:去。
  • 许可证:Apache 许可证 2.0。

同名公司的解决方案,为团队开发提供带有 Kubernetes 的托管集群。 该实用程序是为商业集群创建的,但与任何其他实用程序都可以很好地配合。

运行命令时 devspace init 在项目目录中,您将获得(交互式):

  • 选择一个工作的 Kubernetes 集群,
  • 利用现有的 Dockerfile (或生成一个新的)以基于它创建一个容器,
  • 选择用于存储容器镜像等的存储库。

完成所有这些准备步骤后,您可以通过运行命令开始开发 devspace dev。 它将构建容器,将其上传到存储库,将部署推出到集群,并启动端口转发以及容器与本地目录的同步。

(可选)系统会提示您将终端移动到容器中。 您不应该拒绝,因为实际上容器是通过 sleep 命令启动的,并且为了进行真正的测试,需要手动启动应用程序。

最后,团队 devspace deploy 将应用程序和相关基础设施部署到集群,之后一切都开始在战斗模式下运行。

所有项目配置都存储在一个文件中 devspace.yaml。 除了开发环境设置之外,您还可以在其中找到基础设施的描述,类似于标准 Kubernetes 清单,只是大大简化了。

为 Kubernetes 上运行的应用程序开发人员提供的工具
使用 DevSpace 的架构和主要阶段

此外,可以轻松地将预定义组件(例如 MySQL DBMS)或 Helm 图表添加到项目中。 阅读更多内容 文件资料 - 这并不复杂。

脚手架

  • 网站 ; GitHub上.
  • GH 简要统计数据:7423 颗星、4173 次提交、136 名贡献者。
  • 语言:去。
  • 许可证:Apache 许可证 2.0。

Google 的这个实用程序声称可以满足开发人员的所有需求,他们的代码将以某种方式在 Kubernetes 集群上运行。 开始使用它并不像 devspace 那么容易:没有交互性、语言检测和自动创建 Dockerfile 他们不会在这里向您提供。

但是,如果这没有吓到您,那么 Skaffold 允许您执行以下操作:

  • 跟踪源代码更改。
  • 如果不需要组装,请将其与 pod 容器同步。
  • 如果语言是解释型的,则收集带有代码的容器,或者编译工件并将其打包到容器中。
  • 使用以下命令自动检查生成的图像 容器结构测试.
  • 标记图像并将其上传到 Docker 注册表。
  • 使用 kubectl、Helm 或 kustomize 在集群中部署应用程序。
  • 执行端口转发。
  • 调试用 Java、Node.js、Python 编写的应用程序。

文件中声明性地描述了各种变体的工作流程 skaffold.yaml。 对于项目,您还可以定义多个配置文件,在其中可以部分或完全更改组装和部署阶段。 例如,对于开发,指定一个方便开发人员的基本映像,对于登台和生产 - 一个最小的映像(+使用 securityContext 容器或重新定义将部署应用程序的集群)。

Docker 容器可以在本地或远程构建: 谷歌云构建 或者在集群中使用 佳子。 还支持 Bazel 和 Jib Maven/Gradle。 对于标记,Skaffold 支持多种策略:通过 git commit hash、日期/时间、源的 sha256-sum 等。

另外,值得注意的是测试容器的可能性。 已经提到的容器结构测试框架提供了以下验证方法:

  • 在容器上下文中执行命令,跟踪退出状态并检查命令的文本输出。
  • 检查容器中是否存在文件并匹配指定的属性。
  • 使用正则表达式控制文件内容。
  • 图像元数据验证(ENV, ENTRYPOINT, VOLUMES 等等)。
  • 检查许可证兼容性。

与容器同步文件并不是以最优化的方式进行的:Skaffold 只是使用源创建一个存档,将其复制并在容器中解压(必须安装 tar)。 因此,如果您的主要任务是代码同步,那么最好寻求专门的解决方案(ksync)。

为 Kubernetes 上运行的应用程序开发人员提供的工具
Skaffold 运营的主要阶段

一般来说,该工具不允许您从 Kubernetes 清单中进行抽象,并且没有任何交互性,因此它可能看起来很难掌握。 但这也是它的优势——更大的行动自由。

花园

  • 网站 ; GitHub上.
  • GH 简要统计数据:1063 个 star,1927 个提交,17 个贡献者。
  • 语言:打字稿 (计划将项目拆分为多个组件,其中一些组件将使用 Go 语言,并制作一个 SDK,用于在 TypeScript/JavaScript 和 Go 中创建附加组件).
  • 许可证:Apache 许可证 2.0。

与 Skaffold 一样,Garden 的目标是自动化将应用程序代码交付到 K8s 集群的过程。 为此,您首先需要在 YAML 文件中描述项目结构,然后运行命令 garden dev。 她将施展所有魔法:

  • 收集包含项目各个部分的容器。
  • 进行集成和单元测试(如果有描述)。
  • 将所有项目组件推出到集群。
  • 如果源代码发生变化,它将重新启动整个管道。

使用此工具的主要目的是与开发团队共享远程集群。 在这种情况下,如果一些构建和测试步骤已经完成,这将显着加快整个过程,因为 Garden 将能够使用缓存的结果。

项目模块可以是一个容器、一个 Maven 容器、一个 Helm 图表、一个清单 kubectl apply 甚至是 OpenFaaS 函数。 此外,任何模块都可以从远程 Git 存储库中提取。 模块可以定义也可以不定义服务、任务和测试。 服务和任务可以具有依赖关系,因此您可以确定特定服务的部署顺序并组织任务和测试的启动。

Garden为用户提供了一个漂亮的仪表板(目前在 实验状态),它显示项目图:组件、装配顺序、任务和测试的执行、它们的连接和依赖关系。 在浏览器中,您可以查看所有项目组件的日志,并检查特定组件通过 HTTP 输出的内容(当然,如果为其声明了入口资源)。

为 Kubernetes 上运行的应用程序开发人员提供的工具
花园面板

该工具还具有热重载模式,只需将脚本更改与集群中的容器同步,大大加快应用程序调试过程。 花园里有一个不错的 文件 还不错 一组例子,让您快速习惯并开始使用。 顺便说一下,最近我们发布了 文章翻译 来自其作者。

结论

当然,用于在 Kubernetes 中开发和调试应用程序的工具列表并不限于此。 还有许多非常有用和实用的实用程序值得一提,即使不是单独的文章,至少也值得一提。 告诉我们您使用了什么,您遇到了什么问题以及您是如何解决的!

PS

另请阅读我们的博客:

来源: habr.com

添加评论