DevSpace是一款开源工具,可帮助开发人员快速将云原生应用部署到 Kubernetes 集群。它抽象了许多传统的 Kubernetes 复杂性,因此您可以重新编写代码。
DevSpace 与平台无关,适用于从本地机器到流行的托管公共服务的集群。该工具是一个 CLI,可使用 Kubernetes API 自动执行操作。您无需在集群中安装任何东西即可使用 DevSpace。
Kubernetes 的现代开发实践
DevSpace 为基于 Kubernetes 的部署带来了现代应用程序编程体验的许多方面。它允许您在集群上运行开发环境,并支持自动热重载。当本地文件发生更改时,DevSpace 会使用新内容自动更新您的容器。
内置端口转发意味着您可以使用它localhost来访问您的部署。您无需在开发集群上打开端口或设置 HTTP Ingress,从而提供改进的开发人员体验和更高的安全性。
DevSpace 也有助于调试。它支持使用远程调试器工具设置断点,提供对云中容器化应用程序的实时检查。查看容器的日志或启动终端会话也很容易,而无需运行笨拙的 Kubectl 命令。
运行的 Web 界面localhost可让您监控正在运行的应用程序并与之交互。如果您更喜欢视觉体验,则可以完全退出终端。
安装开发空间
DevSpace 作为独立的二进制文件分发,可在 Windows、Mac 和 Linux 系统上运行。有几个安装选项可用。以下是下载适用于 Linux 的 DevSpace 并将 CLI 添加到您的路径的推荐命令:
dev
sudo install devspace /usr/local/bin
或者,您可以使用 Node 包管理器 npm 来安装和更新 DevSpace:
npm install -g devspace
devspace如果您已经安装了 npm,此命令将为您提供路径中的功能。
DevSpace 以KUBE_CONTEXT与 Kubectl 和 Helm 等其他生态系统工具相同的方式使用您的活动“ ”。设置KUBECONFIG为定义集群连接的 Kubectl 兼容配置文件:
export KUBECONFIG=/path/to/kubeconfig.yaml
# Uses $KUBECONFIG
devspace deploy
## 创建项目
使用 DevSpace 构建的第一步是初始化您的项目目录。这将创建一个devspace.yaml文件,其中包含存储库的 DevSpace 配置。
```cpp
devspace init
系统将提示您选择您计划使用的部署例程。在将您的应用程序启动到集群中时,DevSpace 可以与 Kubectl、Helm 或 Kustomize 配合使用。
建议的QUICKSTART选项是一个特殊的图表,可让您定义应用程序的组件,例如前端 Web 服务器、后端 API 服务器和数据库,而不是提供手动创建的 Helm 图表或 Kubectl 清单。如果您正在构建具有传统结构的系统并且不想花时间创建自己的 Kubernetes 资源,请使用此选项。
按照提示为 DevSpace 提供 Dockerfile 的路径。您需要提供注册表身份验证和一些有关您的图像的基本信息,例如它侦听的端口。DevSpace 将自动生成一个随时可用的配置,让您运行devspace deploy以在 Kubernetes 上运行您的应用程序。
如果您不使用快速入门选项,则需要提供 Helm 图表或 Kubernetes 清单的路径。按照提示构建初始配置。退出设置向导后,您可以通过手动编辑devspace.yaml文件继续添加额外的图像和部署。
添加图像
DevSpace 项目是从一个或多个容器镜像构建的。要在项目中注册图像,请将其添加到文件中的images键下devspace.yaml:
images:
app:
image: example.com/example/image:latest
dockerfile: ./Dockerfile
build:
disabled: true
该image字段定义图像标记名称。该dockerfile字段是可选的;设置后,它应该引用项目中图像的 Dockerfile 的路径。与Dockerfiles图像将自动被建立devspace build和devspace deploy命令,除非build.disabled是true在图像的配置。
图像并行构建以提高性能。该–build-sequential标志强制图像按照指定的顺序单独构建。构建完成后,DevSpace 将自动将每个映像推送到其各自的注册表。
除非 DevSpace 在其 Dockerfile 或其构建上下文中的文件中检测到更改,否则不会自动重建图像。您可以使用该–force-build标志强制重建所有已配置的映像。
添加部署
a 的第二部分devspace.yaml是您的deployments. 这些定义了将在您的集群中创建的资源。
deployments:
- name: "helm chart"
helm:
chart:
name: example/example-app
values:
VARIABLE_OVERRIDE: "new-value"
- name: "kubectl manifests"
kubectl:
manifests: - .kube/manifests
该文件定义了两个单独的部署,一个使用 Helm,另一个使用 Kubectl。当您运行 时devspace deploy,Helm 图表和您的 Kubectl 清单都将安装在您的集群中。
重复该deploy命令将更新您的部署。DevSpace 仅重新部署更改的组件,除非使用该–force-deploy标志。
由于 DevSpace 跨集群工作,因此将您的部署从开发提升到生产是更改KUBECONFIG环境变量并重新运行devspace deploy. 这为您提供了一个统一的机制来管理系统的多个独立部署。
使用配置文件
DevSpace 支持允许您修改devspace.yaml每个环境的部分的配置文件。每个命名的配置文件都可以替换、合并和修改配置文件中的字段。
配置文件本身也在您的devspace.yaml:
images:
api-server:
image: example.com/api-server:latest
web-server:
image: example.com/web-server:latest
debug:
image: example.com/debug-tool:latest# ... omittedprofiles:
- name: production
patches:
- op: remove
path: images.debug
通过将-p或–profile标志传递给 DevSpace 命令来激活配置文件。以下是使用production上面定义的配置文件启动部署的方法。部署将不包括debug图像,因为它已被配置文件的补丁之一删除。
devspace deploy --profile production
使用热重载
通过设置文件同步启用热重载功能:
dev:
sync:
- imageSelector: example.com/api-server:latest
localSubPath: ./api/
containerPath: /var/www/html
excludePaths: - vendor/
dev在您的 中添加密钥作为顶级字段devspace.yaml,然后用于sync在每个图像的基础上配置热重载。该imageSelector比赛图像标签应用热重载规则。从文件localSubPath在您的工作目录将被同步到containerPath在部署容器实例。
通过运行devspace dev或启动热重载会话devspace sync。在前者的命令启动所有DevSpace的开发环境功能,包括端口转发和实时日志流。
热重载默认替换现有容器中的文件。这类似于在使用本地容器实例时使用 Docker 卷和绑定挂载。在某些情况下,您可能希望在文件系统更改时启动新的 DevSpace 部署。这是通过单独的autoReload选项实现的:
images:
api:
image: example.com/api-server:latestdeployments:
- name: api-deployment # ... omitteddev:
autoReload:
paths: - ./kernel/*
images: - example.com/api-server:latest
deployments: - api-deployment
api-deployment只要本地kernel目录中的文件发生更改,此示例就会重新部署。当您修改需要通过构建过程运行的文件以使它们对您的容器有用时,这是理想的选择。
转发端口
端口转发是通过dev.ports您的devspace.yaml. 还支持反向转发,让localhost容器中的地址映射到本地机器上的端口。
dev:
ports:
- imageSelector: example.com/api-server:latest
forward:
- port: 8080
remotePort: 80
reverseForward:
- port: 9000
remote: 9000
此示例localhost:8080在您的机器上设置转发到运行example.com/api-server映像的容器中的端口 80 。还有一个反向转发,它将容器内的流量引导localhost:9000回您机器上的端口 9000。
其他特性
除了此处介绍的功能外,DevSpace 还支持其他几个功能组,让您可以监控部署、与容器交互以及配置高级开发工作流:
自动终端启动让您每次运行devspace dev.
当您进入开发模式时,自动打开 URL 会在您的浏览器中启动网站和 Web 应用程序。
可配置的日志记录定义了哪些容器应该出现在开发模式日志流中。
自定义命令充当常用操作的快捷方式,帮助新团队成员与您的部署进行交互,而无需学习 Kubectl 中冗长的流程。
钩子在部署过程中运行命令,让您手动配置容器或将新部署记录到集中监控服务。
用户界面在开发模式下自动运行devspace dev,可以在浏览器中使用devspace ui.
DevSpace 还提供可以为系统添加更多功能的插件。插件 API 支持从远程 URL 或本地脚本安装,并促进新命令、钩子和变量。开发您自己的插件提供了一种标准化您在多个独立项目中使用 DevSpace 的方法。
CI/CD 管道中的部署
DevSpace 可以将生产部署作为CI/CD 管道的一部分进行处理。如果您在命令中包含显式选择器(例如标签),它会提供官方 Docker 映像并支持非交互式使用-l。
CI 管道内的部署可能如下所示:
echo $KUBECONFIG_CI_VARIABLE > /path/to/kubeconfig
export KUBECONFIG=/path/to/kubeconfig
devspace deploy --profile production --timeout 60 --wait --skip-build
这将使用productionDevSpace 配置文件部署您的应用程序。该–skip-build标志指示 DevSpace 不要构建您的图像。构建通常应该在管道的早期作为一个单独的阶段进行处理。
该–wait标志强制 DevSpace 等待在您的 中指定的 Pod 计数可用devspace.yaml,而不是在您运行命令后立即终止。这更适用于您希望确认工作负载处于活动状态的 CI 环境。允许 DevSpace 无需等待就退出可能意味着即使存在部署问题,您的管道也会被标记为成功。
结论
DevSpace 作为面向开发人员的 Kubernetes 部署工具,为关键操作提供有用的抽象,越来越受到关注。它减少了将容器启动到集群中所需的 YAML 数量,将其替换为定义、构建和启动映像的简单配置键和终端命令。
作为一种平台和环境无关的工具,DevSpace 使开发人员不必担心单个集群的独特特征。无论部署目标如何,整体体验都类似于在本地机器上构建传统系统。通过将概念映射回更普遍理解的开发实践,这有助于缓和 Kubernetes 的学习曲线。