简介html
kolla 的使命是为 openstack 云平台提供生产级别的、开箱即用的交付能力。kolla 的基本思想是一切皆容器,将全部服务基于 Docker 运行,而且保证一个容器只跑一个服务(进程),作到最小粒度的运行 docker。node
kolla 要实现 openetack 部署整体上分为两步,第一步是制做 docker 镜像,第二步是编排部署。所以,kolla 项目又被分为两个小项目:kolla、kolla-ansible 。python
kolla 的优点 linux
kolla 的优点主要得益于容器技术:git
kolla 的缺点github
硬件配置:docker
操做系统:json
节点规划:bootstrap
注意事项:ubuntu
(该步骤需在全部节点上执行)
使用 hostnamectl 设置主机名
hostnamectl set-hostname --static server-xx
配置 host 解析
cat << EOF >> /etc/hosts 172.20.xx.31 server-31 172.20.xx.32 server-32 172.20.xx.33 server-33 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-31 server-32 server-33 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 0 0
挂载与检验
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}'`
for i in {31..33};do ssh server-$i "sudo apt -y install docker.io";done
安装 ansible
sudo apt-get install ansible
配置 ansible
编辑 /etc/ansible/ansible.cfg 增长以下配置项
[defaults] host_key_checking=False pipelining=True forks=100
ansible 是无服务状态部署工具,安装配置很简单,更多配置能够参考 ansible基础-安装与配置
若是使用公用 Docker Hub 的 registry,部署效率会受限于网速,而且有些环境是在无公网环境下,因此生产上咱们会给每一个环境部署私有 registry。
若是是在私有云生产的环境下,建议直接部署一个本地独立的 registry ,mirrors 经过存储介质进行拷贝传输;若是是在开发测试环境咱们也能够搭建一套支持 Docker Hub 代理缓存功能的 registory,这样能够避免下载用不到的 iamge,本实验采用的就是这个方案。
另外,本实验中 registry 使用的 https 协议,CA 认证使用自签名证书;生产上搭建私有云也可使用 http 协议,这样配置起来更加简单。
建立 CA 证书
root@server-31:~# sudo mkdir -p certs && sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt Generating a 4096 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 (2 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:2 /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: :5000 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: 3 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 4000:5000 --name registry -v registry:/var/lib/registry registry:2 /var/lib/registry/config.yml
因 5000 端口与 keystone 端口有冲突,因此咱们使用 4000端口。
-v 表明 volume 映射关系,: 前表明本地目录,: 后表明容器中目录。本地目录能够指定绝对路径,不然就是 /var/lib/docker/volumes/ 的相对路径。
访问验证
root@server-31:~# curl -Ik https://dev.registry.io:4000 HTTP/2 200 cache-control: no-cache date: Thu, 25 Apr 2019 11:03:53 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-31:~# docker pull dev.registry.io:4000/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:4000/library/ubuntu:latest root@server-31:~# docker images dev.registry.io:4000/library/ubuntu latest d131e0fa2585 28 hours ago 102MB
克隆代码
这里注意咱们使用的是 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-[31:33] [network] server-[32:33] [inner-compute] server-[32:33] [external-compute] server-[32:33] [compute:children] inner-compute external-compute [monitoring] [storage] [deployment] server-31
验证节点连通性
ubuntu 系统可能没有预装 python 环境致使 ansible 执行报错,因此要先安装 python-dev:
ansible -i ~/multinode all -m raw -a "apt-get -y install python-dev"
使用 ping 模块验证,正常的验证结果以下:
root@server-31:~/kolla-ansible/tools# ansible -i ~/multinode all -m ping server-33 | SUCCESS => { "changed": false, "ping": "pong" } server-32 | SUCCESS => { "changed": false, "ping": "pong" } server-31 | 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-31:~# nova service-list +--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+ | Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | Forced down | +--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+ | 45e9ea96-1dbb-4db4-bece-a32bfd017b10 | nova-scheduler | server-32 | internal | enabled | up | 2019-04-28T02:51:34.000000 | - | False | | 7f54ead7-f746-4548-9e12-ac52275cf054 | nova-scheduler | server-33 | internal | enabled | up | 2019-04-28T02:51:32.000000 | - | False | | 05619de5-2d91-4b75-8263-98032985973b | nova-scheduler | server-31 | internal | enabled | up | 2019-04-28T02:51:31.000000 | - | False | | cc3caa03-44c4-4b83-9a14-0aa487aabd6a | nova-conductor | server-32 | internal | enabled | up | 2019-04-28T02:51:37.000000 | - | False | | ba606424-a98b-4d4b-8978-145e59dea342 | nova-conductor | server-33 | internal | enabled | up | 2019-04-28T02:51:37.000000 | - | False | | ccb9a310-0067-4f4b-a733-9e2a3418ca21 | nova-conductor | server-31 | internal | enabled | up | 2019-04-28T02:51:34.000000 | - | False | | c084b941-02d7-4bb6-9e45-3645a4bc9703 | nova-consoleauth | server-32 | internal | enabled | up | 2019-04-28T02:51:37.000000 | - | False | | 00b037ec-9616-47fd-80df-c9b27854b08d | nova-consoleauth | server-33 | internal | enabled | up | 2019-04-28T02:51:32.000000 | - | False | | aa4b0a19-0ca0-45fd-b975-2458e5a11abe | nova-consoleauth | server-31 | internal | enabled | up | 2019-04-28T02:51:32.000000 | - | False | | 021cb5bc-906a-494f-9a81-70157da343ae | nova-compute | server-33 | nova | enabled | up | 2019-04-28T02:51:34.000000 | - | False | | c9432a96-43f1-4c32-9bb5-251e9609f32b | nova-compute | server-32 | nova | enabled | up | 2019-04-28T02:51:37.000000 | - | False | +--------------------------------------+------------------+-----------+----------+---------+-------+----------------------------+-----------------+-------------+
验证 neutron agent 状态:
root@server-31:~# openstack network agent list +--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+ | 248d437f-b819-4444-822d-5f689fe232e9 | Open vSwitch agent | server-32 | None | :-) | UP | neutron-openvswitch-agent | | 3b06fbc0-07aa-48c7-bcd6-1af6af234563 | L3 agent | server-32 | nova | :-) | UP | neutron-l3-agent | | 3dd5da59-9cd2-4d9a-b9b4-28923d509eda | DHCP agent | server-32 | nova | :-) | UP | neutron-dhcp-agent | | 3e0f1625-4b46-4acd-9ae9-eb45c2445076 | Metadata agent | server-33 | None | :-) | UP | neutron-metadata-agent | | 63114362-dc76-4661-9f98-163aecb989b9 | Open vSwitch agent | server-33 | None | :-) | UP | neutron-openvswitch-agent | | 962295a9-2301-42c7-b00d-0f4413dd793e | L3 agent | server-33 | nova | :-) | UP | neutron-l3-agent | | 987d1250-c1bb-457a-b28c-416027fc54a8 | Metadata agent | server-32 | None | :-) | UP | neutron-metadata-agent | | b9aa55b6-4ad5-4911-a598-38cb97828c66 | DHCP agent | server-33 | nova | :-) | UP | neutron-dhcp-agent | +--------------------------------------+--------------------+-----------+-------------------+-------+-------+---------------------------+
验证 horizon 访问,这里使用 vip 访问:
初始化
初始化脚本会建立 cirros 镜像、网络、子网、路由、安全组、规格、配额等虚拟机资源:
. kolla-ansible/tools/init-runonce
建立虚拟机
openstack server create --image cirros --flavor m1.tiny --key-name mykey --network demo-net demo1
查看虚拟机状态:
咱们都知道,在 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
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: