kolla 多节点部署 openstack

时间:2023-01-17 00:57:17

kolla 介绍

简介

kolla 的使命是为 openstack 云平台提供生产级别的、开箱即用的交付能力。kolla 的基本思想是一切皆容器,将所有服务基于 Docker 运行,并且保证一个容器只跑一个服务(进程),做到最小粒度的运行 docker。

kolla 要实现 openetack 部署总体上分为两步,第一步是制作 docker 镜像,第二步是编排部署。因此,kolla 项目又被分为两个小项目:kolla、kolla-ansible 。

kolla 的优势 

kolla 的优势主要得益于容器技术:

  • 得益于成熟的部署工具 ansible 和 docker,部署快速且稳定。
  • 一个容器只跑一个服务,所以能将 openstack 服务控制到很小的粒度。
  • 可以以组件为单位进行升级和回滚,例如升级 nova 组件,使用 kolla-ansible -i /path/to/inventory -t nova 命令即可。
  • kolla 采用一切皆容器的基本思想,所以只需操作系统与 docker 兼容,从而规避了很多安装包依赖冲突的问题。
  • 目前 kolla 项目在社区内的热度相对较高,社区支持更好。

kolla 的缺点

  • 完全依赖于 docker ,docker 的不稳定性会给整个环境带来巨大的灾难,不过目前 docker 已经问题很少了。
  • 使用 kolla 部署好云平台后,给开发的 debug 和运维的故障排查会带来更多的复杂度,这个问题也可能通过写一个简单的 client 解决。

环境配置与需求

硬件配置:

  • 三台 8C16G50G 服务器
  • 每台服务器两块网卡
  • 第一台服务器额外挂载一块 500G 磁盘

操作系统:

  • Ubuntu 18.04.2 LTS 操作系统
  • 内核版本 4.15.0-45-generic

节点规划:

  • 三台服务器做高可用,部署 API 服务
  • 第一台服务器做为部署节点,部署 ansible、kolla-ansible、私有registry、apt源等
  • 剩余两台服务器复用,均作为计算节点和网络节点高可用

注意事项:

  • 如无特殊说明,命令默认在部署节点执行

设置主机名与 host 解析

(该步骤需在所有节点上执行)

使用 hostnamectl 设置主机名

hostnamectl set-hostname --static server-xx

配置 host 解析

cat << EOF >> /etc/hosts
172.20.xx.31 server-
172.20.xx.32 server-
172.20.xx.33 server-
172.20.xx.31 dev.registry.io
EOF

其中,dev.registry.io 是私有 registry 的域名。

部署节点配置

添加互信

安装 expect

sudo apt-get install tcl tk expect

创建脚本和主机列表文件,所有服务器密码需一样,根据实际环境,需要更改脚本里的密码

cat << EOF > ~/auto_ssh.exp
#! /usr/bin/expect # 执行ssh-keygen命令,如果需要就解注释
spawn ssh-keygen
expect "id_rsa"
send "\r"
expect "phrase"
send "\r"
expect "again"
send "\r"
interact # 做互信,假设密码为"123123"
set f [open auto_ssh_host_ip r]
while { [gets $f ip]>=0} {
spawn ssh-copy-id $ip
expect {
"*yes/no" {send "yes\r";exp_continue}
"*password:" {send "123123\r";exp_continue}
}
}
close $f
EOF

创建主机列表文件

cat << EOF > ~/auto_ssh_host_ip
server-
server-
server-
EOF

执行脚本

 expect ~/auto_ssh.exp

挂载 docker 存储目录

创建分区

fdisk /dev/sdb

分区格式化

mkfs.xfs /dev/sdb1

创建 docker 安装目录

mkdir /var/lib/docker

查询 sdb1 的 uuid

ls -l /dev/disk/by-uuid/ | grep sdb1

设置开机挂载

vim /etc/fstab (这里建议使用磁盘的 UUID 而不是磁盘名称)

#添加内容
UUID=sdb1_uuid /var/lib/docker xfs defaults

挂载与检验

mount -a
df -Th

解决依赖问题

升级索引

 for i in {31..33};do ssh server-$i "sudo apt-get update -y";done

安装 python 依赖

sudo apt-get install python-dev libffi-dev gcc libssl-dev python-selinux python-setuptools python-pip

卸载 libvirt 相关

(在所有节点执行)

kolla 的 libvirt 跑在容器里,为了避免冲突与执行报错(详见 trouble shooting 章节),建议卸载 libvirt 相关安装包:

apt remove -y `apt list --installed | grep libvirt | awk '{print $1}'`
dpkg -P `dpkg -l | grep libvirt | awk '{print $2}'`

