为展示 Kolla 的真正实力,我在阿里云使用 Ansible 自动建立 10 台虚机,部署一套多节点高可用 OpenStack 集群!html
上次 Kolla 已经表示了要打 10 个的愿望,此次咱们就知足它。node
经过本期内容,你将看到:git
本期内容仍然是干货满满,写文章,调脚本,剪视频,不但花时间,还要在 阿里云 花钱租云服务器,真的费了很多精力,因此若是本文对你有所帮助,请务必点赞支持!谢谢。github
操做过程仍可在 B站观看视频docker
一次性建立 10 台虚机,从界面一个个的点就太无聊了。因此咱们要想办法让这个过程自动化地完成。shell
第一个念头就是用 Python 去调用 API,因而直奔 开发者工具 页面而去,却发现阿里云提供了网页版的命令行工具:Cloud Shell,使用起来更加方便。数据库
启动 Cloud Shell 会自动为你建立一个虚机,里面不但内置了链接阿里云的 CLI 工具,并且由于是登陆后启动,它自动把认证也处理了。也就是说咱们直接就能够开始使用了,很是方便。bootstrap
具体请参考官方文档:什么是云命令行?api
不只如此,为了让你们更好地掌握这些工具的用法,还提供了交互式的 实验教程,花上几分钟,也许再花上几分钱,就能上手实验。安全
在实验了 使用 Ansible 管理云资源 这个教程以后,决定就采用这个方法了。
CloudShell 的操做内容较多,单独录了一期 视频介绍。
此次部署多节点,比前几回只部署 All-In-One
节点新增了 Cinder
存储服务,因此把要用到的镜像都提早构建好。
关于 Kolla 构建 Docker 镜像的过程之后再详述。
容器镜像仍然使用阿里云的容器镜像服务,保存在 华东2(上海)
地区。
值得注意的是,上一期内容中我在 华东1(杭州)
地区测试,跨地区从公网地址拉取镜像,速度也还不错。可是本次测试只在部署节点分配了公网 IP,其他节点都不会分配公网 IP,也就无法访问公网资源了。
一个解决办法是只在 华东2(上海)
地区测试,这样能够配置私网地址。这样限制较大。
另外一个比较通用的办法是先在部署节点上搭建一个私有的 registry 做为中转,就和使用 davycloud-openstack-stein.iso
安装的 Deploy Node 同样。
最终采起的是把 registry 配置成 PROXY
模式,这样就不用事先把镜像 push 到 registry 中了。
# deploy.yml 中的内容 - name: Start docker registry docker_container: name: registry restart_policy: always image: registry:2 ports: - 4000:5000 volumes: - registry:/var/lib/registry env: REGISTRY_PROXY_REMOTEURL: "https://registry.cn-shanghai.aliyuncs.com"
参考上面的教程完成。
Kolla 在部署 OpenStack 阶段,按职责分为 5 种角色:
实际 1 个节点能够有 1 个或多个角色。好比,All-In-One
安装时,一个节点就充当了全部角色。
实际这里的角色对应的是 Ansible 中的主机分组概念。
节点上最终会安装哪些服务(也就是启动哪些容器),最终由启用的各个功能模块综合决定而成。例如,若是启用了 cinder
,则 cinder-api
服务会安装在全部的 control
控制节点上,而 cinder-volume
服务会安装在全部的 storage
存储节点上。
除此以外,还须要:
Kolla-Ansible
的节点在我提供的 ISO 光盘里,系统安装时选择了 Deploy Node
就会自动安装这些。
若是是日常部署,任选一个机器充当部署节点便可,部署节点自己也能够是控制或计算或存储。
此次在阿里云上,咱们单首创建一个虚机来当部署节点。
10 个节点的角色分配状况:
注意: 阿里云上的虚机不支持 keepalived,因此此次没法启用 haproxy。
本节操做在 Cloud Shell 中进行。
进入云命令行后直接运行:
git clone https://code.aliyun.com/davycloud/kolla-openstack.git cd kolla-openstack/ansible
配置信息都在 kolla-openstack/ansible/group_vars/all
文件中,根据状况修改便可。
默认配置会建立 11 台抢占式实例,对应上面的规划:
执行建立资源的剧本:
cd ~/kolla-openstack/ansible ansible-playbook create.yml
剧本完成后能够在页面上看到资源的建立状况。
同时 ~/kolla-openstack/ansible
目录下会生成一个 hosts
文件,记录全部建立的实例的私网地址和 hostname
.
注意: 我本意是将此
hosts
文件直接复制到部署节点的/etc/hosts
.可是这里遇到了阿里云 ansible 模块的一个 bug. 其影响就是没有办法在批量建立实例时按序生成
hostname
,例如:control01, control02, control03.因此
hosts
文件中同类型主机名都是同样的,须要在后面手动修改。
在虚机资源建立完成后,首先须要配置的是部署节点。它是这批虚机中惟一默认建立了公有 IP 的,因此能够直接在 Cloud Shell 中操做。其它节点只有私有网络,必须经过它来操做。
由于每次建立虚机的时候 IP 地址都是不肯定的,不可能提早写在 Ansible 的剧本中。而每次若是手动去修改编辑主机信息,又很不方便。
因此 Ansible 中有一个动态 inventory 的功能,经过调用脚原本动态获取主机信息。
阿里云把这个动态 inventory 脚本也为咱们写好了。这个脚本所在项目开源托管在 GitHub 中,下载地址 时不时的没法访问,我就一并放在了本身的这个项目中,也就是 ~/kolla-openstack/ansible/alicloud.py
这个脚本,同时运行它须要一个配置文件,就是和它同目录的 alicloud.ini
目前这个动态 Inventory 还在被官方集成的过程当中,须要先手动安装依赖:
pip install ansible_alicloud_module_utils
deploy.yml
剧本这样,咱们每次就无需修改代码,直接运行下面的剧本就能够了:
chmod +x ~/kolla-openstack/ansible/alicloud.py ansible-playbook -i ~/kolla-openstack/ansible/alicloud.py deploy.yml -u root -k
执行命令后提示输入密码: Test12345
密码是在
~/kolla-openstack/ansible/group_vars/all
中设置
该剧本会完成如下任务:
/root
目录kolla-genpwd
执行完此步骤后,咱们仍然须要和之前同样经过 SSH 登陆到部署节点,完成后续的 OpenStack 安装任务。
虽然咱们能够在 Cloud Shell 中远程操做部署节点来执行部署任务,可是基于下面缘由:
- 整个部署比较耗时,这个临时虚机并不稳定
- 多节点部署也是比较灵活的,有些配置不可避免须要根据状况设置,再套一层 ansible 不必
- 即便针对一种场景写 ansible 剧本调试都要花时间,意味着多花租服务器的钱…
所以后面的操做将继续手动执行
执行成功后,在 /root
目录下会有如下文件:
all-in-one # 本次用不上 bootstrap.yml # 用来初始化其它节点的 Ansible 剧本 hosts # 建立资源时生成的 hosts 文件 multinode # Kolla-Ansible 多节点的 Inventroy 文件
hosts
文件编辑 hosts
文件,把其中的 hostname
按照主机的角色进行修改:
172.16.1.31 control01 172.16.1.32 control02 172.16.1.33 control03 172.16.1.34 network01 172.16.1.35 network02 ...
把 hosts
内容复制到 /etc/hosts
中:
cat hosts >> /etc/hosts
multinode
编辑 multinode
文件,把其中的 hostname
按照主机的角色分组进行填写:
[control] control01 control02 control03 [network] network01 network02 [compute] compute01 compute02 compute03 [monitoring] #monitoring01 # 暂不支持 [storage] storage01 storage02 storage03 # 这下面的全部内容都不要动了!!
如下的操做都是在部署节点上执行
为了方便 Ansible 无密码方式链接各个节点,须要先把部署节点的 SSH 公钥下发到各个节点。
由于节点数量很少,并且密码都是固定的,因此这里用 sshpass
手动执行完成:
sshpass -p Test12345 ssh-copy-id control01 sshpass -p Test12345 ssh-copy-id control02 ... sshpass -p Test12345 ssh-copy-id storage03
使用 Ansible 命令测试各节点的连通状况:
ansible -i multinode -m ping all
全部节点都应该能正常回应。
bootstrap.yml
剧本经过 ansible-playbook
命令执行 bootstrap.yml
剧本:
ansible-playbook -i multinode bootstrap.yml
该剧本会初始化各个节点,为它们安装上 docker
等必需软件,详情能够查看剧本的内容。
/etc/kolla/globals.yml
须要修改的配置项以下:
# Valid option is Docker repository tag #openstack_release: "" openstack_release: "train" #kolla_internal_vip_address: "10.10.10.254" kolla_internal_vip_address: "172.16.1.33" docker_registry: "172.16.1.30:4000" docker_namespace: "davycloud" #docker_registry_insecure: "yes" # 不启用 HAProxy enable_haproxy: "no" # 启用 ceph enable_ceph: "yes" # 启用 cinder enable_cinder: "yes"
须要注意的地方:
kolla_internal_vip_address
必须填写部署节点真实的私网地址docker_registry
必须配置为部署节点的 IP:4000haproxy
,必需要先取消注释,而后修改成 "no"
注意!警告! 下面的命令会清除全部数据,请谨慎操做!
参考文档,配置 Ceph-OSD 的存储为 Bluestore
查看存储节点的盘:
# ansible -i multinode "storage*" -a "lsblk"
假设 全部存储节点的盘都是 vdb
# ansible -i multinode "storage*" -a "parted /dev/vdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_BS 1 -1" # ansible -i multinode "storage*" -a "parted /dev/vdb print"
在建立资源的时候为网络节点额外建立了 1 块弹性网卡,不知道何故并无绑定到实例上。须要在阿里云的页面上把两个弹性网卡绑定到网络节点实例上。
总体的部署流程和命令和部署单节点是同样的,惟一须要增长的地方是加一个 -i
选项,指定 inventory 文件,也就是 multinode
这个文件。
kolla-ansible -i multinode pull
由于此次节点数量比较多,因此镜像拉取耗时会稍微长一点,能够耐心等待。
不一样角色的节点拉取的镜像是不同的,能够在部署节点另开一个 SSH 会话,用下面的命令查看:
ansible -i multinode all -a "docker images"
在部署节点依次执行下面 3 个命令便可:
kolla-ansible -i multinode prechecks kolla-ansible -i multinode deploy kolla-ansible -i multinode post-deploy
正常状况下的高可用架构会在网络节点安装 HAProxy 和 Keepalived,此次演示并无。
OpenStack 全部模块的 API 服务都是无状态的,因此横向扩展搭配负载均衡便可实现高可用。
因为 Kolla-Ansible 中启用负载均衡(HAProxy)的前提是要启用 Keepalived,可是阿里云又不支持,因此此次实验其实 API 的负载均衡并无起效果,API 地址固定访问了指定的第 1 个控制节点地址。
实际上,咱们能够另外启动一个外网浮动 IP,把这个浮动 IP 绑定到任意一个控制节点上,而后访问 API,都是能够正常提供服务的。
此外阿里云提供了现成的负载均衡服务,这里应该能够直接对接阿里云的负载均衡产品,不过并没有必要,此次就不尝试了。
网络节点的高可用实际状况比较复杂,这里不展开讨论了。简单展现一下网络服务:
MariaDB
集群数据库采用的是 MariaDB Galera Cluster 集群方案,登陆后能够查看:
RabbitMQ 的集群状态能够经过管理页面查看,不过要正常访问,须要作如下操做:
15672
端口放开访问 http://<控制节点外网IP>:15672
进入 RabbitMQ 管理页面:
Ceph 自己就是分布式的,这里就不赘述了。
别忘了最重要的事情,测试完成后别忘了去释放实例,以避免一直扣费。
抢占式实例是保证明例有一个小时的稳定使用,不表明一个小时以后就会回收。若是供应比较大的状况下,系统可能会长期不回收你的实例,那就要一直扣费了!
记得释放实例!
记得释放实例!
记得释放实例!
在 Cloud Shell 中一键清理本次实验建立的资源:
cd ~/kolla-openstack/ansible ansible-playbook destroy.yml
清理资源也能够经过网页完成,最后务必检查清理结果,以免资源没有释放致使扣费。
注意,本次实验还有云盘须要释放!!
若是本文对你有帮助,请 点赞、 关注、分享 来一波。