Docker容器化再加上Ansible自动化运维工具的部署方式,构成了Kolla-Ansible项目。Kolla-Ansible的官方文档介绍了如何在在线的情况下,如何使用该项目部署Openstack。
本文详细介绍如何使用Kolla-Ansible项目,在离线的情况下,在物理机服务器上操作部署Openstack(Pike或是Queens)多节点(Multinodes)的步骤。将Kolla-Ansible转化为离线部署,主要就是yum源,python源以及docker仓库的搭建配置,有了这些离线基础,才具备离线安装部署Openstack的条件。
本文中设计的yum安装,python安装涉及的源均为自己搭建好的离线源,docker的registry本地私有仓库。其中yum源,python源以及docker仓库的搭建,参照其对应的文档,此处不详细叙述。
本文部署示例采用七台机器部署高可用(HA)的Openstack环境,分别是: monitor,controller01,controller02,controller03,computer01,computer02, computer03另外一台机器提供离线yum、python源以及docker私有仓库,主机名是source。
注:
1)controller01、controller02、controller03三个组成control角色高可用(配置三台control自动会配置成HA),同时,部署ceph分布式集群,由三台controller和三台computer共同组成storage存储。
2)源配置source主机,配有yum源、python源以及docker私有仓库。
3)网卡做bond设置,模式(mode)取4,链路聚合(LACP)。本示例中俩个万兆网卡绑定做bond0, 俩个前兆网卡绑定做bond1。bond0走openstack管理和ceph存储,bond1走虚机对外访问公开网络。
三台controller和三台computer以及monitor均执行。双网卡绑定,模式取4,链路聚合模式(LACP),俩个万兆的网卡(eth0和eth1)做bond0(有IP),俩个前兆的网卡(eth2和eth3)做bond1(无IP)。
1)bond0、eth0和eth1的配置文件如下:
ifcfg-bond0 ifcfg-eth0 ifcfg-eth1
2)bond1、eth2和eth3的配置文件如下:
ifcfg-bond1 ifcfg-eth2 ifcfg-eth3
配置修改完之后,重启网卡:
# service network restart
查看绑定结果
# cat /proc/net/bonding/bond0
# cat /proc/net/bonding/bond1
查看到的结果中,eth0、eth1和bond0的mac地址一致,eth2、eth3和bond1的mac地址一致,即可。
三台controller和三台computer以及monitor均执行。
# yum update -y
# yum install git net-tools ntp vim wget ansible gcc openssl-devel python-devel python-pip libffi-devel libselinux-python python-openstackclient python-neutronclient -y
# vi /etc/ntp.conf
如下图所示,
添加ntp时钟主备服务器,“10.109.192.4 10.109.192.42”是我们自己的时钟主备服务器,大家在安装部署中可以使用自己的时钟服务器,目的是保持各个服务器之间的时间一致,不然会导致openstack的服务异常。
server 10.109.192.4 prefer server 10.109.192.42 |
# systemctl enable ntpd.service && systemctl start ntpd.service && systemctl status ntpd.service
# ntpq -p
可以查看到同步的时间主机:
创建的虚机没有libvirtd服务,但是物理机服务器会有,这个必须要关闭。
# systemctl stop libvirtd.service && systemctl disable libvirtd.service && systemctl status libvirtd.service
# systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
# sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
或是直接修改:
# vim /etc/selinux/config
设置SELINUX=disabled ,如下图所示:
reboot之后生效。
新增Docker的Yum仓库:
# vim /etc/yum.repos.d/docker.repo
添加以下内容
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
然后清除yum,做缓存:
# yum clean all && yum makecache
安装docker:
# yum install -y epel-release
# yum install -y docker-engine docker-engine-selinux
# pip install urllib3 shade docker
使用阿里的docker镜像服务:
# mkdir -p /etc/docker
# vim /etc/docker/daemon.json
添加以下内容:
{
"registry-mirrors": ["https://7g5a4z30.mirror.aliyuncs.com"]
}
# systemctl daemon-reload && systemctl enable docker && systemctl restart docker && systemctl status docker
# docker run --rm hello-world
结果正常输出,可下载hello-world镜像即可。
添加信任source节点的Registry服务
# vim /usr/lib/systemd/system/docker.service
修改如下:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.136.138:4000
重启Docker服务:
# systemctl daemon-reload && systemctl restart docker && systemctl status docker
# curl -X GET http:// 192.168.136.138:4000/v2/_catalog
注:192.168.136.138:4000,是source主机的docker私有仓库地址和端口号。
正常如下返回数据即可:
{"repositories":["kolla/centos-source-aodh-api","kolla/centos-source-aodh-base","kolla/centos-source-aodh-evaluator","kolla/centos-source-aodh-expirer",………]}
这里单独说一下source主机的私有仓库的kolla镜像的导入。
官方文档给出的centos-source-registry-pike.tar.gz该kolla镜像包去http://tarballs.openstack.org/kolla/images/上面wget上获取。但是该网站18年3月底已经不提供获取,只有去http://hub.docker.com/u/kolla上pull,但是镜像很多,一个个pull比较麻烦,现在给出制作好的centos-source-registry-pike.tar.gz包,按照官方文档,解压到挂载目录/opt/registry/即可。
解压OpenStack Pike的Docker镜像:
# tar zxvf centos-source-registry-pike.tar.gz -C /opt/registry/
然后测试registry服务数据
# curl -X GET http:// 192.168.136.138:4000/v2/_catalog
正常如下返回数据即可:
{"repositories":["kolla/centos-source-aodh-api","kolla/centos-source-aodh-base","kolla/centos-source-aodh-evaluator","kolla/centos-source-aodh-expirer",………]}
在三台计算主机(computer01、computer02、computer03)均执行。
物理机服务器上可能存在第二块或是第三四五六块等等硬盘(未格式化,未挂载,没有使用的空白硬盘)均执行相同操作。接下来,打上Ceph标签。
首先输入以下命令,查看有哪些硬盘:
# fdisk -l
如上看到了“/dev/sdb”此块硬盘,现在为此块硬盘打上ceph标签。
# parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1
再查看结果:
如上图所示,可见“/dev/sdb”硬盘被打上“KOLLA_CEPH_OSD_BOOTSTRAP”的name标签。后续安装的时候,ceph容器安装会自动寻找这个标签进行操作。
若还存在别的硬盘也作为ceph存储,一样打上标签即可:
# parted /dev/sdc -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1
# parted /dev/sdd -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP 1 -1
Ceph_RGW需要一个健康的集群才能成功部署。在初次启动时,RGW将创建几个池。第一个池应处于运行状态以继续第二个池,依此类推。因此,在进行一体化部署的情况下,必须在部署之前更改池的默认副本数。按照需求,本示例部署选用三个池副本。
本次部署针对monitor机器和所有的computer机器(computer01、computer02、computer03)修改文件 /etc/kolla/config/ceph.conf并添加内容:
# mkdir -pv /etc/kolla/config/ && vim /etc/kolla/config/ceph.conf
修改内容如下:
[global]
osd pool default size = 3
osd pool default min size = 3
七台机器按照每台对应的角色执行如下命令修改hostname:
# hostnamectl set-hostname monitor
# hostnamectl set-hostname controller01
# hostnamectl set-hostname controller02
# hostnamectl set-hostname controller03
# hostnamectl set-hostname computer01
# hostnamectl set-hostname computer02
# hostnamectl set-hostname computer03
七台机器都修改“/etc/hosts”文件,然后reboot生效,如下图所示:
这里选取bond0的IP地址。七台机器均执行命令如下:
# cat >> /etc/hosts <
七台机器,七个节点都执行以下操作:
# ssh-keygen
然后将公钥分发给七台机器:
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@monitor
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@controller01
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@controller02
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@controller03
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@computer01
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@computer02
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@computer03
这样每个节点的authorized_keys都有monitor的公钥,授信成功。
最后在monitor上分别如下操作,均成功ssh成功即可。
# ssh monitor
# ssh controller01
# ssh controller02
# ssh controller03
# ssh computer01
# ssh computer02
# ssh computer03
以下步骤是在monitor上操作,这台是deployment机器。
本文不需要对kolla-ansible项目进行开发,使用pip方式安装,更为稳定。
ansible已经在上面安装好了,现在只需要配置即可。
# vim /etc/ansible/ansible.cfg
[defaults]
host_key_checking=False
pipelining=True
forks=100
timeout=800
deprecation_warnings=False
注:
1)host_key_checking设置为false,在ansible远程主机时就不要主机的key校验;
2)timeout设置800秒,防止后面运行剧本时候会爆超时12秒错误。
# pip install kolla kolla-ansible
配置kolla-ansible:
1)拷贝globals.yml 和passwords.yml 到 /etc/kolla 目录:
# cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/
2)拷贝kolla-ansible的主机清单文件(all-in-one和multinode):
# mkdir -pv /opt/kolla/config
# cd /opt/kolla/config
# cp -rv /usr/share/kolla-ansible/ansible/inventory/* .
特别声明,VMware虚拟机上安装需要进行此步骤,直接在物理机服务器上安装,则跳过此步骤。
虚拟机操作,使用qemu,不是kvm,进行如下修改:
# mkdir -pv /etc/kolla/config/nova
# vi /etc/kolla/config/nova/nova-compute.conf
添加以下内容:
[libvirt]
virt_type=qemu
cpu_mode = none
# kolla-genpwd
修改刚才生成的随机密码,admin的web页面的登陆密码
# vim /etc/kolla/passwords.yml
keystone_admin_password: admin
# vim /usr/share/kolla-ansible/ansible/roles/neutron/templates/ml2_conf.ini.j2
在大约41行修改成如下:
全局配置文件globals.yml包含了如下修改项:
# vim /etc/kolla/globals.yml
按照以下内容进行修改:
kolla_base_distro: "centos"
kolla_install_type: "source"
openstack_release: "queens"
docker_registry: "20.46.87.183:4000"
docker_namespace: "kolla"
kolla_internal_vip_address: "20.46.10.21"
network_interface: "bond0"
neutron_external_interface: "bond1"
neutron_plugin_agent: "openvswitch"
enable_ceph: "yes"
enable_ceph_rgw: "yes"
enable_haproxy: "yes"
enable_neutron_dvr: "yes"
enable_neutron_agent_ha: "yes"
ceph_pool_pg_num: 128
ceph_pool_pgp_num: 128
以上各项解释:
1、docker_registry: "192.168.136.137:4000",此处为配置的source的离线私有docker仓库的IP以及端口号。
2、docker_namespace: "kolla",这个是仓库镜像的统一命名空间即是前缀,我给的镜像的前缀就是“kolla/”开头的。
3、kolla_internal_vip_address: "17.17.62.2" ,这个是openstack的页面登陆地址,走的是“bond0”网卡。
4、network_interface: "bond0",这个是openstack内部的api服务都会绑定到这个网卡接口上,除此之外,vxlan和隧道和存储网络也默认走这个网络接口。
5、neutron_external_interface: "bond1",openstack的外部管理网络的网卡接口。
6、enable_ceph: "yes"和enable_ceph_rgw: "yes",选择为yes,就可默认安装ceph。
7、enable_haproxy: "yes",openstack的外部管理网络地址没有使用过,需要启用高可用proxy,确定可以使用。
8、ceph_pool_pg_num: 128和ceph_pool_pgp_num: 128,参照如下:小于5个OSD时可把pg_num设置为128
9、neutron_plugin_agent: "openvswitch"和enable_neutron_dvr: "yes",这个配置可以使创建虚机的时候,直接选择外部网络,而不需要绑定内部地址。enable_neutron_agent_ha启用,会为该虚机外部网络创建俩个dhcp分配IP,符合高可用模式。
特别说明:
此处的docker仓库配置的是自己的source源私有仓库。假如在线使用hub.docker.com的在线仓库,请参照如下配置。
docker_registry: ""
docker_namespace: "kolla"
openstack_release: "pike"
这里主要就是“docker_registry”配置为空即可。其他的如上不变。
参照:“http://tarballs.openstack.org/kolla/images/README.txt”(截图如下)
由于本文是多节点安装,则需要修改multinode文件,即可做到修改剧本执行的主机清单文件。control角色配置三台,即可做到高可用(HA)。
# vim /opt/kolla/multinode
[control]
controller01
controller02
controller03
[network]
controller01
controller02
controller03
[inner-compute]
[external-compute]
computer01
computer02
computer03
[compute:children]
inner-compute
external-compute
[storage]
controller01
controller02
controller03
computer01
computer02
computer03
[monitoring]
monitor
[deployment]
monitor
部署操作均在montior节点执行,如下:
安装之前还需要预检查一下主机环境以及配置文件是否正确。
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.136.210:35357/v3
export OS_INTERFACE=internal
export OS_IDENTITY_API_VERSION=3
export OS_REGION_NAME=RegionOne
假如不需要这个openstack环境了,可以执行如下命令进行销毁该环境:
该销毁指令,会停止并删除各台机器上运行的docker容器,但是对yum和python安装的文件以及pull的docker的images镜像文件不做变更。
安装openstack客户端,方便控制台操控。
pip安装可能存在源码冲突,这里使用yum在线安装。
即可查看安装的openstack的控制台客户端。