OpenStack 早期在部署方面相当复杂也难以维护,但是在近期 DevOps 跟 Container 的概念热门起来後,OpenStack Community 中也出现了透过 Container 跟 Ansible 部署 OpenStack 的方式。这种方式就是透过 Kolla 跟 Kolla-Ansible 实现。Kolla 提供可 Dockerfile 来 build OpenStack 所需要的 Docker images,Kolla-Ansible 则提供了一个部署这些 Container 所需要的 Ansible playbook。本篇文章将会介绍如何透过这个专案快速部署一个 Production Ready, High-availability 的 OpenStack 环境(目前版本为 Wallaby)
一个 High-availability 的 OpenStack 环境基本上最少需要 4 个 node,3 个 controller node (ceph node) 加上至少一台的 compute node。每个 node 至少有两个 interface。
Kolla-Ansible 将 OpenStack 网路分为几种
除了 Neutron External Interface 需要为独立的介面以外,其他网路都可以共用介面,预设坏带入 network_interface 的值
本篇范例使用官方 upload 到 DockerHub 的 image,若需要自行修改 image 需要架设 Docker Registry。
在要跑部署的机器上先下载 Kolla-Ansible 的 code 并且。
git clone https://github.com/openstack/kolla-ansible -b stable/wallaby
pip install -U ansible
将 kolla-ansible 设定档放到 /etc/kolla
底下。
cp kolla-ansible/etc/kolla/ /etc/kolla
安装 Ansible 可以直接使用 Linux distro 的 package manager 安装。
sudo yum install epel-release
sudo yum install ansible
sudo apt install ansible
Kolla-Ansible 所有设定皆会放在 /etc/kolla/globals.yml
内。
编辑的时候记得先将要编辑的那行前的注解拿掉,一开始填入的值是预设值。
kolla_install_type 指的是 OpenStack code 安装的方式,binary 就是使用各个 distro 所包好的 binary 档案,source 便是使用 OpenStack upstream 的 source code。这方面的选择就因人而异,个人习惯都是选择使用 source 的方式安装
openstack_release 基本上就是 Kolla Image 所使用的 Docker repository tag,这篇范例因为是使用 DockerHub 上的 wallaby 版本所以填入 wallaby
# Valid option is Docker repository tag
openstack_release: "wallaby"
kolla_internal_vip_address 跟 kolla_internal_fqdn 是 OpenStack service 内部沟通用的 IP address 跟 FQDN,这里根据每个人的环境不同会填入不同的 IP Address,这个 IP Address 要跟 API interface 在同一个 CIDR 并且是未被使用的 IP
kolla_external_vip_address 跟 kolla_external_fqdn 则是 OpenStack service 面向 public user 使用的 IP address 跟 FQDN
kolla_internal_vip_address: "192.168.113.0"
#kolla_internal_fqdn: "{{ kolla_internal_vip_address }}"
kolla_external_vip_address: "140.113.0.1"
kolla_external_fqdn: "openstack.igene.tw"
Docker Options 填入的是 Docker Registry 的一些认证跟位置设定,因为本篇范例是直接使用 DockerHub 上的 Image,所以保留注解即可。
Network Options 的部分是要设定上面所提到各个不同网路所使用的 interface,这边的 interface 名称则是要根据机器所有的 interface 名称做更改,如果有不一样的地方也可以在 Ansible Inventory 做 override。
#kolla_external_vip_interface: "eth0"
#api_interface: "{{ network_interface }}"
#storage_interface: "enp2s0f0"
#cluster_interface: "enp2s0f1"
#tunnel_interface: "{{ network_interface }}"
#dns_interface: "{{ network_interface }}"
#neutron_external_interface: "eth1"
这里可以选择要启用的 OpenStack Service,可以根据自己需求选择要启用的服务。
到这里大部分的设定皆已经完成,在实际部署 Production 环境可以根据自己需求做一些细部的更改。
如果需要针对个别 service 设定档做更改及调整,在下一篇中会介绍如何使用 custom config。
Ansible Inventoy 就根据自己所选择各个 node 的 hostname 或是 IP address 填入,本篇范例会包含三台 controller node control01, control02 control03
和一台 compute node compute01
,controller node 同时也是 Ceph 的 storage node,所以在 storage 的部分也是填入 controller node 的 hostname。
[control]
control01
control02
control03
[network]
control01
control02
control03
[inner-compute]
[external-compute]
compute01
[compute:children]
inner-compute
external-compute
[monitoring]
control01
control02
control03
[storage]
control01
control02
control03
如果要安装 all-in-one 的话,可以透过 ansible/inventory/all-in-one
这个 inventory file。
Kolla-Ansible 在设定完之後实际部署很简单,只需要跑四个指令即可。
cd kolla-ansible
tools/generate_passwords.py
generate_passwords
这个 script 将会产生 OpenStack 使用的密码并且填入 /etc/kolla/passwords.yml
这个档案。
tools/kolla-ansible -i ansible/inventory/multinode bootstrap-servers
bootstrap-servers
将会在要部署的 node 做一些基本的准备,例如安装必要的套件,Docker 等。
tools/kolla-ansible -i ansible/inventory/multinode prechecks
prechecks
将会根据设定档做一些部署前基本的检查,例如 VIP, port 是否都没有人使用等。
tools/kolla-ansible -i ansible/inventory/multinode deploy
deploy
将会实际部署 OpenStack 环境,包含了 pull image, run image, 将 OpenStack 设定完成等步骤都会在这个 playbook 完成。跑的时间根据网路速度跟部署规模等不太一定,快的话 20 分钟就能部署好一个 Production Ready, High-availability 的 OpenStack 环境。
如果 deploy
跑完没有任何问题的话,可以使用自己的 browser 到 kolla_internal_vip_address 或 kolla_internal_fqdn 就可以看到 OpenStack 介面了。
最後使用帐号 admin 跟 /etc/kolla/passwords.yml" 中的
keystone_admin_password``` 就可以登入进 Dashboard 了
>>: Day25:Dynamic Programming(DP) - 动态规划(上)
在上一篇我们认识了一些Selector,包括所有元素选择器、指定元素选择器、ID选择器和Class选...
这礼拜进度开始落後,在写第七周作业的 todo list,自己後来才发现事件代理的用法,所以後面又重...
很多人公司在设定广告活动时,常会犯了几个错,这些错也许不会造成什麽毁灭性的结果,但很有可能会每天浪费...
前言 铁人倒数十天!利用最後时间来分享浏览器,这里才是真正的战场。 在 ECMAScript 上并没...
欸!?这个不是在 hello world 的时候讲过了ㄇ?! 对。 其实函式还是有其他东西可以讲解的...