61
UnitedStack 余兴超 [email protected] OpenStack 持续交付之路 15年3月24星期

OpenStack 持续交付之路 - Meetupfiles.meetup.com › 10602292 › Openstack Continous Delivery Way.pdf · OpenStack 持续交付之路 15年3月24星期. CI&CD • 持续集成系统(Continuous

  • Upload
    others

  • View
    34

  • Download
    0

Embed Size (px)

Citation preview

UnitedStack 余兴超

[email protected]

OpenStack持续交付之路

15年3月24⽇日星期⼆二

CI&CD• 持续集成系统(Continuous Integration,CI)

• ⾯面向所有⼯工程师

• 借助⼯工具辅助开发流程的严格执⾏行

• 持续交付系统(Continuous Deliver,CD)

• ⾯面向DevOps⼯工程师

• 借助⼯工具辅助部署流程的严格执⾏行

15年3月24⽇日星期⼆二

问题和挑战

15年3月24⽇日星期⼆二

项⺫⽬目众多

OpenStack Services

• Nova,Glance,Keystone,Neutron,Cinder,Ceilometer,Swift,Trove,Manila,Designate,Sahara…

15年3月24⽇日星期⼆二

项⺫⽬目众多

UnitedStack Services

• Placebo,Kiki,Ticket,Gringotts,Lotus,Vmmanager,Gondor,tars,keystonering…

15年3月24⽇日星期⼆二

项⺫⽬目众多

Base Services

• RabbitMQ,MySQL,Apache,Nginx,Haproxy,Keepalived,Bind,Ntp,Puppet,Nscd,Networks…

15年3月24⽇日星期⼆二

依赖复杂

安装Nova服务

• 需安装13个与Nova服务相关的软件包

• 需安装163个依赖包

• 需升级9个依赖包

• 并且⼤大多数依赖包有严格的版本要求

15年3月24⽇日星期⼆二

配置⽂文件和选项繁多Nova Juno Branch

• nova.conf 835个

• api-paste.ini 40个

• logging.conf 43个

• rootwrap.conf 5个

• rootwrap.d/*.filter

• policy.json

• cells.json

15年3月24⽇日星期⼆二

组件式的架构设计• 选择nova-network还是neutron来构建SDN?

• 选择ceph还是sheepdog作为cinder backend?

• 选择template抑或sql作为Keystone catalog driver?

• 选择在⼀一个服务的pipeline中添加计费中间件?

• 部署All-in-one还是将API服务独⽴立为控制节点?

• 计算存储⼀一体还是分离?

15年3月24⽇日星期⼆二

私有Patch众多• Keystone: 167个

• Ceph: 133个

• Neutron: 129个

• Ceilometer: 107个

• Nova: 92个

• Cinder: 87个

• Glance: 13个

• …

15年3月24⽇日星期⼆二

变更频繁• 每隔6个月,OpenStack社区各个项⺫⽬目发布新版本

• 过去12个月,UnitedStack平均每月会上线2.6个新项⺫⽬目或服务

• 过去32周,线上环境的变更次数

15年3月24⽇日星期⼆二

运维⾃自动化的基⽯石?

15年3月24⽇日星期⼆二

统⼀一

统⼀一是指统⼀一的框架,统⼀一的⼯工具,统⼀一的流程,统⼀一的接⼝口。

15年3月24⽇日星期⼆二

框架统⼀一

• BoneDragon UnitedStack基础架构项⺫⽬目

使⽤用Python编程语⾔言,可以⼀一键⽣生成⼀一个项⺫⽬目的基础架构,包含有标准化的api模块, db模块, migration模块, 并且有测试的example, 参照这个框架很快能把⼀一个项⺫⽬目完成,并保证公共依赖库的版本⼀一致。

15年3月24⽇日星期⼆二

BoneDragon框架

https://github.com/JimJiangX/BoneDragon15年3月24⽇日星期⼆二

⼯工具统⼀一

• PSRForge 包管理系统

• Puppet 配置管理系统

• Ansible 任务编排系统

• Jenkins ⾃自动构建系统

15年3月24⽇日星期⼆二

⼯工具统⼀一

BuildPackage

WritePuppetModules

Declarein

YAML

ExecDeployment

CheckService

Packaging Deployment Logic

Deployment Data

RunDeployment

DeploymentValidate

15年3月24⽇日星期⼆二

PSRForge

包管理系统旨在控制软件包的整个⽣生命周期

• SpecForge Spec管理系统

• PackForge 软件包⾃自动构建系统

• RepoForge 软件仓库管理系统

15年3月24⽇日星期⼆二

Puppet 配置管理系统Puppet是CD⼯工具链中的核⼼心组件

• 能(适合)

• 软件包的安装

• 配置⽂文件的管理

• 服务状态的管理

• 命令的执⾏行

15年3月24⽇日星期⼆二

Puppet 不能(不适合)

• 源码的管理

• 依赖包的管理

• 复杂的服务初始化操作

• 服务状态的监控和恢复

• 节点间的依赖管理

15年3月24⽇日星期⼆二

Ansible

• ⽆无agent,yaml配置⽂文件,⽤用于集群的任务编排

在使⽤用ansible之前,我们使⽤用过:

• Dispatcher 基于ssh + ini配置⽂文件

• ClusterShell 基于ssh 功能完善

• Mcollective 基于MQ C/S架构

15年3月24⽇日星期⼆二

Jenkins

所有的重复性工作,例如执行单元测试,集成测试,构建软件包工作等必须以Jenkins的job形式出现,使得打包和测试工作变为自助。这里详细列出涉及到的工作:

i. 各项目单元测试

ii. 各项目打包

iii. 集成测试

iv. UOS环境构建和清理

15年3月24⽇日星期⼆二

Jenkins

15年3月24⽇日星期⼆二

流程统⼀一• 软件包管理流程

• 线上服务的变更流程

• 软件的发布周期流程

• 部署逻辑代码提交流程

• 公共库变更流程

• ……

15年3月24⽇日星期⼆二

OpenStack跨⼤大版本升级流程

研发的准备⼯工作

• 确定项⺫⽬目的upstream version number

• 完成私有patch的合并⼯工作

• 给出依赖库的版本变更列表,放⼊入ustack requirements项⺫⽬目

• 给出配置选项的变更列表

• 给出数据库的变更版本

15年3月24⽇日星期⼆二

部署的准备⼯工作

• 更新SPEC,SOURCES⽂文件,制作新版本软件包

• 更新puppet-xxx module,合并私有patch

• 在开发环境和研发⼀一起进⾏行调试

• 打上正式发布版本号,在测试环境上线,需要通过集成测试

OpenStack跨⼤大版本升级流程

15年3月24⽇日星期⼆二

上线

• 给出线上业务变更单,说明业务变更内容,可能造成的影响,执⾏行流程,回滚流程等;

• 凡涉及公共库变更,需要所有相关⼈人员确认;

• 核⼼心业务的变更流程已预先制定完成,借助⼯工具来⾃自动执⾏行,不允许⼈人⼯工介⼊入;

OpenStack跨⼤大版本升级流程

15年3月24⽇日星期⼆二

接⼝口统⼀一

• OpenStack /UnitedStack⾃自研项⺫⽬目提供统⼀一的API

• UOS CLI 对⼀一些复杂的资源操作进⾏行了封装和简化

• 这些前提使得⾃自动化的测试⼯工作变为可能

15年3月24⽇日星期⼆二

Doctor

UnitedStack健康检查服务

Doctor有三个主要功能:

• 诊断uOS所有服务是否正常;

• 恢复uOS所有服务到正常状态;

• 收集uOS服务的错误⽇日志和相关系统信息。

15年3月24⽇日星期⼆二

Doctor例⼦子:创建volume snapshot操作失败后的反馈

15年3月24⽇日星期⼆二

解耦与隔离

15年3月24⽇日星期⼆二

⼀一个参数引发的故障

• 某⽇日的下午,别⼈人家公司的⼀一名运维同学,尝试使⽤用puppet hbase module来管理线上hbase集群,结果误⽤用了purge参数把所有的线上数据都删除了。

• 我第⼀一次尝试使⽤用puppet-apache模块管理apache服务时,apache类中默认设置了purge_configs参数为True,导致apache⺫⽬目录下所有vhost⽂文件被删掉,万幸的是我在开发环境。

• 想知道故事的结尾吗:⼀一个purge参数引发的惨案——从线上hbase数据被删事故说起

15年3月24⽇日星期⼆二

引发的思考

• 部署逻辑的上线,未经开发和测试环境的验证

• 盲⺫⽬目使⽤用第三⽅方模块,没有充分阅读源码或者README⽂文档

• 上线流程没有权限分离,缺乏审批机制

15年3月24⽇日星期⼆二

分离

• 分离是为了解耦,为了设⽴立明晰的安全边界,为了更好地细化⼯工作。

15年3月24⽇日星期⼆二

环境分离

• 部署逻辑与业务逻辑的环境划分为dev,test,production 3种环境;

• ⽣生产环境进⼀一步细分为pre_production,production环境;

15年3月24⽇日星期⼆二

仓库分离

• 根据包的类型划分为3类仓库;

• 每个仓库根据环境划分为devel,test,products三个⼦子仓库;

• 每个集群拥有完全独⽴立的软件仓库;

15年3月24⽇日星期⼆二

部署逻辑和数据分离

• 配置管理⼯工作划分为三块,为了解耦,降低维护成本:

• 部署逻辑管理: modules 软件和服务的配置管理代码集合

• 部署数据管理: hieradata 涵盖了所有集群软件和服务的定制化数据

• 节点⾓角⾊色管理: manifests 所有被管理的服务器的⾓角⾊色定义集合

15年3月24⽇日星期⼆二

⾓角⾊色分离

• ⾓角⾊色分离的⺫⽬目的是为了提供灵活的OpenStack部署架构。

• ⺫⽬目前⼀一共涵盖49种元⾓角⾊色,可以根据需要进⾏行⾃自由组合。

• Controller = API + MySQL + MQ + MC

• Comb = Compute + OSD + OVS

15年3月24⽇日星期⼆二

权限分离

• ⽆无论是部署逻辑,部署数据,变更脚本,都通过版本控制⼯工具管理,其中部署数据项⺫⽬目只有少数员⼯工拥有访问权限

• 代码要进⼊入仓库,必须通过项⺫⽬目负责⼈人的⼈人⼯工审查

• 要执⾏行线上业务变更,根据变更的类型和级别,须通过相关负责⼈人的审核

• 为不同环境的集群提供统⼀一⼊入⼝口,后端划分独⽴立的配置管理服务器,每台服务器有不同的访问权限

15年3月24⽇日星期⼆二

⼀一个⼈人的精⼒力是有限的

15年3月24⽇日星期⼆二

⺫⽬目前通过git submodule的⽅方式管理了:

• 85个puppet module• 67698⾏行puppet代码• 79868⾏行ruby代码• 19371⾏行yaml格式数据

15年3月24⽇日星期⼆二

借助开源⼒力量

• Puppet-Openstack项⺫⽬目是OpenStack社区推出的⼀一系列的puppet modules,旨在提供OpensStack各服务的配置管理。

更多介绍: https://wiki.openstack.org/wiki/Puppet-openstack

15年3月24⽇日星期⼆二

• stackforge/puppet-ceph• stackforge/puppet-ceilometer• stackforge/puppet-cinder• stackforge/puppet-designate• stackforge/puppet-glance• stackforge/puppet-heat• stackforge/puppet-horizon• stackforge/puppet-keystone• stackforge/puppet-neutron• stackforge/puppet-nova• stackforge/puppet-openstack• stackforge/puppet-swift• stackforge/puppet-trove• stackforge/puppet-vswitch•……..

Puppet modules

15年3月24⽇日星期⼆二

• stackforge/puppet-openstacklib

• stackforge/puppet-openstack-specs

• stackforge/puppet-openstack_extras

lib/specs repository

15年3月24⽇日星期⼆二

• Mirantis Fuel 使⽤用了Puppet-Openstack modules(有定制化修改,主要在HA⽅方⾯面),提供灵活多变的部署⽅方式

• RedHat Packstack 直接使⽤用了upstream的Puppet-Openstack modules

主流的OpenStack部署⼯工具

15年3月24⽇日星期⼆二

公司 系统版本 puppet组件 puppet组件版本Aptira CentOS 6 puppet_openstack_builder Havana

Catalyst Ubuntu 12.04  puppet openstack modules HavanaCERN Scientific Linux puppet openstack modules HavanaCisco Ubuntu12/14 puppet_openstack_builder Grizzly/Havana/Icehouse

Comcast Ubuntu puppet openstack modules Essex/Grizzly/Havana

eNovanceUbuntu12.04/14.04 /

Debian Wheezy /RHEL 6.5

puppet-openstack Grizzly/Havana/Icehouse

GoDaddy CentOS 6 puppet openstack modules Havana

iWeb Ubuntu 12.04 puppet openstack modules HavanaIcehouse for Swift only

Mirantis Ubuntu 12.04 CentOS 6.[3-5] puppet openstack modules Folsom/Grizzly/Havana/Icehouse

MIT CSAIL Ubuntu 12.04 puppet openstack modules HavanaNimag/

Camptocamp Ubuntu 12.04 puppet_openstack_builder Havana

Oracle  Solaris 11.2 puppet openstack modules Grizzly                  

Pixelpark AG Fedora 20 puppet openstack modules(except Ceph) Icehouse

Red Hat  RHEL puppet openstack modules  Grizzly/Havana/IcehouseSCEA Ubuntu 12.04 puppet openstack modules Essex

Time Warner Cable Ubuntu 12.04/14.04 puppet openstack modules Ubuntu 14.04 for Icehouse

Unitedstack Centos 6.[4-5] puppet openstack modules and custom modules Havana/Icehouse

15年3月24⽇日星期⼆二

来⾃自Openstack社区的User survey,关于部署⼯工具的最新数据统计

15年3月24⽇日星期⼆二

参与社区

• coding, code review, ML,IRC,Meetup …

• 更深⼊入地理解源代码

• 掌握项⺫⽬目的发展动态

• 提升项⺫⽬目的代码质量

15年3月24⽇日星期⼆二

配置⽂文件管理的变迁

• 社区在如何改善配置⽂文件的管理上持续投⼊入了⼤大量的精⼒力,我们去年提交的数个patch使得配置参数的管理变得更为灵活。

• 配置⽂文件管理的终极⺫⽬目的: 有效 & 灵活 & 低成本

15年3月24⽇日星期⼆二

模板(template)统治⼀一切

管理nova.conf中的libvirt_type选项

• 先在nova模块的templates⽂文件夹下的nova.conf.erb⽂文件,使⽤用ERB语法在⾥里⾯面添加以下⼀一⾏行代码:

15年3月24⽇日星期⼆二

模板(template)统治⼀一切

• 然后在nova模块init.pp中使⽤用file resource来管理nova.conf

15年3月24⽇日星期⼆二

拼接(concat)取⽽而代之

OpenStack的配置⽂文件是标准的INI格式,每个配置⽂文件由多个section组成。

例如,在swift的proxy-server.conf中有[default],[pipeline:main],[app:proxy-server]等等。

• concat模块将配置拆分成了⼦子模板,然后使⽤用concat::fragment define把这些template拼接起来。

• 使⽤用⽅方式和file resource来渲染template类似,唯⼀一的区别就是order参数,指明这⽚片(fragment)配置在⺫⽬目标配置⽂文件中的顺序,升序排列。

15年3月24⽇日星期⼆二

问题 使⽤用模板的主要缺点是繁琐:

每次添加⼀一个新变量,需要修改三个不同的代码⽂文件。

• 在template⽂文件⾥里添加上这个新变量:

<%= @new_variable %>

• 在class⽂文件中添加这个变量:

$new_vairable = ‘hello'

• 最后在hieradata⽂文件中对其赋值:

xxx::new_vairable:: ‘hey’

15年3月24⽇日星期⼆二

模板带来的问题

• 对于⼀一个成熟的项⺫⽬目来说,并不频繁的配置变更,使⽤用模板是理所当然的。

• 但是对于快速迭代,频繁变更的Openstack项⺫⽬目来说,模板将成为⼀一个梦魇。

• PTL曾经做了⼀一个统计,在G版前的过半提交都是和配置选项有关。

15年3月24⽇日星期⼆二

service_config资源类型的出现

• 以nova为例,社区开发了nova_config custom resource type

在管理libvirt_type = ‘kvm’选项,⽆无需在模板⾥里定义,直接在class中定义:

• nova_config { 'default/libvirt_type': value => $libvirt_type;}

• 问题: 新增⼀一个配置选项 = 在两个配置⽂文件中各添加⼀一⾏行代码

15年3月24⽇日星期⼆二

管理⾃自定义参数的*::config类

• 某些plugin或者driver的配置选项缺失,例如cinder的solidfire,neutron的ibm plugin等等

• ⾃自定义参数 例如,我们针对neutron,nova, ceilometer, keystone做了定制化修改,添加了⼤大量的⾃自定义选项。

15年3月24⽇日星期⼆二

管理⾃自定义参数的*::config类

• ⺴⽹网络组的同事个个活⼒力⼗十⾜足,每天都会在协作平台上给我分上⼀一堆⾮非常有趣的task,其中和配置相关的task我⼤大致进⾏行了分类:

• a. 在测试环境中,在abc配置⽂文件中添加参数x

• b. 把参数x的值修改为y

• c. 删除参数x

15年3月24⽇日星期⼆二

nova::confignova::config class:⽤用于管理⾃自定义参数

nova::config的调⽤用⽤用例

15年3月24⽇日星期⼆二

相关讨论

• 我在社区的邮件列表发起了⼀一个关于更好地管理⾃自定义参数⽅方法的讨论,社区将这个议题作为⼀一个单独的topic放⼊入Atlanta Design Summit的Puppet section。

• 参⻅见:https://etherpad.openstack.org/p/ATL-ops-unconference-RFC

• 更多说明参⻅见: Openstack配置⽂文件管理的变迁之路

15年3月24⽇日星期⼆二

相关patch的ML讨论和链接参⻅见

• https://groups.google.com/a/puppetlabs.com/forum/#!topic/puppet-openstack/H-uIbE_I_QQ

相关Patch• https://review.openstack.org/#/c/79506• https://review.openstack.org/#/c/84987/• https://review.openstack.org/#/c/82699/• https://review.openstack.org/#/c/84976/• https://review.openstack.org/#/c/84981/• https://review.openstack.org/#/c/84999/

15年3月24⽇日星期⼆二

Thanks.

15年3月24⽇日星期⼆二