kolla 多節點部署 openstack

kolla 介紹

簡介html

kolla 的使命是爲 openstack 雲平臺提供生產級別的、開箱即用的交付能力。kolla 的基本思想是一切皆容器,將全部服務基於 Docker 運行,而且保證一個容器只跑一個服務(進程),作到最小粒度的運行 docker。node

kolla 要實現 openetack 部署整體上分爲兩步,第一步是製做 docker 鏡像,第二步是編排部署。所以,kolla 項目又被分爲兩個小項目:kolla、kolla-ansible 。python

kolla 的優點 linux

kolla 的優點主要得益於容器技術:git

  • 得益於成熟的部署工具 ansible 和 docker,部署快速且穩定。
  • 一個容器只跑一個服務,因此能將 openstack 服務控制到很小的粒度。
  • 能夠以組件爲單位進行升級和回滾,例如升級 nova 組件,使用 kolla-ansible -i /path/to/inventory -t nova 命令便可。
  • kolla 採用一切皆容器的基本思想,因此只需操做系統與 docker 兼容,從而規避了不少安裝包依賴衝突的問題。
  • 目前 kolla 項目在社區內的熱度相對較高,社區支持更好。

kolla 的缺點github

  • 徹底依賴於 docker ,docker 的不穩定性會給整個環境帶來巨大的災難,不過目前 docker 已經問題不多了。
  • 使用 kolla 部署好雲平臺後,給開發的 debug 和運維的故障排查會帶來更多的複雜度,這個問題也可能經過寫一個簡單的 client 解決。

環境配置與需求

硬件配置:docker

  • 三臺 8C16G50G 服務器
  • 每臺服務器兩塊網卡
  • 第一臺服務器額外掛載一塊 500G 磁盤

操做系統:json

  • Ubuntu 18.04.2 LTS 操做系統
  • 內核版本 4.15.0-45-generic

節點規劃:bootstrap

  • 三臺服務器作高可用,部署 API 服務
  • 第一臺服務器作爲部署節點,部署 ansible、kolla-ansible、私有registry、apt源等
  • 剩餘兩臺服務器複用,均做爲計算節點和網絡節點高可用

注意事項:ubuntu

  • 如無特殊說明,命令默認在部署節點執行

設置主機名與 host 解析

(該步驟需在全部節點上執行)

使用 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}'`

安裝 Docker

for i in {31..33};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=100

ansible 是無服務狀態部署工具,安裝配置很簡單,更多配置能夠參考 ansible基礎-安裝與配置

搭建私有 registry

若是使用公用 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

安裝 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-[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

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 
相關文章
相關標籤/搜索