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 解决。
#节点规划
VMWare 提供三台(或者更多)Ubuntu22.04 Live Server 下载链接 (opens new window)服务器
- 一台作为 openstack 的 manager 管理节点,上面跑了 openstack 的 keystone 身份认证和 RabbitMQ、etcd等基础组件,是 openstack 的命根子。往后的集群扩容都要连接 manager 的。CPU核心要足够用,内存要足,网速还要好。存储要求不高,只要一个系统盘,100GB也就够了。
- 一台作为计算节点,是专门运行云服务器的。计算节点的特点是cpu核心和内存要大。存储几乎没要求,云服务器的系统盘和块存储、对象存储、镜像快照存储都由另一台节点提供。
- 一台作为存储节点,上面运行 cinder、glance、swift等openstack存储组件。所以这类存储节点的特点就是磁盘大,网络快(不然虚拟机访问他的系统盘岂不是特别卡?)。
注意
后期采用 ceph 提供存储
kvm提供虚拟化方案(题外话)
#虚拟机硬件规划
系统镜像使用 Ubuntu22.04 Live Server,每个虚拟机都是用之前创建的这两个虚拟网卡。
我这里使用3+1机器演示: 1 x 部署机:10.10.1.80/24 节点01:10.10.1.81/24 control01 节点02:10.10.1.82/24 control02 节点03:10.10.1.83/24 control03
#OS安装完成后的系统配置更改
# 修改root密码 sudo passwd root 新密码:root # 修改ip # 可以图形化修改,以下是命令行修改ip ip -a # 查看网络接口名 # 编辑netplan。以第一台的配置为例 vim /etc/netplan/01-network-manager-all.yaml ------------------------------------------------ network: version: 2 renderer: NetworkManager # 新增 ethernets: ens1: # 这是第一个网络设备名,这个设备名是通过ip a 命令获取的。 dhcp4: no addresses: [10.0.0.201/24] optional: true gateway4: 10.0.0.1 nameservers: addresses: [10.0.0.1] ens2: # 这是第二个网络设备名 dhcp4: no addresses: [192.168.100.201/24] optional: true gateway4: 192.168.100.1 nameservers: addresses: [192.168.100.1] # 关闭防火墙 ufw disable # 修改清华源镜像 cp /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.list << EOF #替换为下面的 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse # deb-src http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse EOF # 更新系统包 apt -y update && apt -y full-upgrade apt -y install ssh vim git apt -y install python3-dev libffi-dev gcc libssl-dev vim /etc/ssh/sshd_config # 修改PermitRootLogin,允许root用户通过密码登录 PermitRootLogin yes # 重启ssh systemctl restart ssh systemctl enable ssh
#storage节点配置VG(Volume Group)
# storage节点上创建一个500GB的VG apt -y install lvm2 pvcreate /dev/vdb /dev/vdc vgcreate cinder-volumes /dev/vdb /dev/vdc
不要自己擅自安装docker!
使用kolla-ansible部署openstack前,尽量保证各个节点的操作系统纯净,不要私自安装docker,不要私自修改GPG key。否则会导致kolla-ansible无法运行,最终只能逼着你去重装系统。 kolla-ansible会自动帮我们安装全套的运行环境,包括docker!!!
#kolla安装openstack
#安装系统依赖
sudo apt install git python3-dev libffi-dev gcc libssl-dev sudo apt install python3-venv sshpass
#创建虚拟环境并激活它
mkdir /path && mkdir /path/to # 也可以自定路径 python3 -m venv /path/to/venv source /path/to/venv/bin/activate # 确保安装了最新版本的pip python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip # pypi换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 安装Ansible pip install 'ansible>=4,<6'
#安装Kolla-Ansible
# 1. kolla # pip install git+https://opendev.org/openstack/kolla-ansible@stable/yoga # 上面是原版命令,建议使用jihulab.com克隆一份 pip install git+https://jihulab.com/james-curtis/kolla-ansible@stable/yoga # 2. 创建文件夹/etc/kolla sudo mkdir -p /etc/kolla sudo chown $USER:$USER /etc/kolla # 3. 复制 globals.yml 和 passwords.yml 到 /etc/kolla # 如果你使用了自定义路径,记得替换/path/to cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla # 4. 复制清单文件 cp /path/to/venv/share/kolla-ansible/ansible/inventory/* .
#安装Ansible Galaxy依赖
#换源
找到 /path/to/venv/share/kolla-ansible/requirements.yml
--- collections: - name: https://opendev.org/openstack/ansible-collection-kolla type: git version: stable/yoga
修改这个git仓库地址,如果镜像拉不下,建议去拉github的OpenStack镜像
--- collections: - name: https://jihulab.com/james-curtis/ansible-collection-kolla type: git version: stable/yoga
#安装Kolla-Ansible-Collections依赖
kolla-ansible install-deps
#docker换源 && 指定docker版本到20.10.*
sed -i.bak 's/https:\/\/download\.docker\.com/https:\/\/mirrors\.tuna\.tsinghua\.edu\.cn\/docker-ce/g' /root/.ansible/collections/ansible_collections/openstack/kolla/roles/baremetal/defaults/main.yml sed -i.bak 's/_package: "docker-ce"/_package: "docker-ce=5:20.10*"/g' /root/.ansible/collections/ansible_collections/openstack/kolla/roles/baremetal/defaults/main.yml
#配置Ansible
mkdir /etc/ansible echo "[defaults] host_key_checking=False pipelining=True forks=100" > /etc/ansible/ansible.cfg
#准备初始化配置
单机部署可以去 OpenStack 官网查看
对于all-in-one虚拟环境中的场景,将以下内容添加到all-in-one清单的最开头
localhost ansible_python_interpreter=python
#修改配置文件(注意配置文件不要照搬)
# These initial groups are the only groups required to be modified. The # additional groups are for more control of the environment. [all:vars] ansible_user=root ansible_password=root [control] # These hostname must be resolvable from your deployment host control01 ansible_user=root control02 ansible_user=root control03 ansible_user=root # The above can also be specified as follows: # control[01:03] ansible_user=kolla # The network nodes are where your l3-agent and loadbalancers will run # This can be the same as a host in the control group # [network] # network01 # network02 # when you specify group_name:children, it will use contents of group specified. [network:children] control # [compute] # compute01 [compute:children] control [monitoring:children] control # [monitoring] # control01 ansible_user=root ansible_password=1 ansible_become=true # monitoring01 # When compute nodes and control nodes use different interfaces, # you need to comment out "api_interface" and other interfaces from the globals.yml # and specify like below: #compute01 neutron_external_interface=eth0 api_interface=em1 storage_interface=em1 tunnel_interface=em1 # [storage] # storage01 [storage:children] control [deployment] deploy ansible_connection=local
#修改 hosts
# 这里是deploy机器上的文件 127.0.0.1 localhost 10.10.1.80 deploy 10.10.1.81 control01 10.10.1.82 control02 10.10.1.83 control03
#配置ssh密钥对
apt install sshpass -y ssh-keygen # 一路回车 ssh-copy-id 10.10.1.81 # 注意替换自己的内网ip 输入yes同意指纹,然后输入密码。就可以了
#检查清单配置是否正确
ansible -i multinode all -m ping
成功效果
(venv) root@ubuntu:~# ansible -i multinode all -m ping [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details localhost | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } control01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
#生成密码
生成所有组件依赖的密码,保存在 /etc/kolla/passwords.yml
kolla-genpwd
#配置globals.yml
建议拷贝出来修改
vim /etc/kolla/globals.yml :set number # 显示行号
#1. 修改基础镜像发行版
sed -i.bak 's/#kolla_base_distro: "centos"/kolla_base_distro: "ubuntu"/' /etc/kolla/globals.yml
#2. 编辑网络接口
设置的第一个接口是“ Network_interface”。这是多个管理类型网络的默认接口。
network_interface: "eth0" # 替换为自己的网口
所需的第二个接口专用于Neutron外部(或公共)网络,可以是vlan或flat,这取决于网络的创建方式。此接口应处于活动状态,没有IP地址。否则,实例将无法访问外部网络。
neutron_external_interface: "eth1" # 替换为自己的网口
提示
neutron_external_interface 是指在 OpenStack 中的 Neutron 网络服务中,用来定义 OpenStack 实例(Instance)访问外部网络(external network)的接口(interface)。
在 OpenStack 中,外部网络通常是指与 Internet 连接的物理网络或虚拟网络,例如一个公共云提供商的公共网络。如果您想要使 OpenStack 实例能够访问 Internet 或其他外部网络,您需要配置 neutron_external_interface 来建立连接。
具体而言,在 OpenStack 中,neutron_external_interface 通常是通过配置路由器(router)和浮动 IP (Floating IP)地址来实现的。它定义了与外部网络相连的网络接口和 IP 地址范围,并为 OpenStack 实例分配公网 IP 地址,以便它可以被外界访问。
当您在 OpenStack 中配置完 neutron_external_interface 之后,您可以使用浮动 IP(Floating IP)来映射 OpenStack 实例的内部 IP 地址到公网 IP 地址,使得 OpenStack 实例能够被外部网络直接访问。这样,您就可以通过互联网访问您的 OpenStack 实例,并提供服务给外界用户。
#3. 搜索并设置浮动ip
接下来,我们需要为管理流量提供浮动IP。该IP将由keepalive管理,以提供高可用性,并且应设置为在连接到我们网络接口的管理网络中不使用的地址。
kolla_internal_vip_address: "10.1.0.250"
#部署
#1. docker quay.io换源
sed -i.bak 's/#docker_registry:/docker_registry: quay.nju.edu.cn/g' /etc/kolla/globals.yml
#2. 引导服务器
kolla-ansible -i ./multinode bootstrap-servers
此步骤会在家目录下生成 .ansible 文件夹,并将配置文件和清单文件复制在这里
Docker 版本检查(确保Server: Docker Engine版本在20.10.xx就行)
(venv) root@ubuntu:~# docker version Client: Docker Engine - Community Version: 23.0.0 API version: 1.41 (downgraded from 1.42) Go version: go1.19.5 Git commit: e92dd87 Built: Wed Feb 1 17:47:51 2023 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 20.10.23 API version: 1.41 (minimum version 1.12) Go version: go1.18.10 Git commit: 6051f14 Built: Thu Jan 19 17:42:57 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.16 GitCommit: 31aa4358a36870b21a992d3ad2bef29e1d693bec runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0
#3. 对主机进行部署前检查
这里会花一些时间,耐心等待(主要是配置环境和拉取依赖,比如 Docker),前置步骤没有错误的话,这里应该可以通过,如果出现问题按照问题逐个解决即可
kolla-ansible -i ./multinode prechecks -vvv
#4. 最后进行实际的 OpenStack 部署
这里会花更多时间(主要看 global.yml 开启多少功能),耐心等待,在这一步骤会拉取镜像并启动
kolla-ansible -i ./multinode deploy -vvv
#使用 OpenStack
#1. 安装 OpenStack CLI 客户端
可以在这里自行替换
pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/yoga # pip install python-openstackclient -c https://jihulab.com/james-curtis/requirements/-/raw/stable/yoga/upper-constraints.txt # 换源的
#2. OpenStack 需要一个 openrc 文件
kolla-ansible post-deploy . /etc/kolla/admin-openrc.sh # 可以写到环境变量中 echo source /path/to/venv/bin/activate >> ~/.bashrc echo source /etc/kolla/admin-openrc.sh >> ~/.bashrc
#安装 skyline 面板
在有容器的机器上执行,一般推荐在控制节点上都运行一个
创建文件夹
mkdir /etc/skyline && touch /etc/skyline/skyline.yaml
填充配置文件(需要修改 database_url,keystone_url,system_user_password)
配置文件
#创建数据库
因为是用 kolla 创建的数据库
数据库密码
cat /etc/kolla/passwords.yml |grep ^database_password
docker exec -it mariadb bash # 1.连接到数据库 mysql -uroot -p数据库root用户密码 # 2.创建skyline数据库 CREATE DATABASE IF NOT EXISTS skyline DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; # 3.创建skyline数据库用户,并设置密码为 SKYLINE_DBPASS GRANT ALL PRIVILEGES ON skyline.* TO 'skyline'@'localhost' IDENTIFIED BY 'SKYLINE_DBPASS'; GRANT ALL PRIVILEGES ON skyline.* TO 'skyline'@'%' IDENTIFIED BY 'SKYLINE_DBPASS';
#创建服务凭证
openstack user create --domain default --password SKYLINE_PASS skyline openstack role add --project service --user skyline admin
#运行 skyline_bootstrap 容器进行初始化引导
# 进行初始化 docker run -d --name skyline_bootstrap -e KOLLA_BOOTSTRAP="" -v /etc/skyline/skyline.yaml:/etc/skyline # 检查日志输出结尾是否是"exit 0" docker logs skyline_bootstrap
#运行 skyline 服务
# 删除引导容器 docker rm -f skyline_bootstrap # 启动skyline服务容器 docker run -d --name skyline --restart=always -v /etc/skyline/skyline.yaml:/etc/skyline/skyline.yaml --net=host 99cloud/skyline:latest