使用kolla安装多节点OpenStack

 

 

前言:

长久以来 OpenStack 部署难、 升级难的问题经常为人诟病,简单、便捷、高效的部署升级方案是所有 OpenStack 用户(客户、云服务提供商、开发者)的共性刚需。Kolla 正是应需而生,它基于社区的最佳实践,提出了可靠、可扩展的生产级别 OpenStack Service Containers 部署方式。

简单来说,Kolla 就是充分应用容器特性,实现容器化部署 OpenStack 服务的 DevOps 工具。

Kolla 显著的特点是「开箱即用」和「简易升级」,前者由编排工具(Ansible/Kubernetes)提供自动化支撑,后者则完全是 Container 的功劳。Kolla 追求为每一个 OpenStack Service 都构建相应的 Container,将升级/回滚的粒度(隔离依赖关系集)降维到 Service 或 Project 级别,实现升级/回滚的原子性。假若升级失败,则直接启动 Old Version Container 完成回滚。版本升级只需三步:

  1. Pull New Docker Image

  2. Stop Old Docker Container

  3. Start New Docker Container

除此之外,Kolla 还提供了定制化部署拓扑的能力,允许用户花费更小的学习和试错成本,逐渐摸索演变出适合自己的部署架构蓝图。

众所周知,容器技术具有非常优秀的应用部署敏捷性和效率,其中以 Docker 和 Kubernetes 作为构建容器化应用程序的主要标准,是最受欢迎的容器技术选型。Kolla 社区紧贴用户,将 Kolla Project 逐渐解耦成为了三个产品。由 Kolla 负责构建镜像,由 Kolla-ansible/Kolla-kubernetes 负责部署,而且 Kolla-kubernetes 还兼具着容器管理的能力。它们之间既互相配合又能自成一家,松耦合的架构更有利于最大限度的覆盖用户多方面需求。

  • Kolla:容器镜像构建

  • Kolla-ansible:容器部署

  • Kolla-kubernetes:容器部署,容器管理

在 Queens Release,Kolla-ansible 开始支持「开发者模式」,这的确是一个令人兴奋的消息。

支持开发模式。这个对 OpenStack 的开发者很是方便。以住,开发者可能要通过 devstack 搭建完整的 OpenStack 来开发,但是部署复杂,难度高。现在 kolla-ansible 已经支持了开发模式。通过配置要开发环境的 dev_mode, 如  horizon_dev_mode: true, 那么 horizon 容器内的代码会从物理机上挂载进去,开发者对代码修改后,就可以直接看到修改后的效果。十分方便。
 from:
 99Cloud 雷神(Kolla PTL)

详细请参考:
https://docs.openstack.org/kolla-ansible/latest/contributor/kolla-for-openstack-development.html

虽然,现在开发模式支持的项目还比较有限,但社团贡献者已经提交了 BluePrint,相信很快就能支持大部分核心项目了。
BP:https://review.openstack.org/#/c/560969/

在本文中,我们以 Kolla & Kolla-ansible 的组合,介绍如何轻松的部署出一套 OpenStack 环境。


本文所需要的镜像为陈沙克老师公司制作好的一个镜像文件,直接下载来使用

云盘地址:https://pan.baidu.com/share/init?surl=kVkilGr 密码: gcty(已经不能使用,同时注意下载下来的文件是ocata_0727.iso,而不是ocata_0525.iso,如果用老版本ocata_0525.iso部署有些问题)
按照这篇文章(http://blog.csdn.net/dylloveyou/article/details/77148560)中,部署了单节点的OpenStack环境,这次我们尝试部署一个多节点的环境(包括1个controller节点,1个compute节点,1个storage节点),之前的单节点因为已经安装了kolla-ansible和docker registry,我们把它当做部署节点。

1. 环境准备

新创建3台虚拟机,分别作为controller节点,compute节点,storage节点。其中controller节点3张网卡,compute、storage节点2张网卡。操作系统为centos7.4

如果是物理机进行安装,可以采用U盘启动,在安装的时候可能出现不能安装的现象(如不能出现安装界面),进行如下的处理:

在出现选择安装docker 或者kolla界面的时候,按tab键。

修改系统引导命令行语句为:

vmlinuz initrd=initrd.img dd linux quit

说明:通过dd命令列出列出当前可用的设备信息,找到U盘的设备信息比如为/dev/sdb1

再次重新启动按TAB键,修改修改系统引导命令行语句为:

vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb1  ..........,需要根据不同的提示修改,还可以修改管理IP和主机名等。


1)关闭Selinux和firewalld

systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state
sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config
grep --color=auto '^SELINUX' /etc/selinux/config
setenforce 0

