一、介绍
DevSpace是一个开源的、用GO语言写的客户端命令行工具。DevSpace能够让开发团队在Kubernetes上无缝的构建应用、运行和扩展应用。DevSpace是下一代用于构建云原生的软件开发工具,能够帮助开发团队在Kubernetes上构建现代的、分布式的、高可用的微服务应用。
DevSpace具有的功能包含:①直接在Kubernetes内部构建、测试和调试应用。②热加载,不需要重建镜像和重启容器就能够更新运行时容器。③在团队内部以及垮开发、测试和生产统一部署流程。④自动化镜像构建和部署等重复任务。
二、架构
下面是DevSpace的架构图和工作流程。DevSpace作为一个单独的二进制命令行工具可以直接在计算机上运行,理想情况下,可以直接在IDE的终端上使用它。DevSpace不需要安装服务器端组件,因为它使用kube-context直接与Kubernetes集群通信,跟kubectl一样。
DevSpace的工作流程是:
①读取代码库根目录下的devspace.yaml文件,该文件存储了整个工作流程。
②使用构建工具如Docker、Kaniko进行镜像构建。
③将构建的镜像推送到镜像仓库。
④查找并使用kube-context。
⑤部署项目到Kubernetes集群中。
⑥开启Dev Mode。开发模式下为了提高开发效率,DevSpace提供了通过File Sync同步的热加载功能,不需要重新部署就可以更新容器;通过端口映射可以通过localhost访问容器;通过终端或Logs了解和控制容器;通过Remote Debugger在IDE端直接调试。
三、特性
DevSpace能够帮助开发人员不在那些重复的构建和部署任务上浪费时间,可以直接在Kubernetes内部自动化工作流程和构建云原生的应用。DevSpace具有以下特性:
1、使用devspace build自动化镜像的构建
2、使用devspace deploy自动化部署应用
3、使用devspace dev高效的集群内开发模式
4、使用devspace ui启动功能丰富的本地UI界面。在界面上查看流式日志、打开交互终端和开启端口映射等等。通过使用当前的kube-context完全在本地运行。
5、与Kubernetes交互的便捷命令。
- devspace enter打开一个交互终端会话窗口。
- devspace logs/devspace logs -f 快速显示实时的日志。
- devspace sync快速启动双向、实时的文件同步。
- devspace analyze能够分析容器崩溃、端点缺失、调度异常等问题并给出报告。
- devspace purge快速删除所有的helm charts,manifests等。
- devspace use context 显示上下文列表,选择当前上下文kube-context。
- devspace use namespace 显示命名空间的列表,设置默认的命名空间。
- devspace remove context 显示上下文的列表,选择删除kube-context。
6、强大的配置功能
- 声明式配置文件,可以与源码一起加入版本控制。
- 配置变量,在配置文件中可以通过参数进行设置,能够与其他团队共享一份配置文件。
- 配置覆盖,通过覆盖Dockerfile或ENTRYPOINT,来分离开发、预览和生产环境。
- 钩子,可以在每个构建或部署阶段之前或之后执行自定义的命令。
- 多配置,可以用在高级部署场景。
7、轻量级的、便捷的设置
- 只需要安装一个二进制客户端,不需要其他依赖。
- 完全用GO编写,能兼容各种平台。
- 能够自动生成配置文件,如Dockerfile、Helm chart或Kubernetes manifests。
四、安装
1、安装DevSpace
DevSpace支持多种平台安装,这里以Linux为准。
$ curl -s -L "https://github.com/devspace-cloud/devspace/releases/latest" | sed -nE 's!.*"([^"]*devspace-linux-amd64)".*!https://github.com1!p' | xargs -n 1 curl -L -o devspace && chmod +x devspace; $ sudo mv devspace /usr/local/bin;
2、下载样例项目
DevSpace支持多种类型的语言,如Node.js、Python、Golang、PHP、Ruby等,这里以Golang语言为例。
$ git clone https://github.com/devspace-cloud/quickstart-golang && cd quickstart-golang
3、初始化
初始化项目会创建配置文件devspace.yaml,这个文件会告诉DevSpace如何部署这个项目。执行命令进行初始化:
$ devspace init
创建好的devspace.yaml文件内容如下:
4、选择Kubernetes集群
选择这个项目部署上去的集群,这里选择搭建的minikube集群环境,也可以使用其他云平台。使用如下命令告诉DevSpace要使用哪个命名空间。
# Tell DevSpace which namespace to use (will be created automatically during deployment) $ devspace use namespace my-namespace
这里使用minikube里的default命名空间。
5、部署
注意:由于在部署时会拉取golang.org地址下载的依赖包,在Dockerfile里需要指定GOPROXY的环境变量。
Dockerfile里添加这两个环境变量:
# set go proxy ENV GO111MODULE on ENV GOPROXY https://goproxy.io
执行如下命令进行部署。
$ devspace deploy
查看default命名空间下的pod,可以看出这个项目已经处于Running状态。
6、浏览器查看
执行如下命令可以在浏览器中打开这个应用。
$ devspace open
会自动打开浏览器,可以看到当前程序已经在起来了。
7、开发模式
项目一旦成功部署到Kubernetes集群后,就可以启动开发模式,使用终端代理、端口转发和实时代码同步直接在Kubernetes集群内部进行编码。执行如下命令:
$ devspace dev
执行后,可以通过http://localhost:PORT在浏览器中访问服务。当修改源码后,DevSpace会自动同步变更的问题就到Kubernetes容器中。这里用到的是nodemon这种热加载的工具来保证更新变动的文件。在实际执行的时候,报错如下,目前在github上提了issue,有了解的也请指导一下!!!
8、开发界面
如果devspace dev执行成功,会启动一个开发界面,端口是8090,也可以运行devspace ui命令启动这个界面。
开发界面会显示当前开发环境所在的KubeContext和Namespace,能够开发Web Terminal进入当前项目的容器、显示devspace.yaml文件内容,方便开发人员查看和调试。
五、总结
DevSpace的设计更加的巧妙,并且DevSpace能适配多种构建工具与部署工具,DevSpace提供的命令行命令也非常齐全,并且也支持IDE中的Terminal,如ATOM、VS Code和Eclipse。DevSpace的同步机制是本地文件与运行在Kubernetes中的容器内部的文件同步,并使用热加载技术在不重启容器的情况下更新变更的代码,真正可以做到持续不断的开发、调试。
DevSpace也多种方式划分不同的开发阶段,如果Dev、Staging 和Production。在构建阶段,可以通过不同的Dockerfile划分,可以使用相关的Dockerfile不同的ENTRYPOINT划分。在部署阶段,可以使用不同的命令或参数,可以使用不同的镜像名称或标签,可以使用不同的环境变量。不管你有什么样的需求,DevSpace都有一个方案为你解决,DevSpace值得一试。
之前开发人员开发完成之后,还能在等待部署的环节休息一会,喝杯咖啡,现在好了,代码实时同步,实时部署,无缝集成,抽空喝咖啡的时间也没有了,哈哈。不过话说回来,开发工具提高了开发人员的效率,之前一天干完的工作,现在半天就搞定了,是不是可以放半天假呢,希望在未来能够实现。
工欲善其事,必先利其器!