美文网首页服务端技术想法@IT·互联网
科普|服务端应用部署(流程,技术栈、概念Docker、k8s)

科普|服务端应用部署(流程,技术栈、概念Docker、k8s)

作者: 蚍蜉一生 | 来源:发表于2024-06-19 16:02 被阅读0次

        应用部署指将软件产物开发环境复制到生产环境,并进行安装、配置和启用的过程,它包括了应用从打包制作完毕,到可使用状态(ready态)的所有工作内容
        军事部署也是如此,它是指将军队和军事资源从基地转移到战场,并进行武器调配、各种作战单位协同准备、战术安排等,包含了军队从日常训练态到战争态的一切准备活动。
        快、准、稳的部署能力是衡量一只军队作战实力的重要指标之一,服务端应用部署也是如此,下面是应用部署流程图:

    部署流程

    一、准备阶段

        在准备阶段,我们需要在开发环境中构建出在生产环境中可正常运行的软件产物,一般做法有以下几种:

    1. 保持开发环境和生产环境尽量一致:包括操作系统、CPU架构、各种预置软件和环境变量配置等。比如目前服务端开发最流行的模式————个人电脑远程连接一个开发机(Linux/x86),开发机和生产服务器使用一样的操作系统和CPU架构,保持同样的预置软件环境,这样在开发环境中开发软件,在生产服务器上兼容性也会比较好,不会因为个人电脑配置不同导致各种兼容问题,一般公司都是如此操作。

    2. 交叉编译:交叉编译(Cross Compilation)是指在一个平台上(主要指软件系统+CPU架构)生成另一个平台上可执行的二进制文件的过程,这个技术在需要为不同操作系统或硬件架构生成可执行文件时非常有用。开发者可以在Mac/ARM架构电脑上编译一个可以在Linux/x86服务器上运行的程序,也可以在x86架构的机器上编译一个可以在ARM架构的机器上运行的程序,Go就是支持交叉编译的,比如我们在Mac上写好一个go程序,需要运行在Linux服务器上,编译命令如下:

    // 指明操作系统是linux,cpu架构是amd64就是x86-64 
    GOOS=linux GOARCH=amd64 go build -o myproject-linux-amd64
    

        但交叉编译下,开发的应用没有在生产服务器相同或类似环境中运行过,直接上线有较大风险,一般公司不会这样做,一部分个人开发者、小公司迫于资源有限才会如此做。

    3. 容器化:容器化保证开发、测试和生产的环境一致性手段有三个:

    • 依赖和环境打包:容器镜像包含了应用程序运行所需的所有依赖项(库、工具、配置等),这样保证了在同一个系统、同一个CPU架构下 容器镜像在哪里都可以运行,无需配置其他软件环境。
    • 虚拟技术容器引擎启动的时候,如果当前系统不是容器镜像所依赖的的操作系统内核(比如Docker依赖Linux内核),则会启动一个轻量化的Linux虚拟机,然后该容器镜像就可以在该操作系统上运行。这保证了容器镜像的运行可以跨操作系统。
    • 容器的交叉编译:编译型语言程序运行不仅依赖操作系统,还依赖于CPU架构。前面两种方法解决了软件环境(操作系统、三方库依赖、环境变量配置)不一致问题,但CPU架构不同的时候,还是需要不同的容器镜像的,比如我们以mac为开发机,CPU是m2(arm架构),想构建出在linux/x86服务器上运行的docker镜像就要使用交叉编译
    docker buildx create --use
    // 使用docker构建了适合多个操作系统和cpu架构的镜像
    docker buildx build --platform linux/amd64,linux/arm64,windows/amd64 -t my-multi-arch-app .
    

    二、部署阶段

    2.1 软件产物传输和存储

         软件产物传输指将软件产物(比如go安装包、docker镜像)从开发机传送到生产服务器,这时候八仙过海各显神通,一般有点对点传输、中央仓库分发等方法:

    • 点对点传输:我们个人开发者可以用各种文件传输助手、即时通信工具把go安装包从开发机传送到生产服务器;公司可以自建传输通道,通过命令、图形操作等方式启动传输、并放置在固定目录;阿里云、百度云、华为云,这些云供应商也提供了远程桌面、控制台等方便的传输手段。
    • 中央仓库分发:使用docker时,打包后一般会将docker镜像通过dockerDesktop传输到docker中央仓库,然后在生产服务器上再次使用dockerDeskTop将docker镜像从中央仓库拉到本地进行安装运行。

    正式服稳定运行关系着公司的命脉,公司不会让所有开发者都有权限把软件产物从开发机传输到生产服务器,所以就有了权限管理、运维,CI/CD等。

    2.2 软件运行环境准备

        软件运行环境准备也叫配置,是指在生产服务器上准备好服务端应用能够正常运行的一切软硬环境,主要包括四种:

    1. 硬件配置:主要指CPU、内存、存储、网络等。硬件配置需要根据服务器的具体需求进行选择,例如,如果服务器需要运行高性能应用,则需要选择高性能的CPU和内存。硬件配置一般在项目开始就会准备好,实际部署的时候一般不用再次关注。
    2. 软件配置:包括操作系统更新、漏洞修复、依赖工具库安装(比如jdk、go环境、docker运行环境)、环境变量配置等等,这个一般在知道服务端应用软件类型后就会提前配置好。
    3. 网络配置:包括IP地址、子网掩码、网关、DNS服务器、负载均衡器配置等。
    4. 安全配置:包括防火墙、入侵检测系统、用户身份验证等。

    2.3 软件安装和启动运行

        软件安装就是将软件与操作系统建立关联的过程,这个过程涉及将软件的文件复制到适当的位置、配置系统以识别和正确执行该软件、为该软件设置必要的权限和依赖关系,使得软件能够在目标系统上正常运行,软件启动指软件进程启动运行。容器化简化了软件的安装和配置过程,并提供了进程的隔离,提升了系统的稳定性和安全性。

    2.4 配置动态调整

         一般来说,软件启动后,整个服务都运行起来了,为啥还需要配置调整呢?回想下日常服务端应用上线流程,在上线时候需要进行灰度发布、测试、测试出一些问题还需要修改代码、改配置等,还需要观察流量情况,进行负载均衡配置、最后一切OK了,还要关闭一些调试日志,进、全量正式发布。这些配置调整都是在应用程序在一个服务器上运行后进行,是为了确保应用软件能够在实际运行环境中正常工作,并能够满足性能、安全和可维护性的要求,所以配置调整可以算是部署的最后一个步骤,也是运维的开始。

         至此,部署流程介绍完毕,最后我们探讨下服务端部署一些常见问题:

    三、服务端部署常见问题

         除了服务端应用首次上线,其他大部分时候部署都是为了更新当前正在运行的程序,这就要求部署的时候:

    1. 尽量少影响旧版本服务的运行:这就是很多公司都选择凌晨上线原因,凌晨时候一般大家都在睡觉,可以使得对用户影响降到最低;除此之外一些大项目都是在多个服务器部署运行的,应用版本更新可以一个个或者一批批进行,不会造成整体宕机更新(这时候如果流量大可能会有访问慢的情况)。

    2. 部署速度要快:服务端应用运行在多个主机上,如果不能“同时”部署,就会出现同一个用户访问不同机器时候出现了业务逻辑不一致问题,所以尽量完成部署,这也是容器化(docker)出现的一个原因,容器化大大加快了部署的速度。

    3. 服务器实例管理和动态部署:服务上线后,用户访问量是会动态变化的。如果访问量超出了当前所有服务器的承载量,我们就需要增加新的服务器;如果业务萎缩,访问量减少,我们需要减少服务器来控制成本。这就是K8s(Kubernetes)等容器(服务器集群)管理平台出现原因,Kubernetes是一个应用程序,它可以监控接入服务的访问流量和负载、根据负载自动扩展或缩减容器实例数量、增加额外的监控日志和网络安全策略等等。

    相关文章

      网友评论

        本文标题:科普|服务端应用部署(流程,技术栈、概念Docker、k8s)

        本文链接:https://www.haomeiwen.com/subject/bmiqcjtx.html