购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.6 基于容器的交付

在传统的软件交付中,通常会有专人(或兼职)做软件的实施、部署,除此之外的大部分人(研发、测试等)对运维细节都不了解,因此可能出现一个“有趣”的现象,面对一个庞大的软件工程,研发人员可能不知道如何在一个新的环境中部署、实施应用。

这种情况主要是由于软件工程本身非常复杂,涉及许多组件、中间件,服务之间有着相互依赖的关系,而且软件运行在不同的操作系统上会有大量不同的依赖软件包、配置文件等。因此,即使是熟练的实施人员可能也需要参考实施手册才能完成。

1.容器化交付

容器化技术很好地解决了由于操作系统之间的差异导致的大量的、复杂的、重复性的操作,使得研发人员可以专注在应用本身的开发上。

容器是轻量级的操作系统级虚拟化,可以在一个资源隔离的进程中运行应用及其依赖项。运行应用程序必需的组件都将打包成一个镜像,并可以复用。镜像执行时,它运行在一个隔离环境中,并且不会共享宿主机的内存、CPU和磁盘,这就保证了容器内进程不能监控容器外的任何进程,如图3-4所示。

img

图3-4 容器技术示意

流行的容器技术以Docker为代表,由Docker公司提供主流操作系统(Windows、macOS、Linux)的服务端(daemon)和客户端程序。除了有非常好用的命令行客户端,Docker还有可供广大技术人员免费使用的镜像托管网站,只需简单学习用于构建Docker镜像的Dockerfile文件语法即可走进容器技术的世界,就可以体验基于容器进行软件交付的便捷性。

以下是一个简单的Dockerfile示例:

img

相比于虚拟机技术,在一台服务器上可以同时运行大量的容器,而每个容器中除了业务应用,几乎不会有额外的资源开销,因而容器的启动耗时基本与启动一个应用本身相差无几。

鉴于容器技术的隔离(进程、网络、文件系统等)特性,在一台服务器上可以容易地同时运行多个应用实例。例如,应用服务Tomcat默认会占用8080端口并提供Web服务,通过容器启动的多个Tomcat实例之间的网络端口是互相隔离的,也就是说,不用处理端口冲突的问题。如果我们需要在多个容器之间共享网络,或者将部分端口暴露给Host服务器,就需要一些额外的配置。而且,容器技术的最佳实践是每个容器中只运行单一的业务进程,因此一个稍微复杂点的项目往往需要有多个容器配合使用。假如,一个前后端分离并需要访问数据库的应用可能至少需要同时运行三个容器才可以。

Compose是可以定义并运行多个容器的Docker应用,可以通过YAML文件配置应用服务,而且只需一条命令就可以启动所有的服务。

下面是一个docker-compose.yaml的示例:

img

我们可以通过如下命令启动或停止Compose服务:

img

2.云原生交付

在云原生技术的大潮流下,容器编排技术以Kubernetes为主要代表,不仅解决了基于容器技术部署时的应用编排问题,还提供了基础的负载均衡、高可用等非常实用的能力。Kubernetes基于声明式的异步执行系统,有非常强大的扩展能力,开发者只需根据规范提供自定义资源(Custom Resource Definition,CRD)和监听CRD的控制器(Controller),就可以在Kubernetes环境中实现一个云原生的应用,甚至增强Kubernetes的功能。

在SaaS上快速体验Kubernetes有很多选择,如Google Kubernetes Engine(GKE)、Azure Kubernetes Service(AKS)、Alibaba Cloud Container Service for Kubernetes(ACK)、QingCloud Kubernetes Engine(QKE)等。大部分Kubernetes云服务可以仅通过非常简单的步骤创建,尤其是涉及网络、存储等插件配置时。初次接触Kubernetes的用户不需一开始就掌握大量的概念,就可以快速体验Kubernetes的特性。

如果用户有一定的容器技术基础,并且喜欢动手实际操作,可以考虑在本地环境(或云主机)上亲自安装Kubernetes。有很多可选的安装工具,如Kubernetes社区官方提供的kubeadm,该工具主要是为了初始化一个Kubernetes集群,对于其他组件(如仪表盘控制面板、数据监控、云相关组件等),则需要参考相关文档完成。

除了可以用Kubeadm从零开始,还有其他更加便捷的方案。例如,Kubernetes in Docker(kind)是一种在单个Docker容器中即可运行整个Kubernetes集群的技术方案,在使用前需要安装并配置好Docker环境,才可以通过kind命令行完成集群的创建、查找、删除等操作。kind可以方便地创建并删除一个Kubernetes集群,并且仅运行在单个容器中,便于资源回收(主要体现在删除操作上),可以作为一个很好的基于Kubernetes开发的应用的开发、测试环境。但是,kind也有比较明显的缺点,由于它默认无法共享本地已经存在的镜像,集群所需的镜像都需要重新拉取,因此启动多个kind时会占用较多的存储空间。

以下是常用的kind命令:

img

Minikube是一种本地集群,主要用于学习和开发使用。Minikube可以运行在容器或者虚拟机中,如Docker、Hyperkit、Hyper-V、KVM、Parallels、Podman、VirtualBox或VMware Fusion/Workstation。

K3s是Rancher开源的一个Kubernetes发行版,最初由Rancher公司开源,现在是CNCF的沙箱项目,属于轻量级Kubernetes,主要应用于物联网(IoT)和边缘(Edge)场景。K3s整体打包为一个小于50 MB的二进制文件,默认采用轻量级的存储SQLite3,简化了外部依赖。根据官方文档描述,仅需30秒即可启动。此外,K3s非常适用于持续集成、开发测试等场景。

Kubernetes集群管理工具K9s是基于命令行终端的UI,用于管理Kubernetes集群,如图3-5所示,旨在使得定位、观察、管理、部署应用的操作变得更加容易。同样,该命令行工具可以在开发、测试等场景中方便地操作Kubernetes资源。

img

图3-5 K9s界面

Rancher是一个基于Kubernetes的开源容器管理平台,提供了DevOps等功能,如图3-6所示。

img

图3-6 Rancher架构

KubeSphere是一个开源的云原生分布式操作系统,以Kubernetes为内核,提供了多集群、边缘节点管理、可观测、日志、DevOps等企业级功能(如图3-7所示)。KubeSphere开源社区在国内有众多活跃的用户,以及围绕Kubernetes生态的一些开源项目,如用于Kubernetes集群的Kubkey、集群巡检工具Kubeeye等。

img

图3-7 KubeSphere架构

Helm是基于Kubernetes的包管理器,有大量应用打包成Helm chart的形式。Helm主要利用了Golang Template模板技术,可以包含应用部署在Kubernetes集群中所需的一切。Helm会把应用打包成一个压缩文件。

Kustomize也是一种模板技术(如图3-8所示),但不需打包成一个压缩文件,有更强的灵活性。

img

图3-8 Kustomize /6mCTGGgiy2R6z0mbXb9TJ8bjS6McyxgaS5zU/G2tGNfo2EcycAP1e/5+KhLy564

点击中间区域
呼出菜单
上一章
目录
下一章
×