2)设置主机名,hosts文件(各个节点

echo '

192.168.5.111 control01
192.168.5.211 controller
192.168.5.212 compute
192.168.5.213 storage
'>> /etc/host
3)storage节点加盘
storage节点新加一块磁盘,作为cinder的lvm后端
加完后重启系统,可以查看到新加的磁盘

[root@storage ~]# fdisk -l
创建pv、vg

[root@storage ~]# pvcreate /dev/vdb
  Physical volume "/dev/sdb" successfully created.
[root@storage ~]# vgcreate cinder-volumes /dev/vdb
  Volume group "cinder-volumes" successfully created
修改配置
vi /etc/lvm/lvm.conf
修改 devices 下面的
filter = [ "a/vda/", "a/vdb/", "r/.*/"]
注意;需要根据自己实际调整
 重启lvm服务
systemctl restart lvm2-lvmetad.service
4)确认节点配置

controller 3 张网卡
compute 2 张网卡
storage 2 张网卡(其实一张即可,因为不需要tunnel网络)
storage 2 块硬盘

2.安装docker和相关文件(各个节点执行)

1)加入Docker的repo源

# tee /etc/yum.repos.d/docker.repo << 'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
2)安装Docker 1.12.6
注意:不要安装新版本,新版本后面检查不会通过
yum install docker-engine-1.12.6 docker-engine-selinux-1.12.6 -y

3)设置Docker
mkdir /etc/systemd/system/docker.service.d
tee /etc/systemd/system/docker.service.d/kolla.conf << 'EOF'
[Service]
MountFlags=shared
EOF

4)编辑/usr/lib/systemd/system/docker.service文件

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.5.77:4000

5)重启Docker服务
systemctl enable docker
systemctl daemon-reload
systemctl restart docker

6)安装 python-docker-py

yum install python-docker-py

3.配置免密登录

部署节点和其他节点免密登陆

[root@control01 ~]# ssh-keygen
[root@control01 ~]# ssh-copy-id controller
[root@control01 ~]# ssh-copy-id compute
[root@control01 ~]# ssh-copy-id storage

4.部署OpenStack

1)停止部署节点容器

因为部署节点之前已经部署了All in One的OpenStack,为了降低虚拟机的资源占用,先停止本节的的OpenStack相关容器。如果资源充足,可以不用停止

[root@control01 ~]# cd /root/kolla-ansible-4.0.3.dev36/tools/
[root@control01 tools]# . kolla-ansible stop

查看只剩registry容器在运行

[root@control01 tools]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
b18c5accabc2        registry            "/bin/registry serve "   3 months ago        Up 22 minutes       0.0.0.0:4000->5000/tcp   registry

2)修改multinode文件

[root@control01 ~]# cd /root/kolla-ansible-4.0.3.dev36/
[root@control01 kolla-ansible-4.0.3.dev36]# cp ansible/inventory/* /home/
[root@control01 ~]# cd /home
[root@control01 home]# ls
all-in-one  multinode
[root@control01 home]# cp multinode mymultinode
[root@control01 home]# vi mymultinode

[control]
controller  
[network]
controller
[compute]
compute
[monitoring]
controller
[storage]
storage
......

里面的内容很好理解,表示一个控制节点 controller,网络节点也安装到控制节点,一个计算节点 compute ,一个存储节点 storage,后面的部分不用修改

3)修改global和password配置文件

[root@control01 ~]# cd /etc/kolla/
[root@control01 kolla]# vi globals.yml

kolla_internal_vip_address: "192.168.5.211"    外部访问地址,如果是非HA环境,是控制节点IP

docker_registry: "192.168.5.111:4000"   镜像库,用部署节点的镜像库
docker_namespace: "99cloud"                 

network_interface: "eth0"   网络接口,默认就这一个接口,这里我们以eth0作为API网络                    
api_interface: "{{ network_interface }}"   用的是eth0
tunnel_interface: "eth1"                   eth1作为vxlan的承载网络
neutron_external_interface: "eth2"          eth2作为外部网络

enable_cinder: "yes"                启用cinder
enable_cinder_backend_lvm: "yes"    cinder后端用lvm
cinder_volume_group: "cinder-volumes"  

enable_haproxy: "no"   不启用haproxy

[root@control01 kolla]# vi passwords.yml
keystone_admin_password: admin  admin用户登录密码
4)部署前检查
[root@control01 ~]# cd /root/kolla-ansible-4.0.3.dev36/tools/
[root@control01 ~]# . kolla-ansible prechecks -i /home/mymultinode

5)部署

[root@control01 tools]# . kolla-ansible deploy -i /home/mymultinode

开始部署,经过漫长的等待,部署完成,一般不会有什么问题,如果有问题,则需要根据报错及容器日志查找原因
登录dashboard
http://192.168.5.211  输入用户名admin 和密码admin
登录系统,查看各个服务正常,表明部署成功。
可以通过docker ps命令查看各个节点运行的容器

5.在控制节点安装OpenStack 相关命令

yum -y install gcc
yum install python-devel.x86_64
pip install --upgrade pip
pip install -U python-openstackclient
pip install -U python-neutronclient

pip install python-glanceclient

6  问题处理
1)如果docker版本冲突,卸载原来的版本,重新进行安装
yum list installed | grep docker
根据查询结果卸载,如
yum -y remove docker-ce.x86_64
用上面命令,可能卸载不干净,使用以下的命令卸载,可能还是卸载不干净
yum -y remove docker
需要根据安装的过程提示进行卸载
如:yum remove container-selinux-2.36-1.gitff95335.el7.noarch
安装成功
2) 使用命令行的时候的环境配置文件
echo '
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
' >> /root/admin-openstack.sh
source admin-openstack.sh
3) 日志文件的位置
部署后openstack服务日志存放目录/var/lib/docker/volumes/kolla_logs/_data/
4)docker 问题定位
    docker exec -it heka bash
    docker logs container-name

5)镜像文件的位置经过如下的命令可以查找

[root@control01 ~]# find / -name e200afd1-231b-4ed5-8c73-b361b71ee1a3
/var/lib/docker/volumes/glance/_data/images/e200afd1-231b-4ed5-8c73-b361b71ee1a3

在目录/var/lib/docker/volumes/glance/_data/images下。

跟/etc/kolla/glance-api/glance-api.conf中的配置filesystem_store_datadir = /var/lib/glance/images/没有关系

6)采用kolla安装的采用的是open vswitch,进行安装后在主机控制节点上使用ifconfig,没有默认的三个网桥br-ex,br-int和br-tun,应该使用docker exec -it openvswitch_vswitchd /bin/bash进入到openvswitch容器(如果要退出就:Ctrl-D或exit),使用命令ovs-vsctl show查看,可以看到上述的三个网桥。

br-ext 连接外部网络的网桥

br-int 集成网桥。所有instance的虚拟网卡和其他虚拟网络设备都将连接到该网桥

br-tun 隧道网桥,基于隧道技术的VxLAN和GRE网络将使用该网桥进行通信

注意:计算节点上没有br-ext

 

 

可以使用如下的命令

ovs-vsctl list-br 查看网桥

ovs-vsctl list-ports br-ex  查看网桥上的端口

 

 

可以看出集成网桥和br-ext和br-tun是相连的。

当从从界面上添加网络并添加子网后,dhcp port的端口连接到了br-int,可以在容器里面看到port的类型为tap,在控制节点用ifconfig命令不能看见。每生成一个虚拟机在控制节点上(我的虚拟机在控制节点)多4个interface。第一个:tap interface命名为tapxxx;第二个 :linuxbridege,命名为qbrxxx;第三个:veph pair 命名为qvbxxx;第四个:veph pair 命名为qvoxxx。在openvswitch容器里面看增加了qvoxxx连接到了br-int上。上述连接保证了通信畅通。

 

7 相关知识

