热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

中小团队基于Docker的Devops实践

笔者所在的技术团队负责了数十个项目的开发和维护工作,每个项目都至少有dev、qa、hidden、product四个环境,数百台机器,在各个系统之间疲于奔命,解决各种琐碎的问题,如何

笔者所在的技术团队负责了数十个项目的开发和维护工作,每个项目都至少有dev、qa、hidden、product四个环境,数百台机器,在各个系统之间疲于奔命,解决各种琐碎的问题,如何从这些琐碎的事情中解放出来?devops成了我们不二的选择。



文章是基于目前的环境和团队规模做的devops实践总结,方案简单易懂,容易落地且效果显著。



实现方法

先来看下流程图:

image

工程师本地开发,开发完成后提交代码到代码仓库,[自动]触发jenkins进行持续集成与部署,部署完成会收到结果邮件。项目运行过程中可通过日志系统查看程序日志,有异常会触发监控系统发送报警。从编码到上线后结果反馈都可以工程师自主完成,形成完整闭环,运维则负责提供完整流程的工具链及协助异常情况的处理,工作量减少了,效率却高了。



  • 自动触发jenkins部署通过svn和git的hooks来实现,是否自动触发根据项目内部沟通决定,我们目前没有自动触发,原因是QA在测试的过程中不希望被自动触发的部署打断,不过也可以方便的在jenkins上手动触发执行

  • jenkins从svn拉代码 --> 编译 --> JS/CSS合并压缩 --> 其他初始化操作 --> 生成最终线上运行的代码包,通过Dockerfile打包成镜像上传到docker hub,然后触发kubernetes滚动更新

  • 镜像包含了基础镜像+项目代码,基础镜像就是根据项目运营环境打包的一个最小化的运行环境(不包含项目代码),根据项目依赖的技术栈不同我们打包了很多不通类型的基础镜像,例如包含nginx服务的基础镜像,包含jdk+tomcat的基础镜像

  • 如果发现程序上线出错或有bug短时间内无法解决,可通过jenkins快速回滚到上一镜像版本,十分方便

  • 如果发现流量突然增高,可以通过kubernetes快速调整容器副本数量


软件和工具

  • 代码管理:svn,git

  • 持续集成:jenkins,shell,python

  • Docker化:docker,harbor,kubernetes

  • 监控报警:zabbix,prometheus

  • 日志系统:filebeat,kafka,logstash,elasticsearch,kibana


代码管理

大部分项目还是通过svn来管理的,这里以svn为例说明,每个项目有3条代码线,dev、trunk、releases



  • dev: 本地开发,开发好一个功能或task就可以提交到dev分支,同时可部署到dev环境进行自测

  • trunk:当一个大的功能开发完成计划上线前合并代码到trunk分支,QA部署到trunk环境进行详细测试

  • releases:QA测试通过,项目即将上线,则将代码合并到releases分支,部署hidden环境(仿真环境,所有配置、代码等与线上保持一致)再次回归,回归通过,则上线product正式环境

有些项目是基于版本发布的,那么在代码合并到releases之后会通过branch/tag打个tag部署到hidden测试


持续集成

这一步主要工作是按照需求把源代码打包为最终线上跑的项目工程,大部分工作都有shell、python编写的脚本来完成,例如去svn拉代码、编译源代码、对静态资源文件合并压缩等等操作。利用jenkins将我们这么多分散的步骤串成一个完整的流程,运维对这一部分应该很熟悉了,不过多介绍

关于持续集成更详细的介绍可以查看以下这篇文章



  • 探秘varian:优雅的发布部署程序


Docker化

Docker是我们整个方案中很重要的一块,可以方便的进行部署,所有环境使用同一Docker镜像也保证了环境的统一,大大减少了开发环境运行正常,线上运行报错的情况出现,同时可根据项目负载情况实时调整资源占用,节约成本。



  • Dockerfile:通过编写dockerfile来打包镜像

  • harbor:充当docker hub镜像仓库的作用,有web界面和api接口,方便集成

  • kubernetes:kubernetes(k8s)将一个一个的Docker实例给整合成了集群,方便镜像下发、升级、回滚、增加或删除副本数量,同时也提供了ingress外网访问方式,这一块比较重,不过我们也没有用到太高级的功能,只是上边提到的一些基础功能,无需对k8s进行二次开发或定制,只是部署好了使用,对运维来说技术难度不大。


