OS, Python, Ansible, OpenStack 버전에 유의해야 합니다. 예를 들어 최신 오픈스택 버전은 CentOS 계열에 있어서는 CentOS Stream 9 만 지원합니다. ansible은 6 이상 8 미만이여야 하구요. 만약 파이썬이 3.6이라면 해당 ansible을 문서의 방식으로 다운 받기 힘들어집니다.
중요한 설정 파일은 두 개 입니다. (multinode, globals.yml)
multinode 설정은 비교적 간단 합니다. control, compute, network, storage, monitoring 영역에 어떤 노드를 할당할 것 인지 지정해주기만 하면 됩니다. 한 노드가 여러 가지 역할을 함께 수행 할 수 있습니다. 더 자세한 설명은 이 문서를 확인해보시면 좋을 것 같습니다.
globals.yml 설정은 비교적 복잡합니다. 특히 네트워크 관련 설정을 주의 깊게 할당 해주어야 하며, 각종 오픈스택 서비스 중 어느 것을 사용할 것인지 고민해보아야 합니다. 기본적으로는 공식 수동설치 문서에서 지정한 몇 가지 서비스가 컨테이너 형태로 설치 되게 됩니다.
kolla-ansible 설치는 편리하고 빠르지만, 또한 느립니다. 한 번에 설치하려는 특성 상, 설정 파일이 제대로 갖추어졌다는 가정 하에도 오픈스택을 배포하는 작업은 시간 단위의 인내심을 필요로 합니다. 이는 오픈스택의 복잡성에 기인하며, 설정이 어떻게 되어있고, 어디서 오류가 날지 모르는 두려움이 있기 때문에 심적으로 피로 할 수 있습니다. 반대로 수동설치는 하나하나 작동을 테스트하며 넘어갈 수 있습니다만, 그럼에도 수동 설치 보다는 분명 편리합니다.
배포된 오픈스택 클라우드의 설정 커스텀도 가능한 것 처럼 보입니다. (이 설정 변화가 바로 적용되는 것인지, deploy를 다시 진행해야 하는지는 아직 모르겠습니다)
docker와 ansible에 대한 사전 지식이 있으면 좋습니다. 저는 ansible을 모르는 상태로 설치를 시도해 감을 잡기 힘들었습니다.
설치 과정 (참고 문서)
비밀 번호 없이 sudo 권한 상승이 가능한 user로 로그인 합니다.
# su [username]
$ cd ~
Python build dependencies를 다운 받습니다.
$ sudo dnf -y install python3-devel libffi-devel gcc openssl-devel python3-libselinux
$ python3 -V
Python 3.6.8
파이썬의 가상환경을 사용해 kolla-ansible yoga 버전을 설치를 진행할 것입니다.
ansible의 버전은 4 이상 6 미만이어야 합니다.
/etc/kolla 폴더를 만들고, 권한을 유저로 맞춰줍시다.
$ python3 -m venv ~/kolla
$ source ~/kolla/bin/activate
(kolla) $ pip install -U pip
(kolla) $ pip install 'ansible>=4,<6'
(kolla) $ sudo dnf install git -y
(kolla) $ pip install git+https://opendev.org/openstack/kolla-ansible@stable/yoga
(kolla) $ sudo mkdir -p /etc/kolla
(kolla) $ sudo chown $USER:$USER /etc/kolla
Ansible tuning에 대한 파일을 만들어 줍시다.
(kolla) $ sudo mkdir /etc/ansible
(kolla) $ sudo vim /etc/ansible/ansible.cfg
[defaults]
host_key_checking=False
pipelining=True
forks=100
globals.yml
와 passwords.yml
, all-in-one
and multinode
inventory 파일들을 /etc/kolla 로 복사합니다. (저희는 all-in-one
을 사용하지 않긴 합니다.)
그리고 multinode 인벤토리 파일을 수정합니다.
(kolla) $ cp -r ~/kolla/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/
(kolla) $ cp -r ~/kolla/share/kolla-ansible/ansible/inventory/* /etc/kolla/
(kolla) $ ls /etc/kolla/
all-in-one globals.yml multinode passwords.yml
(kolla) $ vim /etc/kolla/multinode
# These initial groups are the only groups required to be modified. The
# additional groups are for more control of the environment.
[control]
# These hostname must be resolvable from your deployment host
controller01 ansible_host=192.168.15.226 ansible_become=true
# 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]
controller01 ansible_host=192.168.15.226 ansible_become=true
[compute]
compute01 ansible_host=192.168.15.227 ansible_become=true
compute02 ansible_host=192.168.15.228 ansible_become=true
[monitoring]
~~storage01 ansible_host=192.168.15.229 ansible_become=true~~
# 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 ansible_host=192.168.15.229 ansible_become=true
...
저희 환경에서는 controller01 노드가 [control]
, [network]
역할을 모두 수행합니다. 또, storage01 노드가 [monitoring]
, [storage]
역할을 함께 수행합니다.
ansible_host
는 호스트 변수 설정시 해당 호스트의 IP주소를 설정하는 변수입니다. 따라서 노드 별로 굳이 /etc/hosts 파일을 수정할 필요가 없습니다. ansible_become
은 특정 사용자로 전환할 것인지 설정하는 ansible의 옵션입니다. 이외에도 네트워크 인터페이스를 지정한다던가, ssh key를 지정한다던가의 여러 옵션을 할당해 줄 수 있습니다.
저희는 각 노드에 ssh-copy-id 명령을 이용해 deploy 노드(현 controller01)의 ssh-keygen으로 만든 인증서들을 전달해 넣어줄 것입니다.
(kolla) $ ssh-keygen
(kolla) $ ssh-copy-id $USER@localhost
(kolla) $ ssh-copy-id $USER@192.168.15.227
(kolla) $ ssh-copy-id $USER@192.168.15.228
(kolla) $ ssh-copy-id $USER@192.168.15.229
kolla-genpwd
를 통해 오픈스택 서비스들에서 사용할 비밀번호를 생성하게 됩니다. deploy 하기 전에 편리하게 사용하고 싶은 비밀번호가 있다면 파일을 열어 수정해주시면 되겠습니다. keystone_admin_password: 1234qwer
와 같이 말이죠.
또한, globals.yml 도 열어서 아래 부분들을 고쳐줍시다. 주석 처리되어 있는 부분들은 defaults로 설정된 값들 입니다. 아래 부분들은 제가 네트워크 인터페이스 정보를 바꿔주고, cinder 서비스를 사용으로 변경해주는 작업을 해준 것입니다.
(kolla) $ kolla-genpwd
(kolla) $ vim /etc/kolla/passwords.yml
(kolla) $ vim /etc/kolla/globals.yml
(kolla) $ cat /etc/kolla/globals.yml | grep -v "#" | grep -v "^$"
---
kolla_internal_vip_address: "10.0.0.254"
kolla_external_vip_address: "192.168.15.230"
network_interface: "ens224"
kolla_external_vip_interface: "ens192"
neutron_external_interface: "ens256"
enable_cinder: "yes"
enable_cinder_backend_lvm: "yes"
nova_compute_virt_type: "qemu"
enable_neutron_dvr: "yes"
enable_neutron_provider_networks: "yes"
LVM을 사용한다면 storage01 노드에 접속해 아래와 같이 볼륨 설정을 바꿔줍시다. 추가적으로 할당한 50GB의 sdb 디바이스가 cinder의 저장소가 됩니다.
[user@storage01 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 38.4G 0 part
├─cs-root 253:0 0 34.5G 0 lvm /
└─cs-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 50G 0 disk
sr0 11:0 1 1024M 0 rom
[user@storage01 ~]$ sudo pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[user@storage01 ~]$ sudo vgcreate cinder-volumes /dev/sdb
Volume group "cinder-volumes" successfully created
하지만 경험상 LVM은 그다지 좋은 것 같진 않습니다. NFS를 이용해 구축하는 편이 더 나을 것 같네요. 볼륨도 100G 정도로 늘렸습니다
pv와 vg, lv 를 없애는 방법은 다음과 같습니다.
# check lvdisplay => Logical volume 확인
$ sudo lvdisplay
# 만약 다음과 같은 볼륨이 남아있다면, 제거
# Logical volume cinder-volumes/~ in use 가 뜨는 버그가 생긴다면, 노드 재부팅 후 시도
$ sudo lvremove /dev/cinder-volumes/volume-d9a1b75d-4af7-4cd1-881b-2007ac42c798
$ sudo vgremove cinder-volumes
$ sudo pvremove /dev/sdb
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 48.4G 0 part
├─cs-root 253:0 0 43.4G 0 lvm /
└─cs-swap 253:1 0 5G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
참고자료
[https://ccambo.tistory.com/entry/CentOS-NFS-CentOS-8에-NFS-설정-및-테스트](https://ccambo.tistory.com/entry/CentOS-NFS-CentOS-8%EC%97%90-NFS-%EC%84%A4%EC%A0%95-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8)
https://yjwang.tistory.com/172
# On storage node,
$ sudo dnf install -y nfs-utils
# nfs용 폴더 생성 및 포맷 후 볼륨 마운트
$ sudo mkdir /kolla_nfs
$ mkfs.ext4 /dev/sdb
$ mount /dev/sdb /kolla_nfs
$ df -h # 명령어로 마운트 확인
$ sudo vim /etc/exports
---
/kolla_nfs 10.0.10.31/24(rw,sync,no_root_squash)
$ sudo systemctl start nfs-server
# 확인하는 방법
$ sudo exportfs -v
$ sudo exportfs -arv
$ sudo exportfs -s
# nfs client check
(kolla) $ sudo dnf install -y nfs-utils nfs4-acl-tools
(kolla) $ showmount -e 10.0.10.31
...
# In deploy node,
(kolla) $ vim /etc/kolla/config/nfs_shares
---
storage01:/kolla_nfs
(kolla) $ vim /etc/kolla/globals.yml
---
...
enable_cinder_backend_nfs: "yes"
enable_cinder_backend_lvm: "no"
...
이제 준비는 거의 다 끝났습니다. Ansible Galaxy dependencies를 다운 받고, 배포 서버를 위한 명령어를 수행합니다.
(kolla) $ kolla-ansible install-deps
(kolla) $ kolla-ansible -i /etc/kolla/multinode bootstrap-servers
![](https://velog.velcdn.com/images/larshavin/post/7e652069-a541-4392-9188-d1daede4f89d/image.png)
위 아래 각각의 부분에서 에러가 없어야 각자 다음의 단계로 넘어갈 수 있습니다. ( 기도합시다 🙏🏻 )
다음 단계로 넘어가지 못하게 하는 대표적 친구는 docker 패키지 입니다. 제대로 과정이 수행되지 않는다면, 다음 명령어로 직접 패키지를 추가해주는 게 좋겠습니다.
(kolla) $ sudo dnf install -y docker-ce docker-ce-cli containerd.io --nobest --allowerasing
아래 명령어에 대한 문서는 이곳에 정리되어 있습니다. 이 과정은 시간이 오래 걸립니다. 그렇기에 마지막 명령어인 deploy 작업은 혹시 모르니 네트워크 변경에도 안전한 환경(ssh 연결 끊길 가능성 생김)에서 진행하는 것이 좋습니다.
(kolla) $ kolla-ansible -i /etc/kolla/multinode prechecks
(kolla) $ kolla-ansible -i /etc/kolla/multinode pull
(kolla) $ kolla-ansible -i /etc/kolla/multinode deploy
긴 기다림 끝에 문제없이 설치가 완료 되었다면, 곧장 설치를 테스트 해볼 수 있습니다. init-runonce
스크립트를 실행해 cirros 이미지에 접속이 되는지 테스트 해볼 수도 있고, 단순히 호라이즌 대시보드에 접속을 시도 해볼 수 있겠습니다.
kolla_external_vip_address
로 설정한 192.168.15.230에 접속 해봅시다. 저는 문제 없이 접속 됩니다.
관리자의 입장에서 CLI로 작업을 진행해야 할 때가 존재합니다. python-openstackclient
를 다운 받아 openstack 명령어를 사용할 수 있게 만들고, 오픈스택 클러스터 접속 정보를 kolla-ansible post-deploy
로 다운 받아 실행 해줍니다.
pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/yoga
kolla-ansible post-deploy
source /etc/kolla/admin-openrc.sh
간단히 어떤 서비스가 정의되어 있는지 목록을 불러와 봤습니다.
(kolla) $ openstack service list
+----------------------------------+-------------+----------------+
| ID | Name | Type |
+----------------------------------+-------------+----------------+
| 19ce73711b91479689f841916d77cdef | cinderv3 | volumev3 |
| 4814e7df364a48ef972a01d47a36a7a3 | nova | compute |
| 8fe4993428b744dfa48ac9ee2c8af9fb | heat-cfn | cloudformation |
| afd9aa79acf34c8ba149b863b918d92d | placement | placement |
| babbe565437f436ea19146c5c8926a6f | nova_legacy | compute_legacy |
| c0c2b50592a84a3986fd7a4e00e3887a | glance | image |
| d95e79967a434dd79fafeb856752f988 | keystone | identity |
| f1953feed6ef4d4cb4781f22203c30d1 | neutron | network |
| fc3962835abf4607a679eb77e65cc269 | heat | orchestration |
+----------------------------------+-------------+----------------+
잘 작동합니다. 다음으로 init-runonce 쉘을 가동해봅시다. 가동전에 아래와 같이 프로바이더 네트워크의 정보를 제대로 구성해줍시다. 주의할 점은 아래 명령은 딱 한 번만 실행된다는 것 입니다. (중간에 끊기면 귀찮아집니다)
vim ./kolla/share/kolla-ansible/init-runonce
-----
...
# This EXT_NET_CIDR is your public network,that you want to connect to the internet via.
ENABLE_EXT_NET=${ENABLE_EXT_NET:-1}
EXT_NET_CIDR=${EXT_NET_CIDR:-'192.168.15.0/24'}
EXT_NET_RANGE=${EXT_NET_RANGE:-'start=192.168.15.235,end=192.168.15.245'}
EXT_NET_GATEWAY=${EXT_NET_GATEWAY:-'192.168.15.1'}
...
$KOLLA_OPENSTACK_COMMAND network create demo-net
$KOLLA_OPENSTACK_COMMAND subnet create --subnet-range 10.0.10.0/24 --network demo-net \
--gateway 10.0.10.1 --dns-nameserver 8.8.8.8 demo-subnet
$KOLLA_OPENSTACK_COMMAND router add subnet demo-router demo-subnet
./kolla/share/kolla-ansible/init-runonce
실행이 제대로 되면 마지막 명령어를 수행합시다.
openstack server create \
--image cirros \
--flavor m1.tiny \
--key-name mykey \
--network demo-net \
demo1