kolla部署流程
规划:
节点的规划和容器的分布由inventory控制,/usr/share/kolla/ansible/inventory目录下的all-in-one和multinode,如果你想单节点部署,你需要指定all-in-one,如果是多节点部署,你需要指定multinode。你可以根据实际需求修改all-in-one或multinode。
配置:
变量的配置
关于部署的很多变量存放在/usr/share/kolla/ansible/group_vars/all.yml(这里面的变量有一部份与/etc/kolla/globals.yml里面的配置冲突,这些冲突的配置项以globals.yml里面的配置为准),使用这些变量值来替换playbook里面的对应的变量,控制playbook的最终结果。这些playbook主要分为4类default代表默认的一些配置,meta代表依赖于哪个playbook,task代表具体的部署任务,template代表模板,主要包含容器的配置文件,以及容器启动时的一些初始化操作,主要是拷贝配置文件和启动该容器对应的服务
节点的配置
各个角色节点安装好操作系统后,必须要安装docker以及添加配置,修改hostname,网卡配置,如果这里出现问题,下一步的检测会报错。值得注意的是,像将存储后端改成ceph,会对存储节点的磁盘进行些配置,但是检测貌似没有关于这方面的任务,如果采用kolla部署,肯定需要对检测的playbook进行完善。
注:这些操作我是手动执行的,然而kolla在3.0.0及以上的版本提供了deploy-bifrost,deploy-servers两个命令行参数来分别启用一个bifrost的容器和通过bifrost来对节点进行自动化的配置。至于效果怎么样,我没试过。
检测:
kolla提供了一个检测命令,可以对各个角色节点进行一些检测,主要是包版本检测:docker-py,Ansible;端口检测:所有容器配置的监听端口是否已经被占用;服务检测:这里检测的就比较杂了,比如libvirt是否在运行,如果运行就会报错,比如Docker版本是否满足要求等等,你可以查看/usr/share/kolla/ansible/roles/prechecks/tasks下面的playbook,知道所有的检测项。当检测出错时,你就需要根据出错的信息,对某些角色的节点进行些修改配置。
检测通过,下面的部署不一定成功,但检测没通过,下面的部署是肯定失败的。
部署:
如果上面的步骤没问题,只需执行kolla-ansible的相关命令就可以自动完成部署并启动相关容器以及容器里面对应的服务
清理:
在某些情况下,可能需要对环境中的容器,镜像,甚至节点上的所有关于kolla的配置,进行清理,可以使用kolla-ansible destory的子命令对环境清理
扩展:
kolla增加节点理论上很简单,只需要两步,一是修改对应的inventory,二是对待添加节点做好部署前的准备工作。由于资源的关系,并未做过相关的测试。
kolla开发流程
修改配置:
修改某个容器:
通过修改对应节点/etc/kolla/目录下对应的服务的配置文件,然后重启对应的容器,就可以修改相关配置
修改多个容器:
通过修改部署节点上/usr/share/kolla/ansible/roles相关目录下配置文件的模板和/etc/kolla/globals.yml,以及/usr/share/kolla/ansible/group_vars/all.yml,然后执行kolla-ansible的子命令reconfigure,可以修改相关容器的配置。
注意:这种方式会将所有容器的配置重新覆盖一次,所有容器都会重启一次
修改代码:
1.基于改动的容器生成新的镜像:
直接修改容器里面的代码,然后使用docker commit基于你改动的容器,重新制作一个镜像,指定一个合适的tag(即容器镜像的版本),最后上传到镜像仓库。
缺点:由于docker分层存储的特性,每基于改动的容器进行一次commit,就会生成一层新的layer,layer无法删除,过多的layer会导致容器镜像的体积越来越庞大
2.基于Dockerfile重新制作的镜像:
由于采用源码的方式安装相关的第三方库,我们可以在git上维护相关的所有代码,在我们提交新的commit的时候,通过拉取新的源码,重新用Dockerfile制作镜像。一般来说Dockerfile都不需要变化。
3.直接以root用户登录到容器修改代码:
docker exec -u 0 -it <container_name> bash
1
注意:当移除旧的容器,如果简单的执行docker run的相关命令启动一个新的容器会出错,原因是启动容器时会做些初始化的操作,由于涉及到文件的拷贝,所以会出现缺少相关文件的报错。而启动容器以及容器的初始化的操作由kolla_toolbox来执行,具体的由kolla_toolbox里的/usr/local/bin/kolla_start 和 /usr/local/bin/kolla_set_configs来控制。至于如何以新的容器镜像成功的启动一个新的容器,还需要测试。
环境升级:
可以通过修改/etc/kolla/global.yml里面openstack-release的参数,然后执行kolla-ansible upgrade的子命令升级环境.
注意:
1.如果在虚拟环境(virt_type: qemu)升级libvirt,可能会失败.
2.libvirt的升级还需要进一步验证。
回滚:
上游没有关于回滚的操作描述,不过回滚的流程跟升级差不多
kolla上游bug统计
Kolla 2.0.3
Importance: 29 Critical,15 High,4 Medium,2 Low,15 Undecided
Status: 7 New, 2 Incomplete, 9 Invalid, 4 Won’t Fix, 13 Confirmed, 2 Triaged, 2 In Progress, 14 Fix Committed, 12 Fix Released
Kolla 3.0.2
Importance: 11 Critical,16 High,2 Medium,24 Undecided
Status: 6 New, 2 Incomplete, 3 Invalid, 5 Confirmed, 4 Triaged, 4 In Progress, 26 Fix Committed, 3 Fix Released
附加
1.docker容器的健康检测
https://github.com/docker/docker/pull/23218/commits
https://blog.newrelic.com/2016/08/24/docker-health-check-instruction/
2.docker重新部署单个服务
比如:当我们对一个容器的镜像进行修改后,需要替换掉旧的容器,由于容器只有一个,不可能因此重新更新整个环境。
https://docs.docker.com/docker-cloud/apps/service-redeploy/





 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值