监控报警

监控报警在整个运维过程中非常重要,能未雨绸缪,减少故障的发生,加快故障的解决。这一块也是运维的基础不过多介绍了



  • zabbix:宿主机统一通过zabbix进行监控报警

  • prometheus:Docker容器的运行情况通过prometheus进行监控报警(目前还未完成)


日志系统

elk日志系统真是运维的福音,用了都说好,从此再也不用听开发给你说“xx,帮我拉下线上的日志”。我们使用的架构为filebeat/rsyslog --> kafka --> logstash --> elasticsearch --> kibana



  • filebeat/rsyslog:client端通过filebeat或者rsyslog来收集日志,filebeat是一个go开发的程序,部署起来非常方便,跟Docker简直绝配,我们Docker基础镜像里都默认起了一个filebeat服务初始化了配置文件,后边整合项目代码的时候不需要额外配置;使用rsyslog的好处是大部分系统自带了rsyslog服务,不需要额外安装一个程序来收集日志,但是rsyslog要传数据到kafka需要用到omkafka模块,omkafka对rsyslog版本有要求,大部分系统需要升级rsyslog版本很麻烦,就放弃了

  • kafka:kafka就是为处理日志类数据而生,我们采用3台机器做kafka集群,同时1个topic对应多个group,避免单点

  • logstash:作为为从kafka取数据,过滤之后写入elasticsearch。还在想为啥介绍kafka的时候说明1个topic对应多个group?主要是为了一个group对应一个logstash index,解决掉logstash这里的单点

  • elasticsearch:存储过滤之后的数据,同样采用了3个节点的集群,避免单点

  • kibana:可视化工具,方便的来搜索想要的数据,同事也做各种报表,一目了然

关于elk日志部分,我写有一个系列文章来介绍,这里摘录几篇感兴趣的点击查看



  • ELK日志系统之通用应用程序日志接入方案

  • Logstash读取Kafka数据写入HDFS详解

  • ELK架构下利用Kafka Group实现Logstash的高可用


总结

  1. 支持:要获得各方的支持,项目已经成功了一半,没有啥事一顿烧烤解决不了的,如果有就两顿

  2. 规范:众多的项目,庞大的系统,必须要有规范,规范是自动化的基础

  3. 文档:实施的详细过程、如何使用、怎么维护要保留有详细文档

  4. 培训:对于jenkins、elk非运维使用的工具要对使用者有相应的培训分享,当然运维内部也要分享项目的种种细节

扫码关注公众号查看更多实用文章



推荐阅读
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 利用Jenkins与SonarQube集成实现高效代码质量检测与优化
    本文探讨了通过在 Jenkins 多分支流水线中集成 SonarQube,实现高效且自动化的代码质量检测与优化方法。该方案不仅提高了开发团队的代码审查效率,还确保了软件项目的持续高质量交付。 ... [详细]
  • 在CentOS 7中部署Nginx并配置SSL证书
    本文详细介绍了如何在CentOS 7操作系统上安装Nginx服务器,并配置SSL证书以增强网站的安全性。适合初学者和中级用户参考。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 本文详细介绍了如何在Apache Kafka中进行Topic级别的配置,包括创建、修改和删除配置参数的具体步骤,并提供了详细的配置属性表。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 从运维繁忙到屡获殊荣:一位CIO的辉煌转型之路
    企业首席信息官(CIO)常常面临一个棘手的问题:如何有效推动公司的数字化转型?尽管数字化转型已成为企业未来发展的重要共识,但如何具体实施依然是许多CIO面临的重大挑战。在日常运营中,企业需要处理大量的业务问题和制定各种发展规划,这使得数字化转型往往被排在较低的优先级。此外,不断涌现的新问题和新规划也常常打乱原有的计划,进一步增加了转型的难度。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
author-avatar
手机用户2502875355
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有