安装 Docker

for i in {..};do ssh server-$i "sudo apt -y install docker.io";done

安装 Ansible

安装 ansible

sudo apt-get install ansible

配置 ansible

编辑 /etc/ansible/ansible.cfg 增加如下配置项

[defaults]
host_key_checking=False
pipelining=True
forks=

ansible 是无服务状态部署工具,安装配置很简单,更多配置可以参考 ansible基础-安装与配置

搭建私有 registry

如果使用公用 Docker Hub 的 registry,部署效率会受限于网速,并且有些环境是在无公网环境下,所以生产上我们会给每个环境部署私有 registry。

如果是在私有云生产的环境下,建议直接部署一个本地独立的 registry ,mirrors 通过存储介质进行拷贝传输;如果是在开发测试环境我们也可以搭建一套支持 Docker Hub 代理缓存功能的 registory,这样可以避免下载用不到的 iamge,本实验采用的就是这个方案。

另外,本实验中 registry 使用的 https 协议,CA 认证使用自签名证书;生产上搭建私有云也可以使用 http 协议,这样配置起来更加简单。

创建 CA 证书

root@server-:~# sudo mkdir -p certs && sudo openssl req -newkey rsa: -nodes -sha256 -keyout certs/domain.key -x509 -days  -out certs/domain.crt
Generating a bit RSA private key
......................++
........................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name ( letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:dev.registry.io

这里要注意 Commin Name 处必须填写私有 registry 的域名,并且建议填写域名而不使用 IP 地址。

创建 registry 配置文件

为了避免格式错误,这里建议使用 docker 命令自动生成配置文件后再修改,而不是直接复制粘贴文章中内容:

docker run -it --rm --entrypoint cat registry: /etc/docker/registry/config.yml > ~/config.yml

更改 config.yml 配置文件

version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :
headers:
X-Content-Type-Options: [nosniff]
tls:
certificate: /var/lib/registry/domain.crt
key: /var/lib/registry/domain.key
health:
storagedriver:
enabled: true
interval: 10s
threshold:
proxy:
remoteurl: https://registry-1.docker.io
# username: [username]
# password: [password]

在 http 章节添加 tls 和在最后增加 proxy 章节 ,其中 proxy 章节 username 和 password 可以缺省。

拷贝 CA 证书和配置文件

将配置文件拷贝到宿主机映射目录

mkdir -p /var/lib/docker/volumes/registry/_data/
cp ~/certs/domain.* ~/config.yml /var/lib/docker/volumes/registry/_data/

该映射目录必须与 docker run 命令中 -v 指定的目录保持一致。

运行 registry container

docker run -d --restart=always -p : --name registry  -v registry:/var/lib/registry registry:  /var/lib/registry/config.yml

因 5000 端口与 keystone 端口有冲突,所以我们使用 4000端口。

-v 代表 volume 映射关系,: 前代表本地目录,: 后代表容器中目录。本地目录可以指定绝对路径,否则就是 /var/lib/docker/volumes/ 的相对路径。

访问验证

root@server-:~# curl -Ik https://dev.registry.io:4000
HTTP/
cache-control: no-cache
date: Thu, Apr :: GMT

因为是自签名证书,这里的 curl 命令必须指定 -k 参数,否则会报错(报错中提示我们使用的是自签名证书)。

分发 CA 认证机构文件

分发到所有 docker 客户端:

# 创建配置文件
for i in {31..33};do ssh server-$i "mkdir -p /etc/docker/certs.d/dev.registry.io\:4000/";done
# 本机拷贝
cp ~/certs/domain.crt /etc/docker/certs.d/dev.registry.io\:4000/ca.crt
# 分发到其他docker客户端
cd /etc/docker/certs.d/dev.registry.io\:4000/
for i in {32..33};do scp ca.crt server-$i:`pwd`;done

验证

我们期望验证结果应该是能正常 pull 镜像:

root@server-:~# docker pull dev.registry.io:/library/ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
f476d66f5408: Pull complete
8882c27f669e: Pull complete
d9af21273955: Pull complete
f5029279ec12: Pull complete
Digest: sha256:d26d529daa4d8567167181d9d569f2a85da3c5ecaf539cace2c6223355d69981
Status: Downloaded newer image for dev.registry.io:/library/ubuntu:latest
root@server-:~# docker images
dev.registry.io:/library/ubuntu latest d131e0fa2585 hours ago 102MB

安装 kolla-ansible

克隆代码

这里注意我们使用的是 stable/rocky 分支:

git clone https://github.com/openstack/kolla-ansible -b stable/rocky

配置 kolla-ansible

安装依赖:

pip install -r kolla-ansible/requirements.txt

创建 kolla 配置文件并设置权限:

sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla

拷贝 kolla 配置文件模版:

cp -r kolla-ansible/etc/kolla/* /etc/kolla 

修改 kolla 配置文件:

cat << EOF > /etc/kolla/globals.yml
---
kolla_base_distro: "ubuntu"
kolla_install_type: "source" #使用基于源代码的image
openstack_release: "rocky" #该配置项最好与kolla-ansible分支版本保持一致
kolla_internal_vip_address: "172.20.xx.37"
docker_registry: "dev.registry.io:4000" #指定私有registry
network_interface: "ens18"
neutron_external_interface: "ens19"
enable_haproxy: "yes"
glance_enable_rolling_upgrade: "no"
nova_compute_virt_type: "qemu" #使用虚拟机部署时,该配置项必须改为qemu,默认值为kvm
EOF

生成密码文件:

#执行脚本自动生成
cd kolla-ansible/tools
./generate_passwords.py
#检验
cat /etc/kolla/passwords.yml

拷贝 ansible 主机清单文件:

cp kolla-ansible/ansible/inventory/* ~/

主机清单(inventory)文件定义了 ansible 的主机组的划分,如果是 all in one 环境那么直接使用 all-in-one 文件即可,无需修改。

如果是多节点部署,则需根据规划划分主机,本实验 inventory 配置如下:

[control]
server-[:]
[network]
server-[:]
[inner-compute]
server-[:]
[external-compute]
server-[:]
[compute:children]
inner-compute
external-compute
[monitoring]
[storage]
[deployment]
server-

验证节点连通性

ubuntu 系统可能没有预装 python 环境导致 ansible 执行报错,所以要先安装 python-dev:

ansible -i ~/multinode all -m raw -a "apt-get -y install python-dev"

使用 ping 模块验证,正常的验证结果如下:

root@server-:~/kolla-ansible/tools# ansible -i ~/multinode all -m ping
server- | SUCCESS => {
"changed": false,
"ping": "pong"
}
server- | SUCCESS => {
"changed": false,
"ping": "pong"
}
server- | SUCCESS => {
"changed": false,
"ping": "pong"
}

执行部署

Bootstrap servers

该步骤会对当前环境做一些检查与基础配置。

cd kolla-ansible/tools
./kolla-ansible -i ~/multinode bootstrap-servers

部署前检查

./kolla-ansible -i ~/multinode prechecks

执行部署

./kolla-ansible -i ~/multinode deploy

生成 keystone admin 用户环境变量文件

./kolla-ansible -i ~/multinode post-deploy
. /etc/kolla/admin-openrc.sh 

安装 openstack client

pip install python-openstackclient python-glanceclient python-neutronclient

验证

验证 nova 服务状态:

root@server-:~# nova service-list
+--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | Forced down |
+--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+
| 45e9ea96-1dbb-4db4-bece-a32bfd017b10 | nova-scheduler | server- | internal | enabled | up | --28T02::34.000000 | - | False |
| 7f54ead7-f746--9e12-ac52275cf054 | nova-scheduler | server- | internal | enabled | up | --28T02::32.000000 | - | False |
| 05619de5-2d91-4b75--98032985973b | nova-scheduler | server- | internal | enabled | up | --28T02::31.000000 | - | False |
| cc3caa03-44c4-4b83-9a14-0aa487aabd6a | nova-conductor | server- | internal | enabled | up | --28T02::37.000000 | - | False |
| ba606424-a98b-4d4b--145e59dea342 | nova-conductor | server- | internal | enabled | up | --28T02::37.000000 | - | False |
| ccb9a310--4f4b-a733-9e2a3418ca21 | nova-conductor | server- | internal | enabled | up | --28T02::34.000000 | - | False |
| c084b941-02d7-4bb6-9e45-3645a4bc9703 | nova-consoleauth | server- | internal | enabled | up | --28T02::37.000000 | - | False |
| 00b037ec--47fd-80df-c9b27854b08d | nova-consoleauth | server- | internal | enabled | up | --28T02::32.000000 | - | False |
| aa4b0a19-0ca0-45fd-b975-2458e5a11abe | nova-consoleauth | server- | internal | enabled | up | --28T02::32.000000 | - | False |
| 021cb5bc-906a-494f-9a81-70157da343ae | nova-compute | server- | nova | enabled | up | --28T02::34.000000 | - | False |
| c9432a96-43f1-4c32-9bb5-251e9609f32b | nova-compute | server- | nova | enabled | up | --28T02::37.000000 | - | False |
+--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+

验证 neutron agent 状态:

root@server-:~# openstack network agent list
+--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+
| 248d437f-b819--822d-5f689fe232e9 | Open vSwitch agent | server- | None | :-) | UP | neutron-openvswitch-agent |
| 3b06fbc0-07aa-48c7-bcd6-1af6af234563 | L3 agent | server- | nova | :-) | UP | neutron-l3-agent |
| 3dd5da59-9cd2-4d9a-b9b4-28923d509eda | DHCP agent | server- | nova | :-) | UP | neutron-dhcp-agent |
| 3e0f1625-4b46-4acd-9ae9-eb45c2445076 | Metadata agent | server- | None | :-) | UP | neutron-metadata-agent |
| -dc76--9f98-163aecb989b9 | Open vSwitch agent | server- | None | :-) | UP | neutron-openvswitch-agent |
| 962295a9--42c7-b00d-0f4413dd793e | L3 agent | server- | nova | :-) | UP | neutron-l3-agent |
| 987d1250-c1bb-457a-b28c-416027fc54a8 | Metadata agent | server- | None | :-) | UP | neutron-metadata-agent |
| b9aa55b6-4ad5--a598-38cb97828c66 | DHCP agent | server- | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+

验证 horizon 访问,这里使用 vip 访问:

kolla 多节点部署 openstack

初始化与创建虚拟机

初始化

初始化脚本会创建 cirros 镜像、网络、子网、路由、安全组、规格、配额等虚拟机资源:

. kolla-ansible/tools/init-runonce

创建虚拟机

openstack server create --image cirros --flavor m1.tiny --key-name mykey --network demo-net demo1

查看虚拟机状态:

kolla 多节点部署 openstack

最后

我们都知道,在 openstack 项目最开始的时期,部署一套 openstack 是一件很难很耗时间的事情。后续也出现了很多部署工具与配置管理工具,例如 devstack、puppet modules、fuel、openstack-ansible、TripleO 等,这些项目大大提升了 openstack 交付与配置管理的能力,但是这些项目都有明显的弊端,devstack 不太适用于生产环境,puppet 存在性能问题和开发难度问题,fuel 存在学习成本高的问题,openstack-ansible 存在架构复杂问题……

kolla 的出现给人带来不一样的感觉,代码设计简单易懂,部署迅捷,升级回滚快速高效,升级回滚粒度小等等,当然,这些优点都是得益于容器和 ansible 。

随着容器技术的流行与火热,我相信 openstack 的交付能力会搭载着容器越走越成熟,越走越长远。

参考链接

https://docs.openstack.org/project-deploy-guide/kolla-ansible/rocky/quickstart.html

https://docs.openstack.org/project-deploy-guide/kolla-ansible/rocky/multinode.html

https://blog.csdn.net/jmilk/article/details/80500234

http://www.chenshake.com/kolla-installation/

https://blog.docker.com/2015/10/registry-proxy-cache-docker-open-source/

https://www.jianshu.com/p/fc544e27b507

http://www.trystack.cn/Articles/openstack-deployment.html

Trouble shooting

问题1:
执行play “Remove apparmor profile for libvirt” 即命令 apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd 报错:
Apr 25 01:22:11 joe kernel: [78802.347760] audit: type=1400 audit(1556155331.781:35): apparmor="STATUS" operation="profile_remove" info="profile does not exist" error=-2 profile="unconfined" name="/usr/sbin/libvirtd" pid=18462 comm=“apparmor_parser"
解决:
删除所有 libvirt 软件包,主要是删除/etc/apparmor.d/usr.sbin.libvirtd 这个文件。
 
问题2:
registry 使用 http 验证时
添加上 /etc/docker/daemon.json 配置文件后, docker 起不来
解决:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

问题3:

安装 openstack-client 报错:
ERROR: Command "/usr/bin/python -u -c 'import setuptools, tokenize;__file__='"'"'/tmp/pip-install-f_wGn9/subprocess32/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/p
ip-record-m7TLg6/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-f_wGn9/subprocess32/
解决:
apt-get install -y python-subprocess32 

kolla 多节点部署 openstack的更多相关文章

  1. kolla单节点部署openstack

    virtualbox环境: 双网卡:enp0s3(桥接)   192.168.102.194 enp0s8(桥接)   无ip 块存储  50G 关闭防火墙,selinux. 配置yum源:wget  ...

  2. Ubuntu系统上双节点部署OpenStack

    安装和部署双节点OpenStack 介绍: 1.宿主机:Win10操作系统 2.在VMware下创建两台虚拟机: devstack-controller:控制节点 + 网络节点 + 块存储节点 + 计 ...

  3. Ubuntu下用devstack单节点部署Openstack

    一.实验环境 本实验是在Vmware Workstation下创建的单台Ubuntu服务器版系统中,利用devstack部署的Openstack Pike版. 宿主机:win10 1803  8G内存 ...

  4. CentOS7&period;2非HA分布式部署Openstack Pike版 (实验)

    部署环境 一.组网拓扑 二.设备配置 笔记本:联想L440处理器:i3-4000M 2.40GHz内存:12G虚拟机软件:VMware® Workstation 12 Pro(12.5.2 build ...

  5. OpenStack(四)——使用Kolla部署OpenStack多节点云

    (1).实验环境 主机名 IP地址 角色 内存 网卡 CPU 磁盘 OpenStack-con 192.168.128.110 controller(控制) 8G 桥接网卡ens32和ens33 4核 ...

  6. kolla部署openstack多节点高可用并对接ceph后端存储(17)

    部署节点执行: 安装基础包和docker yum install python-devel libffi-devel gcc openssl-devel git python-pip -y 升级一下 ...

  7. openstack kolla多节点容器化环境安装

    好久没写随笔了,6月份趁着在公司没有太忙的事儿,把公司的服务器进行了虚拟化,采用的openstack当前的容器化方案kolla. 整体安装完的感受时,小白感觉自己是个大牛!哈哈,开玩笑,由于以前是开发 ...

  8. 手动部署 OpenStack Rocky 双节点

    目录 文章目录 目录 前言 OpenStack 架构 Conceptual architecture Logical architecture 网络选型 Networking Option 1: Pr ...

  9. openstack的控制节点部署

    openstack的控制节点部署 主要是使用了本地安装的那个镜像. 会出现几个问题, 1.重启服务无法启动. 2.环境变量无法正确配置可以自己配置

随机推荐

  1. Spring in Action 学习笔记三-AOP

    面向切面的Spring 2015年10月9日 11:30             屏幕剪辑的捕获时间: 2015-10-9 14:30             屏幕剪辑的捕获时间: 2015-10-9 ...

  2. CSS中一些常见的兼容性问题

    CSS中一些兼容性问题就是浏览器兼容,而这些浏览器兼容问题主要是Ie和FF之间的争斗. CSS hack中的一些事: 我们为了让页面形成统一的效果,要针对不同的浏览器或不同版本写出对应可解析的CSS样 ...

  3. ps 进程查看器

    命令参数 a 显示所有进程 -a 显示同一终端下的所有程序 -A 显示所有进程 c 显示进程的真实名称 -N 反向选择 -e 等于"-A" e 显示环境变量 f 显示程序间的关系 ...

  4. listview中OnItemClick方法各个参数的作用

    OnItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 1.arg0,arg2 m_listview.setOnI ...

  5. python的简介及入门

    前言 为何使用Python Python 是一种效率极高的语言.与其他众多的语言相比,实现相同功能,使用Python编写的程序包含的代码更少.Python的语法简单,易上手,使用Python编写的代码 ...

  6. Pat1128&colon;N Queens Puzzle

    1128. N Queens Puzzle (20) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The & ...

  7. mysql并发控制之快照读和当前读

    上一篇简单的介绍了下MVCC(多版本并发控制)的原理,MVCC会对事物内操作的数据做多版本控制,从而实现并发环境下事物对数据写操作的阻塞不影响读操作的性能.而这个多版本控制的实现是由undo log来 ...

  8. 2019 To do List

    做好测试不是靠编程,而是靠的是严禁的作风,慎密的逻辑思维,适合的测试流程. 内心有些迷茫的时候,迷茫的是作为测试既然要学那么多编程,为什么不直接去干开发呢?学了编程,用不上,到底有什么用呢? 看了这句 ...

  9. 数据库新增&OpenCurlyDoubleQuote;自动添加”类字段 auto&lowbar;now&lowbar;add 如何不影响之前数据

    django 中的模版为例:time = models.DateTimeField('创建时间', auto_now_add=True)这样显然是不行的.那么.我们可以考虑先给前面数据一个默认值迁移一 ...

  10. &num;189 stat(动态规划)

    容易想到固定第一个排列为1~n,算出答案后乘上n!即可,但这样就离正解走远了. 考虑排列dp的一般套路,将数从大到小加入排列,这样每个位置第一次填数时(不管是第一个还是第二个排列)其贡献就确定了. 显 ...