将OpenStack Kolla Ansible(Pike=6.0.0)部署到裸金属服务器上
我在家里放着一台物理服务器,想要搭建一个私有云,于是就找到了OpenStack。但是按照普通的安装方法,我总是在中途遇到一些困难,感到非常困惑。然而,通过使用Kolla-ansible,我能够非常轻松地部署。本文将记录下部署成功的步骤,兼作备忘。
尽管有一些服务运行不正常,或者公式文件有一些不完善的地方,但由于可以轻松重试,所以我建议除非有其他原因,否则推荐使用Kolla-ansible进行部署。
章节标题
-
- 環境構成
-
- 事前準備(主にハードウェア)
-
- kolla-ansibleのコンフィグ編集
-
- CinderとSwift用Diskのフォーマット
-
- デプロイ
-
- 動作確認
- 失敗したときは
环境构成
这次我们准备了4台性能较低的服务器和2台搭载Xeon处理器的服务器,总共6台服务器。
由于需要将网络分为计算和管理两部分,所以我们使用了RTX1200作为内部路由器,对网络进行了分割。另外,每台服务器都需要两张网卡以便访问这些网络。
事前准备
安装Ubuntu16.04
只安装SSH服务器而已。
NIC的配置
需要将每个NIC设置如下。
# 管理ネットワーク用
auto enp2s0
iface enp2s0 inet static
address 192.168.100.21 #アドレスはホストでそれぞれ変える。
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 192.168.100.1
# コンピュートネットワーク用
auto enp3s0
iface enp3s0 inet manual
up ip link set dev $IFACE up
down ip link set dev $IFACE down
修改主机文件(或者内部DNS的设置)
可以编辑每个节点的主机文件,或者通过内部DNS使其可以用主机名访问。
vi /etc/hosts
compute1 192.168.100.21
# 全ホスト分記載。管理ネットワークのアドレスでアクセスできるようにする
设置SSH Key以实现无需密码访问。
对于所有主机,请执行以下操作
ssh-copy-id host1
使Root用户可以无需密码访问
sudo visudo
安装所需的软件
请在所有主机上执行以下命令,并安装所需的模块。
# pipのインストール
apt-get update
apt-get install python-pip
pip install -U pip
# 必要なPythonライブラリのインストール
apt-get install python-dev libffi-dev gcc libssl-dev python-selinux
# ansibleのインストール
pip install -U ansible
# Dockerのインストール
curl -sSL https://get.docker.io | bash
# サービスファイルの作成と編集
mkdir -p /etc/systemd/system/docker.service.d
tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'
[Service]
MountFlags=shared
ExecStart=
ExecStart=/usr/bin/dockerd \
-H fd:// \
--mtu 1400
EOF
# Run these commands to reload the daemon
systemctl daemon-reload
systemctl restart docker
# pythonのDockerモジュールのインストール
pip install -U docker
# NTPのインストール
apt-get install ntp
# Ubuntu
service libvirt-bin stop
update-rc.d libvirt-bin disable
修改kolla-ansible的配置文件
将这两个文件复制到某个地方并进行编辑。
如果没有特殊要求的话,建议将第一个文件复制到 /etc/kolla/ 目录下。
这样做是因为它可以避免指定文件的选项。
- kolla-ansible/etc/kolla可以被重命名为kolla-ansible/ansible/inventory/*。
生成密码文件
我会生成一个密码文件。
如果复制第一个文件的位置是默认的/etc/kolla/,则无需任何选项即可。
但如果不是默认位置,则需要指定复制的目标文件夹。
kolla-genpwd -p ~/kolla-pike/kolla/passwords.yml
编辑globals.yml文件
接下来,我们会编辑位于第一个文件的子目录中的全局设置文件globals.yal。
vi global.yaml
仅提取编辑至服务部分的内容如下:
# Valid options are [ centos, oraclelinux, ubuntu ]
#kolla_base_distro: "centos"
kolla_base_distro: "ubuntu"
# Valid options are [ binary, source ]
#kolla_install_type: "binary"
kolla_install_type: "source"
# Valid option is Docker repository tag
openstack_release: "pike"
# 'network_interface' as set in the Networking section below.
kolla_internal_vip_address: "192.168.100.100"
# followed for other types of interfaces.
network_interface: "enp2s0"
# addresses for that reason.
neutron_external_interface: "enp3s0"
# 追記する。
# 外部ネットワークに直接インスタンスを接続できるようになる。
enable_neutron_provider_networks: "yes"
对于服务部分,经过多次修改,结果如下所示。
# OpenStack services can be enabled or disabled with these options
enable_aodh: "yes"
enable_barbican: "yes"
enable_ceilometer: "yes"
enable_central_logging: "yes"
enable_ceph: "yes"
enable_ceph_rgw: "yes"
enable_chrony: "yes"
enable_cinder: "yes"
enable_cinder_backup: "yes"
#enable_cinder_backend_hnas_iscsi: "no"
#enable_cinder_backend_hnas_nfs: "no"
#enable_cinder_backend_iscsi: "no"
#enable_cinder_backend_lvm: "no"
#enable_cinder_backend_nfs: "no"
enable_cloudkitty: "no"
enable_collectd: "yes"
enable_congress: "yes"
#enable_designate: "no"
#enable_destroy_images: "no"
enable_etcd: "yes"
enable_fluentd: "yes"
enable_freezer: "no"
enable_gnocchi: "yes"
enable_grafana: "yes"
enable_haproxy: "yes"
enable_heat: "yes"
enable_horizon: "yes"
#enable_horizon_cloudkitty: "{{ enable_cloudkitty | bool }}"
#enable_horizon_designate: "{{ enable_designate | bool }}"
#enable_horizon_freezer: "{{ enable_freezer | bool }}"
#enable_horizon_ironic: "{{ enable_ironic | bool }}"
#enable_horizon_karbor: "{{ enable_karbor | bool }}"
#enable_horizon_magnum: "{{ enable_magnum | bool }}"
#enable_horizon_manila: "{{ enable_manila | bool }}"
#enable_horizon_mistral: "{{ enable_mistral | bool }}"
#enable_horizon_murano: "{{ enable_murano | bool }}"
#enable_horizon_neutron_lbaas: "{{ enable_neutron_lbaas | bool }}"
#enable_horizon_sahara: "{{ enable_sahara | bool }}"
#enable_horizon_searchlight: "{{ enable_searchlight | bool }}"
#enable_horizon_senlin: "{{ enable_senlin | bool }}"
#enable_horizon_solum: "{{ enable_solum | bool }}"
#enable_horizon_tacker: "{{ enable_tacker | bool }}"
#enable_horizon_trove: "{{ enable_trove | bool }}"
#enable_horizon_watcher: "{{ enable_watcher | bool }}"
#enable_horizon_zun: "{{ enable_zun | bool }}"
#enable_hyperv: "no"
enable_influxdb: "yes"
enable_ironic: "no" # デプロイエラー発生
enable_karbor: "no"
enable_kuryr: "no" # コンテナが落ちてしまう
enable_magnum: "yes"
enable_manila: "yes"
enable_manila_backend_generic: "yes"
#enable_manila_backend_hnas: "no"
enable_mistral: "yes"
enable_mongodb: "yes"
enable_murano: "no" #pikeバージョンではデプロイエラー発生
enable_multipathd: "yes"
enable_neutron_bgp_dragent: "no"
enable_neutron_dvr: "no"
enable_neutron_lbaas: "yes"
enable_neutron_fwaas: "yes"
enable_neutron_qos: "no"
enable_neutron_agent_ha: "no"
enable_neutron_vpnaas: "yes"
enable_neutron_sfc: "yes"
#enable_nova_fake: "no"
#enable_nova_serialconsole_proxy: "no"
enable_octavia: "no"
#enable_opendaylight: "no"
#enable_openvswitch: "{{ neutron_plugin_agent != 'linuxbridge' }}"
#enable_ovs_dpdk: "no"
enable_osprofiler: "yes"
enable_panko: "yes"
enable_qdrouterd: "no"
enable_rally: "yes"
enable_redis: "yes"
enable_sahara: "yes"
enable_searchlight: "no" # デプロイ時にエラー発生
enable_senlin: "yes"
enable_skydive: "yes"
enable_solum: "no" # デプロイ時にエラー発生
enable_swift: "yes"
enable_telegraf: "yes"
enable_tacker: "no"
enable_tempest: "no"
enable_trove: "yes"
enable_vmtp: "no"
enable_watcher: "no"
enable_zun: "no" # kuryrがエラー発生するので、デプロイ対象外に。
# 追記。osprofilerとskydiveに必要。
enable_elasticsearch: "yes"
在选择服务部署目标部分以下的部分中,只对Glance部分进行了修改。
########################
# Glance - Image Options
########################
# Configure image backend.
glance_backend_file: "no"
glance_backend_ceph: "yes"
对multinode文件进行修正。
请编辑各主机。
请根据环境调整内容。
[control]
# These hostname must be resolvable from your deployment host
host5 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host6 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host4 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
# 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]
host2 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host3 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
# inner-compute is the groups of compute nodes which do not have
# external reachability
[inner-compute]
# external-compute is the groups of compute nodes which can reach
# outside
[external-compute]
host5 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host6 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
[compute:children]
inner-compute
external-compute
[monitoring]
host4 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
# When compute nodes and control nodes use different interfaces,
# you can specify "api_interface" and other interfaces like below:
#compute01 neutron_external_interface=eth0 api_interface=em1 storage_interface=em1 tunnel_interface=em1
[storage]
host3 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host2 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
host1 ansible_ssh_user=user ansible_become=True ansible_private_key_file=/home/user/.ssh/id_rsa
Cinder和Swift所使用的磁盘格式
在使用Cinder和Swift之前,要将用于它们的硬盘进行格式化。在格式化后,为了明确地指定将这些硬盘用于Cinder和Swift,需要给它们加上标签。
此外,在使用Swift之前,还需要事先创建一个名为Ring的组件,所以也要执行相应的命令。
# 各ストレージノードで以下を実行
mkfs.xfs -f /dev/sdb; mkfs.xfs -f /dev/sdc; mkfs.xfs -f /dev/sdd
parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_42 1 -1; parted /dev/sdd -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_42_J 1 -1
for d in sdc ; do sudo mkfs.xfs -f /dev/${d}; parted /dev/${d} -s -- mklabel gpt mkpart KOLLA_SWIFT_DATA 1 -1; sudo mkfs.xfs -f -L d${index} /dev/${d}1; (( index++ )); done
创建一个用于为Swift创建Ring的脚本。在部署节点上。
STORAGE_NODES=(192.168.100.21 192.168.100.22 192.168.100.23)
KOLLA_SWIFT_BASE_IMAGE="kolla/ubuntu-source-swift-base:pike"
sudo rm -rf /etc/kolla/config/swift
sudo mkdir -p /etc/kolla/config/swift
# Object ring
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/object.builder create 10 3 1
for node in ${STORAGE_NODES[@]}; do
for i in {0..2}; do
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/object.builder add r1z1-${node}:6000/d${i} 1;
done
done
# Account ring
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/account.builder create 10 3 1
for node in ${STORAGE_NODES[@]}; do
for i in {0..2}; do
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/account.builder add r1z1-${node}:6001/d${i} 1;
done
done
# Container ring
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/container.builder create 10 3 1
for node in ${STORAGE_NODES[@]}; do
for i in {0..2}; do
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/container.builder add r1z1-${node}:6002/d${i} 1;
done
done
for ring in object account container; do
docker run \
--rm \
-v /etc/kolla/config/swift/:/etc/kolla/config/swift/ \
$KOLLA_SWIFT_BASE_IMAGE \
swift-ring-builder \
/etc/kolla/config/swift/${ring}.builder rebalance;
done
从Deploy节点执行
./swift.sh
部署
在部署之前,我们会检查端口是否已打开,以及确认配置文件是否没有任何错误。
kolla-ansible -i ~/kolla-pike/multinode --configdir ~/kolla-pike/kolla --passwords ~/kolla-pike/kolla/passwords.yml -v prechecs
如果没有错误,就进行部署。
由于部署需要很长时间,所以会一直关注。
请注意机器配置,以确保与部署目标主机的通信不中断。
kolla-ansible -i ~/kolla-pike/multinode --configdir ~/kolla-pike/kolla --passwords ~/kolla-pike/kolla/passwords.yml -v deploy
如果成功部署,将创建一个连接信息文件。
kolla-ansible -i ~/kolla-pike/multinode --configdir ~/kolla-pike/kolla --passwords ~/kolla-pike/kolla/passwords.yml -v post-deploy
确认动作
安装 OpenStack 客户端。
pip install python-openstackclient
编辑在部署后首先执行的命令。
vim /usr/share/kolla-ansible/init-runonce
# 欲しいイメージに合わせて編集。
# 私の環境ではcirrosはうまくいかなかったので、後でUbuntuイメージに変更しました。
# イメージ一覧:https://docs.openstack.org/ja/image-guide/obtain-images.html
IMAGE_URL=http://download.cirros-cloud.net/0.4.0/
IMAGE=cirros-0.4.0-${ARCH}-disk.img
IMAGE_NAME=cirros
IMAGE_TYPE=linux
# 外部ネットワークの情報に合わせて編集
EXT_NET_CIDR='192.168.0.0/24'
EXT_NET_RANGE='start=192.168.0.101,end=192.168.0.230'
EXT_NET_GATEWAY='192.168.0.1'
读取认证信息,并创建初始网络、模板和镜像等。
. /etc/kolla/admin-openrc.sh
cd /usr/share/kolla-ansible
./init-runonce
启动实例
openstack server create \\
--image ${IMAGE_NAME} \\
--flavor m1.small \\
--key-name mykey \\
--nic net-id=demo1 \\
demo1
获取和分配漂浮IP
# floating ipの取得
openstack floating ip create public1
# floating ipの確認
openstack floating ip list
# インスタンスの確認
openstack server list
# floating ipの割当
openstack server add floating ip INSTANCE_NAME_OR_ID FLOATING_IP_ADDRESS
如果您能够做到这一点,您应该能够通过SSH进行连接。
请根据启动实例的映像正确设置@符号前的用户名。
ssh ubuntu@INSTANCE_IP
在失败时
如果在设置时出现错误,但在预检中无法检测到并出现错误,或者连接在中途断开导致中止,您可以选择完全重新部署,但也可以通过指定角色来从中途开始重新执行。
ansible-playbook -i ~/kolla-pike/multinode -e @~/kolla-pike/kolla/globals.yml -e @~/kolla-pike/kolla/passwords.yml -e CONFIG_DIR=~/kolla-pike/kolla -e action=deploy ~/.pyenv/versions/2.7.13/envs/kolla-pike/share/kolla-ansible/ansible/site.yml --verbose --tags "searchlight,tacker,octavia,zun,skydive"
参考资料
-
- OpenStack Docs: Welcome to Kolla-Ansible’s documentation!
-
- kolla-ansibleでOpenStack(stable/pike)を構築する – Qiita
- OpenStack Kolla(Ocata)環境の構築 – Qiita