
现代的运营方法解决了许多紧迫的业务问题。 容器和协调器使扩展任何复杂性的项目变得容易,简化了新版本的发布,使其更加可靠,但同时也给开发人员带来了其他问题。 首先,程序员关心的是他的代码:体系结构,质量,性能,优雅,而不是他去Kubernetes的方式以及在进行最小的改动后如何对其进行测试和调试。 因此,很自然地,Kubernetes的工具正在积极开发,这有助于解决甚至最“古老”的开发人员的问题,并使他们专注于主要问题。
这篇评论总结了一些工具,这些工具使代码在pod'ax Kubernetes集群中旋转的程序员的工作更加轻松。
简单的助手
Kubectl调试
- 最重要的是: 将您的容器添加到Pod,然后查看其中发生了什么 。
- Github
- GH的简要统计:715星,54次提交,9位贡献者。
- 语言:开始。
- 许可证:Apache许可证2.0。
这个kubectl插件允许您在您感兴趣的pod内创建一个额外的容器,该容器将与其余容器共享流程名称空间。 可以调试其中的Pod的工作:检查网络,侦听网络流量,跟踪感兴趣的过程等。
您还可以通过运行
chroot /proc/PID/root
切换到进程容器-当您需要在清单中设置了
securityContext.runAs
的容器中获取根shell时,这非常方便。
该工具简单有效,因此对每个开发人员都非常有用。 我们在
另一篇文章中写了更多有关它的
内容 。
网真
- 最重要的是: 将应用程序传输到您的计算机。 本地开发和调试 。
- 网站 ; Github
- GH的简要统计信息:2131星,2712次提交,33个贡献者。
- 语言:Python。
- 许可证:Apache许可证2.0。
此管理单元的想法是在本地用户计算机上使用应用程序启动容器,并代理从群集到群集的所有流量,反之亦然。 这种方法允许您在本地进行开发,只需在您喜欢的IDE中更改文件即可:结果将立即可用。
本地启动的优点是方便编辑和即时结果,以及以常规方式调试应用程序的能力。 缺点是要求的连接速度,当您必须使用具有相当高的RPS和流量的应用程序时,这一点尤其明显。 此外,网真在Windows上的卷挂载方面存在问题,对于习惯于此操作系统的开发人员而言,这可能是决定性的限制因素。
我们已经
在这里分享了使用网真的经验。
同步
- 最重要的是: 与集群中的容器几乎即时进行代码同步 。
- Github
- GH的简要统计:555星,362次提交,11个贡献者。
- 语言:开始。
- 许可证:Apache许可证2.0。
该实用程序允许您将本地目录的内容与集群中运行的容器的目录同步。 对于以脚本编写编程语言编写脚本的开发人员来说,这种工具是完美的,其主要问题是将代码传递到工作容器中。 Ksync旨在缓解这种头痛。
使用
ksync init
命令初始化一次后,将在集群中创建一个
ksync init
,该
ksync init
程序用于监视所选容器的文件系统的状态。 开发人员在他的本地计算机上运行
ksync watch
,该
ksync watch
监视配置并运行
syncthing ,该命令直接将文件与集群同步。
仍然要指示ksync与之同步以及与之同步。 例如,如下命令:
ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/
...将创建一个名为
myproject
的观察程序,该监视
app=backend
将查找标签为
app=backend
的Pod,并尝试在名为
php
的容器中将本地目录
/home/user/myproject/
与目录
/var/www/myproject/
进行同步。
根据我们的经验,关于ksync的问题和注意事项:
- 在Kubernetes集群的节点上,应当使用
overlay2
作为Docker的存储驱动程序。 该实用程序不能与其他任何程序一起使用。 - 当使用Windows作为客户端OS时,观察程序文件系统可能无法正常工作。 使用大型目录(包含大量文件附件和目录)时,会注意到此错误。 我们在同步项目中创建了一个相应的问题 ,但是到目前为止(自7月初开始)没有任何进展。
- 使用
.stignore
文件来指定不需要同步的路径或文件模板(例如, app/cache
和.git
)。 - 默认情况下,每次修改文件时,ksync都会重新加载容器。 这对于Node.js来说很方便,但是对于PHP来说完全多余。 最好关闭opcache并使用
--reload=false
标志。 - 该配置始终可以在
$HOME/.ksync/ksync.yaml
进行固定。
壁球
- 最重要的是: 在集群中调试进程 。
- Github
- GH简介:1154星,279次提交,23个贡献者。
- 语言:开始。
- 许可证:Apache许可证2.0。
该工具旨在直接在Pod中调试过程。 该实用程序很简单,并且可以交互方式允许您选择所需的调试器
(请参见下文)和名称空间+ Pod,并在其中进行干预。 目前支持:
- 深入研究-适用于Go上的应用;
- GDB-通过目标远程+端口转发;
- JDWP端口转发,用于调试Java应用程序。
在IDE方面,仅在VScode中提供了支持(借助于
扩展 ),但是,当前(2019年)的计划包括Eclipse和Intellij。
要调试过程,Squash在群集节点上运行特权容器,因此必须首先熟悉
安全模式的功能,以避免安全问题。
综合解决方案
我们转向重型火炮-更多“大型”项目,旨在立即满足开发人员的许多需求。
注意 :我们的清单肯定在我们的开源werf实用程序(以前称为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 deploy
到集群中,然后一切开始以战斗模式运行。
项目的整个配置存储在
devspace.yaml
文件中。 除了用于开发的环境设置之外,您还可以在其中找到基础架构的描述,类似于标准的Kubernetes清单,只是大大简化了。
DevSpace的架构和里程碑另外,很容易将预定义的组件(例如MySQL DBMS)或Helm图表添加到项目中。 在
文档中阅读更多
内容 -这很简单。
脚手架
- 网站 ; Github
- GH的简要统计数据:7423颗星,4173个提交,136个贡献者。
- 语言:开始。
- 许可证:Apache许可证2.0。
Google的这个实用程序声称可以满足开发人员的所有需求,这些开发人员的代码将以某种方式在Kubernetes集群中运行。 开始使用它并不像devspace那样简单:不会为您提供任何交互性,语言定义或自动
Dockerfile
。
但是,如果不感到害怕-这是Skaffold允许您执行的操作:
- 跟踪源代码更改。
- 如果不需要组装,则将其与容器容器同步。
- 如果对语言进行了解释,请使用代码收集容器,或者编译工件并将其打包到容器中。
- 使用container-structure-test自动检查生成的图像。
- 标记图像并将其上传到Docker Registry。
- 使用kubectl,Helm或kustomize在群集中部署应用程序。
- 做端口转发。
- 调试用Java,Node.js,Python编写的应用程序。
skaffold.yaml
文件中声明性地描述了各种变体中的工作流。 对于项目,您还可以定义几个概要文件,以在其中部分或完全更改组装和部署阶段。 例如,对于开发,请指定一个对开发人员以及阶段和生产都很方便的基本映像-最小(+对容器使用
securityContext
或重新定义将在其中部署应用程序的群集)。
可以在本地或远程构建Docker容器:在
Google Cloud Build或使用
Kaniko的集群中。 还支持Bazel和Jib Maven / Gradle。 对于标记,Skaffold支持许多策略:通过git commit hash,日期/时间,sha256源总数等。
另外,值得注意的是可以测试容器。 已经提到的容器结构测试框架提供了以下验证方法:
- 在容器的上下文中执行命令,并跟踪出口状态并检查命令的文本“精疲力竭”。
- 检查容器中是否存在文件以及指定的匹配属性。
- 文件内容的正则表达式控制。
- 验证图像元数据(
ENV
, ENTRYPOINT
, VOLUMES
等)。 - 检查许可证兼容性。
文件不是以最佳方式与容器同步的:Skaffold只是使用源创建了一个存档,将其复制并解压缩到容器中(必须安装tar)。 因此,如果您的主要任务是同步代码,则最好寻求专门的解决方案(ksync)。
脚手架的里程碑通常,该工具不允许从Kubernetes清单中进行抽象,并且不具有任何交互性,因此似乎很难掌握。 但这也是它的优点-很大的行动自由。
庭园
- 网站 ; Github
- GH的简要统计信息:1063星,1927年提交,17个贡献者。
- 语言:TypeScript (计划将项目分为几个组件,其中一些将在Go上,以及制作一个用于在TypeScript / JavaScript和Go上创建附加组件的SDK) 。
- 许可证:Apache许可证2.0。
与Skaffold一样,Garden旨在自动化将应用程序代码交付到K8s集群的过程。 为此,必须首先在YAML文件中描述项目结构,然后运行
garden dev
命令。 她会尽一切努力:
- 将收集项目各个部分的容器。
- 如果有描述,将进行集成和单元测试。
- 将所有项目组件部署到集群。
- 如果源代码更改,它将重新启动整个管道。
使用此工具的主要重点是由一组开发人员共享远程群集。 在这种情况下,如果组装和测试的某些阶段已经完成,这将大大加快整个过程,因为Garden可以使用缓存的结果。
项目模块可以是容器,Maven容器,Helm图表,
kubectl apply
的清单
kubectl apply
甚至可以是OpenFaaS函数。 而且任何模块都可以从远程Git存储库中提取。 模块可以确定(或可能不是)服务,任务和测试。 服务和任务可以具有依赖关系,因此您可以确定服务的部署顺序,组织任务和测试的启动。
Garden为用户提供了一个漂亮的仪表板(仍处于
实验状态 ),其中显示了项目图:零部件,装配顺序,任务和测试,它们之间的关系和依赖性。 直接在浏览器中,您还可以查看所有项目组件的日志,通过HTTP检查该组件或该组件显示的内容(当然,除非为其声明了入口资源)。
花园板该工具还具有热重载模式,该模式可以简单地将脚本更改与群集中的容器同步,从而极大地加快了应用程序的调试过程。 Garden拥有良好的
文档和
大量的示例 ,可帮助您快速入门和开始使用。 顺便说一下,最近,我们发表了作者
的文章翻译 。
结论
当然,在Kubernetes中用于开发和调试应用程序的工具列表不受限制。 如果没有单独的文章,那么还有很多非常有用的实用工具值得一提,至少值得一提。 告诉我们您使用什么,遇到什么问题以及如何解决它们!
聚苯乙烯
另请参阅我们的博客: