Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

소스 코드로 OpenStack 설치하기 – 2부: Glance(이미지 서비스)와 Neutron(네트워킹 서비스) 구축

이 시리즈의 첫 번째 글에서 소스 코드 기반 OpenStack 설치를 시작했습니다. Keystone을 설치하고 Services 프로젝트와 admin 사용자 등 기본 정보를 구성했으며, 이후 설치할 이미지 서비스(Glance), 네트워킹 서비스(Neutron), 컴퓨트 서비스(Nova), 볼륨 서비스(Cinder)를 위한 사용자와 디렉터리도 초기 스크립트로 미리 준비해 두었습니다. 이번 글에서는 컨트롤러 노드에 Glance를 설치하고 실행하는 과정을 이어서 진행하겠습니다.

사전 준비: 환경 변수 확인

첫 번째 글에서 bashrc 파일에 셸 변수 몇 개를 추가해 두었습니다. 이후 단계에서 계속 사용되므로 최소한 하나 이상의 변수가 설정되어 있는지 먼저 확인합니다.

echo $MY_IP

이미지 서비스(Glance) 설치

Glance 설치를 시작하려면 추가 하위 디렉터리를 만들고 적절한 권한을 부여해야 합니다(기본 glance 디렉터리는 이전 글의 스크립트에서 이미 생성됨).

mkdir -p /var/lib/glance/images
mkdir -p /var/lib/glance/scrubber
mkdir -p /var/lib/glance/image-cache

다음으로 저장소를 클론하여 Glance를 다운로드합니다.

git clone https://github.com/openstack/glance.git -b stable/kilo

참고: 위 명령에서 -b stable/kilo 옵션을 제거하면 트렁크(trunk) 버전을 설치할 수 있습니다.

cp -R glance/etc/* /etc/glance/
cd glance
python setup.py install

Glance 설정

데이터베이스 연결 정보, 메시지 큐 정보, Keystone 연결 정보 등 기본 설정값을 지정합니다.

sed -i "s|#connection = <None>|connection = mysql://glance:glance@$MY_PRIVATE_IP/glance|g" /etc/glance/glance-api.conf
sed -i "s/rabbit_host = localhost/rabbit_host = $MY_PRIVATE_IP/g" /etc/glance/glance-api.conf
sed -i "s/auth_host = 127.0.0.1/auth_host = $MY_PRIVATE_IP/g" /etc/glance/glance-api.conf
sed -i 's/%SERVICE_TENANT_NAME%/service/g' /etc/glance/glance-api.conf
sed -i 's/%SERVICE_USER%/glance/g' /etc/glance/glance-api.conf
sed -i 's/%SERVICE_PASSWORD%/glance/g' /etc/glance/glance-api.conf
sed -i 's/#flavor=/flavor = keystone/g' /etc/glance/glance-api.conf
sed -i 's/#show_image_direct_url = False/show_image_direct_url = True/g' /etc/glance/glance-api.conf

Glance-Registry에도 동일한 정보로 설정을 적용합니다.

sed -i "s|#connection = <None>|connection = mysql://glance:glance@$MY_PRIVATE_IP/glance|g" /etc/glance/glance-registry.conf
sed -i "s/auth_host = 127.0.0.1/auth_host = $MY_PRIVATE_IP/g" /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_TENANT_NAME%/service/g' /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_USER%/glance/g' /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_PASSWORD%/glance/g' /etc/glance/glance-registry.conf
sed -i 's/#flavor=/flavor = keystone/g' /etc/glance/glance-registry.conf
sed -i 's|#connection = <None>|connection = mysql://glance:glance@$MY_IP|g' /etc/glance/glance-api.conf
sed -i 's|#connection = <None>|connection = mysql://glance:glance@$MY_IP|g' /etc/glance/glance-registry.conf

MySQL 데이터베이스 생성 및 동기화

Glance용 MySQL 데이터베이스를 생성하고, 새로 만든 데이터베이스에 glance 테이블을 생성합니다.

mysql -u root -pmysql -e 'CREATE DATABASE glance;'
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';"
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';"
glance-manage db_sync

glance-image-sync 설치(선택 사항)

이 환경에서는 필수는 아니지만, glance-image-sync를 설치하고 주기적으로 실행되도록 설정합니다. 여러 개의 Glance API 노드를 운영하는 경우 노드 간 이미지를 동기화해 주는 도구입니다.

git clone https://github.com/rcbops/glance-image-sync
pushd glance-image-sync
mv glance-image-sync.py /usr/local/bin/glance-image-sync
chmod +x /usr/local/bin/glance-image-sync
popd

cat >> /etc/glance/glance-image-sync << EOF
[DEFAULT]
api_nodes = $MY_IP
rsync_user = glance
lock_file = /var/run/glance-image-sync
EOF

cat >>  /etc/cron.d/glance-image-syn << EOF
*/5 * * * * glance /usr/local/bin/glance-image-sync
EOF

로그 로테이트(Logrotate) 설정

Glance 로그 파일이 무한정 쌓이지 않도록 로테이트 설정을 잊지 말아야 합니다.

cat >> /etc/logrotate.d/glance << EOF
/var/log/glance/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}
EOF

Keystone 서명 인증서 복사

이미지 서비스가 Identity 서비스의 서명 인증서를 확보하지 못하면 Image API 요청이 실패합니다. 이를 방지하기 위해 Keystone 서명 인증서를 glance에 복사합니다.

cp /etc/keystone/ssl/certs/ca.pem /var/lib/glance/cacert.pem
cp /etc/keystone/ssl/certs/signing_cert.pem /var/lib/glance/
chown glance:glance /var/lib/glance/*
chmod 600 /var/lib/glance/cacert.pem
chmod 600 /var/lib/glance/signing_cert.pem

Glance 시작 및 확인

Glance를 시작하기 전에 Upstart 스크립트를 먼저 생성해야 합니다.

참고: 아래 스크립트는 Ubuntu 패키지 버전의 glance가 설치하는 스크립트를 그대로 가져온 것입니다.

cat >> /etc/init/glance-api.conf << EOF
description "Glance API server"
author "Soren Hansen <soren@linux2go.dk>"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec start-stop-daemon --start --chuid glance --exec /usr/local/bin/glance-api -- --config-file=/etc/glance/glance-api.conf --config-file=/etc/glance/glance-api-paste.ini
EOF

cat >> /etc/init/glance-registry.conf << EOF
description "Glance registry server"
author "Soren Hansen <soren@linux2go.dk>"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec start-stop-daemon --start --chuid glance --exec /usr/local/bin/glance-registry -- --config-file=/etc/glance/glance-registry.conf --config-file=/etc/glance/glance-registry-paste.ini

EOF

이제 glance를 시작하고 정상 동작 여부를 확인합니다.

start glance
start glance-registry

약 15초 후 아래 명령을 실행하여 glance가 실행 중인지 확인합니다.

ps aux|grep glance

정상적으로 시작되었다면 마지막 명령 결과에서 실행 중인 프로세스 정보를 확인할 수 있습니다. 만약 glance가 시작되지 않거나 곧바로 종료된다면, 문제 해결을 위해 다음 명령으로 수동 실행해 보세요.

sudo -u glance glance-api --config-file=/etc/glance/glance-api.conf --config-file=/etc/glance/glance-api-paste.ini > /dev/null 2>&1 &

sudo -u glance glance-registry --config-file=/etc/glance/glance-registry.conf --config-file=/etc/glance/glance-registry-paste.ini > /dev/null 2>&1 &

팁: /etc/glance/glance.conf 파일에서 debug = True 값을 설정하면 로그 출력량이 늘어나 오류 원인 파악에 도움이 됩니다.

Cirros 테스트 이미지 업로드

OpenStack 설치가 완료된 후 VM의 기반으로 사용할 이미지를 glance에 등록합니다. Ubuntu 기반의 경량 클라우드 이미지인 cirros를 다운로드하여 glance에 로드합니다.

wget https://cdn.download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img

glance image-create --name=cirros-qcow2 \
                    --disk-format=qcow2 \
                    --container-format=bare \
                    --is-public=true < cirros-0.3.3-x86_64-disk.img

두 번째 서비스인 Glance가 정상 가동되었으니, 이제 네트워킹 서비스(Neutron) 설치로 넘어갑니다. Neutron은 총 세 번에 걸쳐 설치하게 되는데, 첫 번째는 컨트롤러 노드의 neutron-server이며, 이후 네트워크 노드와 컴퓨트 노드에 각각 에이전트를 설치하게 됩니다.

네트워킹 서비스(Neutron) 설치

Nova, Neutron, Glance 프로세스는 다양한 작업 수행을 위해 root 또는 sudo 권한이 필요합니다. 따라서 해당 프로세스 사용자를 위한 특별한 sudo 권한을 생성해야 합니다. OpenStack은 rootwrap 설정을 통해 이 권한의 범위를 제한합니다. 아래 스크립트를 실행하여 sudo 권한을 설정합니다.

for SERVICE in neutron nova cinder
do
echo $SERVICE
cat > '/etc/sudoers.d/'$SERVICE'_sudoers' << EOF
Defaults:$SERVICE !requiretty

$SERVICE ALL = (root) NOPASSWD: /usr/local/bin/$SERVICE-rootwrap  /etc/$SERVICE/rootwrap.conf *
EOF

chmod 440 /etc/sudoers.d/$SERVICE_sudoers
done
chmod 750 /etc/sudoers.d

일부 pip 의존 패키지는 자동으로 설치되지 않는 시스템 패키지를 필요로 합니다. 미리 설치해 둡니다.

apt-get -y install git mysql-client python-dev libxml2-dev libffi-dev

Neutron 저장소를 클론합니다.

git clone https://github.com/openstack/neutron.git -b stable/kilo

제공되는 설정 파일들을 복사합니다.

cp neutron/etc/* /etc/neutron/

필요한 설정 하위 디렉터리들도 복사합니다.

cp -R neutron/etc/neutron/plugins/ml2/* /etc/neutron/plugins/ml2
cp -R neutron/etc/neutron/rootwrap.d/* /etc/neutron/rootwrap.d

이제 neutron을 설치합니다.

cd neutron
python setup.py install
cd ~

Neutron 데이터베이스 및 Keystone 등록

Neutron용 MySQL 데이터베이스를 생성합니다.

mysql -u root -pmysql -e 'CREATE DATABASE neutron;'
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';"
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';"

이전 글에서 실행한 샘플 데이터 스크립트에는 neutron 서비스 관련 데이터가 포함되어 있지 않습니다. 따라서 keystone에 neutron 서비스 사용자를 직접 생성합니다.

keystone user-create --tenant service --name neutron --pass neutron

새로 생성한 neutron 사용자에게 'admin' 역할을 부여합니다.

keystone user-role-add --user neutron --tenant service --role admin

그리고 사용자 생성이 제대로 되었는지 확인합니다. 서비스 사용자 목록과 역할을 조회하여 neutron 사용자가 존재하고 admin 역할을 갖고 있는지 검증합니다.

keystone user-list --tenant Services
keystone user-role-list --tenant service --user neutron

두 명령의 출력 결과에서 neutron 사용자가 생성되었고 올바른 권한을 가졌음을 확인할 수 있어야 합니다. 이제 keystone 서비스 카탈로그에 neutron 서비스를 등록합니다.

keystone service-create --name=neutron --type=network --description="Neutron Network Service"

neutron 엔드포인트 정보를 keystone 서비스 카탈로그에 추가합니다.

keystone endpoint-create --region RegionOne --service neutron --publicurl=https://$MY_PUBLIC_IP:9696 --internalurl=https://$MY_PRIVATE_IP:9696 --adminurl=https://$MY_PRIVATE_IP:9696

SERVICE_TENANT_ID=`keystone tenant-get service | awk '/ id / { print $4 }'`

Neutron 설정 파일 작성

마지막으로 neutron을 설정합니다. 패키지 설치 과정에서 기본 설정 파일이 함께 제공된다면 삭제하세요. 파일이 매우 길고 편집하기 어렵기 때문입니다. 아래 명령으로 더 간단한 설정 파일로 교체합니다(원본은 클론된 neutron 디렉터리에 그대로 남아 있으므로 나중에 참조할 수 있습니다).

rm /etc/neutron/neutron.conf

cat > /etc/neutron/neutron.conf << EOF
[DEFAULT]
verbose = True
debug = True
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
allow_overlapping_ips = True
dhcp_agents_per_network = 1
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = https://$MY_PRIVATE_IP:8774/v2
nova_admin_username = nova
nova_admin_tenant_id = $SERVICE_TENANT_ID
#nova_admin_tenant_name = service
nova_admin_password = nova
nova_admin_auth_url = https://$MY_PRIVATE_IP:35357/v2.0

[agent]
root_helper=sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
[keystone_authtoken]
auth_uri = https://$MY_PRIVATE_IP:35357/v2.0/
identity_uri = https://$MY_PRIVATE_IP:5000
admin_tenant_name = service
admin_user = neutron
admin_password = neutron
[database]
connection = mysql://neutron:neutron@$MY_PRIVATE_IP/neutron

[oslo_concurrency]
lock_path = /var/lock/neutron

[oslo_messaging_rabbit]
rabbit_host = $MY_PRIVATE_IP
EOF

Neutron 로그 파일도 로테이트 설정을 추가합니다.

cat >> /etc/logrotate.d/neutron << EOF
/var/log/neutron/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}
EOF

Neutron은 ML2 플러그인을 통해 다양한 L2 네트워킹 기술을 지원합니다. 프로젝트 네트워크 격리를 위해 GRE 터널을 사용하도록 ML2 플러그인 에이전트를 설정합니다. 이 에이전트는 컨트롤러 노드에서 실행되지 않지만, neutron 서버는 플러그인 정보를 알아야 합니다.

rm /etc/neutron/plugins/ml2/ml2_conf.ini
cat > /etc/neutron/plugins/ml2/ml2_conf.ini  << EOF

[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch

[ml2_type_gre]
tunnel_id_ranges = 1:1000

[securitygroup]
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
EOF

chown neutron:neutron /etc/neutron/*.{conf,json,ini}
chown -R neutron:neutron /etc/neutron/plugins

cat > /etc/default/neutron << EOF
--config-file=/etc/neutron/plugins/ml2/ml2_conf.ini
EOF

Glance에서 했던 것처럼 neutron 데이터베이스 테이블도 생성합니다.

neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head

Neutron 프로세스를 시작하기 전에, 시작 스크립트가 ml2 설정 파일을 읽도록 옵션 정보를 지정해야 합니다.

cat > /etc/default/neutron-server << EOF
NEUTRON_PLUGIN_CONFIG="/etc/neutron/plugins/ml2/ml2_conf.ini"
EOF

마지막으로 neutron-server 프로세스를 시작하는 데 사용할 Upstart 스크립트를 생성합니다.

cat > /etc/init/neutron-server.conf << EOF
# vim:set ft=upstart ts=2 et:

start on runlevel [2345]
stop on runlevel [!2345]

script
  [ -r /etc/default/neutron-server ] && . /etc/default/neutron-server
  [ -r "\$NEUTRON_PLUGIN_CONFIG" ] && CONF_ARG="--config-file \$NEUTRON_PLUGIN_CONFIG"
  exec start-stop-daemon --start --chuid neutron --exec /usr/local/bin/neutron-server -- \
    --config-file /etc/neutron/neutron.conf \
    --log-file /var/log/neutron/server.log \$CONF_ARG
end script

EOF

Neutron 서버 시작 및 확인

Neutron 서버를 시작하고 계속 실행 상태를 유지하는지 확인합니다. 두 번째 명령은 실행 중인 neutron 프로세스 정보를 출력합니다(두 번째 명령 실행 전 약 15초 정도 기다리세요).

start neutron
ps aux|grep neutron

만약 neutron이 시작되지 않는다면 아래 명령으로 수동 실행해 보세요. 시작 과정에서 오류가 발생하면 문제 디버깅에 도움이 되는 출력을 확인할 수 있습니다.

sudo -u neutron neutron-server --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/ml2/ml2_conf.ini --log-file /var/log/neutron/server.log

다음 글에서는 컨트롤러 노드에 여러 nova 프로세스를 설치하는 방법을 다루겠습니다.