Kolla?
部署 OpenStack 的方式和工具有很多,截至目前在网络上可以搜索到的部署方式和工具有:
- Fuel
- Devstack
- Diablo
- Stackops
- Crowbar
- Maas+Juju
- Rackspace Private Cloud
- Cisco OpenStack
- Puppetlab
- dodai-deploy
- General Bare-Metal Provisioning Framework
- Folsom
- Cobbler
- Openstack-Anvil
- Altai Private Cloud
- Rdo
- SaltStack
- TripleO
- Packstack
- Kolla
在这么多的部署工具中,为什么我们选择了 Kolla 呢?不仅仅是因为它基本覆盖了全部的 OpenStack 组件,更重要的是 Kolla 是使用的 容器虚拟化技术 来部署 OpenStack。这将直接降低部署 OpenStack 的难度,以及避免运行环境重叠导致的各种未知错误。同时,使用 Kolla 部署的 OpenStack 可以很方便的升级版本而不用担心运行环境异常,因为所有服务均运行在容器中,不依赖于外部环境、大批量自动化部署而不用去每一个机器手动执行重复的操作。更多的,Kolla 是目前 OpenStack 部署方式中,更新以及适配速度最快、官方推荐的、最现代化的部署方式。
Kolla的优势和使用场景,体现在如下几个方面:
- 原子性的升级或者回退OpenStack部署;
- 基于组件升级OpenStack;
- 基于组件回退OpenStack;
这里,我们予以拆分来理解:
Kolla的最终目标是为OpenStack的每一个服务都创建一个对应的Docker Image,通过Docker Image将升级的粒度减小到Service级别,从而使升级时,对OpenStack影响能达到最小,并且一旦升级失败,也很容易回滚。升级只需要三步:Pull新版本的容器镜像,停止老版本的容器服务,然后启动新版本容器。回滚也不需要重新安装包了,直接启动老版本容器服务就行,非常方便。
Kolla是通过Docker Compose来部署OpenStack集群的,现在主要是针对裸机部署的,所以在部署Docker Container时,默认的网络配置都是Host模式。
首先,只需要通过一个命令就可以把管理节点部署完成,这个命令是调用Docker Compose来部署OpenStack的所有服务,然后我们可以在每一个计算节点上通过Docker Compose安装计算节点需要的服务,就能部署一个OpenStack集群。因为Kolla的Docker Image粒度很小,它针对每个OpenStack服务都有特定的Image,所以我们也可以通过Docker Run来操作某个具体的OpenStack服务。
所以,我们采用了 Kolla 部署 OpenStack 的方案。相较于其它方案,此方案在快速构建 OpenStack 集群的同时还可以节省运维成本以及运维压力,实现了一举两得。
操作系统的选择
目前而言,Kolla Ansible 支持自动化部署的操作系统如下:
CentOs | Debian | RHEL | Ubuntu |
---|---|---|---|
8 | bullseye | 8 | focal |
CentOs 已经步入付费时代,CentOs 8 将成为最后一个可以白嫖的版本,RHEL 本身就是企业级产品。所以 Debian 或 Ubuntu 是最好的选择。本人选择了 Ubuntu,你也可以根据实际情况选择另外三个操作系统。
环境配置
Kolla 本身是基于容器部署的,所以我们需要准备 Docker 运行环境,这个很简单,一行命令解决:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
,现在的 Docker 安装脚本真的很人性化添加一个 --mirror Aliyun
便可以选择使用阿里云镜像源进行安装,比原先手动配置仓库快乐多了。
在 Docker 安装过程中,咱们也不能闲着,来配置下集群 Hostname、Hosts 以及 时间同步:
- 在每个节点上分别使用
hostname set-hostname *名字*
来设置节点名称,注意节点名称不可以相同 - 在每个节点上分别使用
vi /etc/hosts
来配置 hosts 文件,将每个节点的名称以及IP地址加入列表,!!!本步操作时一定要注意,不可以将本机节点指向的IP地址设置为 127.0.0.1,否则 RabbitMQ 将安装失败,因为在容器内部使用 127.0.0.1 访问将访问到容器本身的网络而不能访问到外部物理机!!! - 通过 Chrony 使用 阿里云授时服务器同步主机时间
等待 Docker 安装完成后便可以开始我们的 Kolla Ansbile 安装:
dnf install python3-devel libffi-devel gcc openssl-devel python3-libselinux
apt install python3-dev libffi-dev gcc libssl-dev
Kolla Ansible 安装脚本 基于 Python,所以我们可以采用 Virtual Environmen 的方式安装:
sudo apt install python3-venv
python3 -m venv /path/to/venv
source /path/to/venv/bin/activate
pip install -U pip
pip install 'ansible==5.*'
当然你也可以选择不使用:
dnf install python3-pip
pip3 install -U pip
dnf install ansible
apt install python3-pip
pip3 install -U pip
apt install ansible
pip install -U 'ansible==5.*'
命令安装合适的版本。
创建 Kolla 配置文件夹:
sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla
创建 Ansible 配置:
mkdir -p /etc/ansible
cat >> /etc/ansible/ansible.cfg << EOF
[defaults]
host_key_checking=False
pipelining=True
forks=100
EOF
安装 Kolla Ansible 以及 Docker、Python-OpenStackClient
pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/master
pip install git+https://opendev.org/openstack/kolla-ansible@master docker
cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp /path/to/venv/share/kolla-ansible/ansible/inventory/* .
pip3 install python-openstackclient -c https://releases.openstack.org/constraints/upper/master
pip3 install git+https://opendev.org/openstack/kolla-ansible@master docker
cp -r /usr/local/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp /usr/local/share/kolla-ansible/ansible/inventory/* .
配置文件详解
Inventory
前面提到过,Kolla 部署为 容器化 部署,服务充分解耦,可以很方便的部署到不同的位置。同时,Kolla 还将服务划分了不同的领域,方便运维人员快速部署服务。总的来说 Kolla 分为了 6 大领域:
- Control 控制节点
- Network 网络节点
- Compute 计算节点
- Storage 储存节点
- Monitoring 监控节点
- Deployment 部署节点
表现在配置文件中可以看到,配置文件被注释分为了三部分:
- 初始 6 大领域,定义了有哪些物节点以及怎么连接到这些节点
- 对于每一个服务(在 OpenStack 体系中被定义为 Project),例如
nova
、neutron
,定义它们运行在哪些领域 - 对于每一个服务具体的模块,定义它们运行在哪一个服务下,例如
nova-scheduler
、nova-novncproxy
,运行在nova
服务下
总的来看,这三个层次越往下粒度越小,甚至可以精准到每一个具体的服务,可谓是很贴心了。
global.yml
我们需要修改以下设置使得 OpenStack Core 可以运行:
修改 Kolla 镜像为基于 Ubuntu,你也可以选择基于 CentOs 或其它:
kolla_base_distro: "ubuntu"
修改安装类型为源码安装:
kolla_install_type: "source"
修改内部网络使用的网卡:
network_interface: "eth0"
修改外部网络使用的网卡:
neutron_external_interface: "eth1
修改内部网络地址为 eth0
上一条未被占用的 IP:
kolla_internal_vip_address: "10.10.10.254"
enable_haproxy
为 no
来关闭负载均衡功能,同时设置 kolla_internal_vip_address
为 物理机 IP,来节省 IP 资源。
根据上一章的构想,我们还需要启动以下服务:
- Aodh:用于提供告警服务
enable_aodh: "yes"
- Ceilometer:用于提供监控服务
enable_ceilometer: "yes"
- Cinder:用于提供储存服务
enable_cinder: "yes"
- Gnocchi:用于为 Ceilometer 提供时序化的储存服务
enable_gnocchi: "yes"
enable_neutron_qos: yes"
和enable_port_forwarding: "yes"
来启用 三层网络 QOS 和 三层网络端口转发
如果你想更改可用区名称,请设置:
openstack_region_name: "EastChina"
激动人心的部署
使用如下命令来生成集群密码文件用于部署服务:
kolla-genpwd
kolla-ansible -i ./${inventory} bootstrap-servers
kolla-ansible -i ./${inventory} prechecks
kolla-ansible -i ./${inventory} deploy
就是嘛,有什么必要 PreCheck!
kolla-ansible -i ./${inventory} deploy
安装成功后,请输入:
kolla-ansible post-deploy
来生成必须的 admin-openrc.sh
身份验证文件来连接到 OpenStack 集群:
. /etc/kolla/admin-openrc.sh
你也可以用 cat admin-openrc.sh
来查看登录 Horizon 的账号密码。
You are free to use the following
init-runonce
script for demo purposes but note it does not have to be run in order to use your cloud. Depending on your customisations, it may not work, or it may conflict with the resources you want to create. You have been warned.运行:
/path/to/venv/share/kolla-ansible/init-runonce
/usr/local/share/kolla-ansible/init-runonce
来生成默认的网络、规格等配置。如上个提示所示,这不是必须的且有可能会生成你不需要的数据。如果你需要其中的数据,如:规格,建议先编辑 init-runonce
文件,修改以下内容:
# This EXT_NET_CIDR is your public network,that you want to connect to the internet via.
ENABLE_EXT_NET=${ENABLE_EXT_NET:-1}
EXT_NET_CIDR=${EXT_NET_CIDR:-'10.0.2.0/24'}
EXT_NET_RANGE=${EXT_NET_RANGE:-'start=10.0.2.150,end=10.0.2.199'}
EXT_NET_GATEWAY=${EXT_NET_GATEWAY:-'10.0.2.1'}
重新定义 L3 公有网络为你当前的网络环境。
以及修改其它配置项为你想要的配置,在此不再赘述。
结语
通过对 Kolla Ansible 的简单配置,我们可以很方便的部署出来一个强壮的云计算集群来实现各种云计算需求。但是,这还远远不够,OpenStack 是一个庞大的项目,想要实现更好的使用,还需要更多的探索与实践。
撒花~
2 条评论
关于配置文件这段内容,这个是怎么看出来的? “表现在配置文件中可以看到,配置文件被注释分为了三部分。。。”可以用具体的配置文件来举一个例子说明吗?
以 All-in-one 为例:
These initial groups are the only groups required to be modified. Theadditional groups are for more control of the environment.
[control]
localhost ansible_connection=local
[network]
localhost ansible_connection=local
[compute]
localhost ansible_connection=local
[storage]
localhost ansible_connection=local
[monitoring]
localhost ansible_connection=local
[deployment]
localhost ansible_connection=local
指定了每一台机器从宏观上被设定为作为什么角色,如:控制节点、网络节点。
You can explicitly specify which hosts run each project by updating thegroups in the sections below. Common services are grouped together.
[common:children]
control
network
compute
storage
monitoring
[collectd:children]
compute
[baremetal:children]
control
[tls-backend:children]
control
[grafana:children]
monitoring
[etcd:children]
control
[kafka:children]
control
[kibana:children]
control
[telegraf:children]
compute
control
monitoring
network
storage
[elasticsearch:children]
control
[hacluster:children]
control
[hacluster-remote:children]
compute
[loadbalancer:children]
network
[mariadb:children]
control
[rabbitmq:children]
control
[outward-rabbitmq:children]
control
[monasca-agent:children]
compute
control
monitoring
network
storage
[monasca:children]
monitoring
[storm:children]
monitoring
[keystone:children]
control
[glance:children]
control
[nova:children]
control
[neutron:children]
network
[openvswitch:children]
network
compute
manila-share
[cinder:children]
control
[cloudkitty:children]
control
[freezer:children]
control
[memcached:children]
control
[horizon:children]
control
[swift:children]
control
[barbican:children]
control
[heat:children]
control
[murano:children]
control
[ironic:children]
control
[influxdb:children]
monitoring
[prometheus:children]
monitoring
[magnum:children]
control
[sahara:children]
control
[solum:children]
control
[mistral:children]
control
[manila:children]
control
[gnocchi:children]
control
[ceilometer:children]
control
[aodh:children]
control
[cyborg:children]
control
compute
[tacker:children]
control
[vitrage:children]
control
[senlin:children]
control
[trove:children]
control
[watcher:children]
control
[octavia:children]
control
[designate:children]
control
[placement:children]
control
[bifrost:children]
deployment
[zookeeper:children]
control
[zun:children]
control
[skydive:children]
monitoring
[redis:children]
control
[blazar:children]
control
[venus:children]
monitoring
这一部分指定了每一个服务,如 common(即 OpenStack 核心服务)、nova、glance 等具体放到哪一个宏观的节点上,如默认 nova 放到 control 节点上
剩下一部分到结尾是更加精细的组件控制,指定每个服务:以 OpenVSwitch 为例,如ovn-nb/sb-db放到哪一个节点上
OωO