Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

การติดตั้ง OpenStack จากซอร์สโค้ด: การตั้งค่า Glance (ส่วนที่ 2)

ในบทความแรกของชุดบทความนี้ เราได้เริ่มติดตั้ง OpenStack จากซอร์สโค้ด เราได้ติดตั้ง Keystone และเพิ่มข้อมูลพื้นฐานบางส่วน รวมถึงโครงการ Services และผู้ใช้งาน admin สำหรับการติดตั้ง OpenStack ใหม่ นอกจากนี้ ในสคริปต์เบื้องต้น เราได้ตั้งค่าผู้ใช้และไดเรกทอรีสำหรับการติดตั้งบริการ Image (Glance), Networking (Neutron), Compute (Nova) และ Volume (Cinder) ในขั้นตอนต่อไป ตอนนี้มาเปิดดูการติดตั้งและเริ่มต้นกระบวนการ Glance บนโหนดควบคุม (Controller Node) กัน

ตรวจสอบตัวแปรสภาพแวดล้อม

ในบทความแรก เราได้เพิ่มข้อมูลบางส่วนลงในไฟล์ bashrc เพื่อตั้งค่าตัวแปร shell สองตัวสำหรับการติดตั้งขั้นตอนต่อไป โปรดยืนยันว่าตัวแปรอย่างน้อยหนึ่งตัวถูกตั้งค่าแล้ว:

echo $MY_IP

สร้างไดเรกทอรีย่อยของ Glance และตั้งค่าสิทธิ์

เพื่อเริ่มติดตั้งบริการ Image (Glance) เราต้องสร้างไดเรกทอรีย่อยเพิ่มเติมของ Glance และให้สิทธิ์ที่เหมาะสม (ไดเรกทอรีพื้นฐานของ Glance ถูกสร้างโดยสคริปต์ในบทความก่อนหน้าแล้ว):

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

ดาวน์โหลดและติดตั้ง Glance

ดาวน์โหลด (clone repository) และติดตั้ง Glance:

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

หมายเหตุ: จำได้ว่าเราสามารถเปลี่ยนมาติดตั้งจาก trunk ได้โดยการลบ -b stable/kilo ออกจากคำสั่งข้างต้น

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

กำหนดค่า Glance

กำหนดค่า 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

กำหนดค่า 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 -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 หลายตัว ฟีเจอร์นี้จะซิงค์รูปภาพ Glance ระหว่างโหนดต่างๆ:

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

ตั้งค่า Log Rotation สำหรับ Glance

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

คัดลอกใบรับรอง Keystone สำหรับ Glance

หากไม่ได้รับใบรับรองการลงนามของ Identity Service สำหรับ Image Service คำขอ 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

สร้าง Upstart Scripts สำหรับ Glance

หมายเหตุ: สคริปต์เหล่านี้คัดลอกมาจากแพ็กเกจ Glance ของ Ubuntu

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 เริ่มทำงานแล้ว ควรจะเห็นบรรทัดแสดงข้อมูลกระบวนการที่กำลังรัน หาก 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 &

หมายเหตุ: การตั้งค่า debug = True ในไฟล์ /etc/glance/glance.conf จะเพิ่มการบันทึก log เพื่อช่วยในการ debug

นำเข้า Image ลงใน Glance

ต่อไป ให้ติดตั้ง image ลงใน Glance เพื่อใช้งานเมื่อติดตั้ง OpenStack เสร็จสิ้นเป็นฐานสำหรับ VM มี image ขนาดเล็กจาก 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

เตรียมการติดตั้ง Neutron

กระบวนการที่สองทำงานแล้ว เราสามารถมุ่งเน้นไปติดตั้งบริการ Networking (Neutron) นี่คือการติดตั้ง Neutron ครั้งแรกจากสามครั้งที่ต้องทำ: Neutron Server บนโหนดควบคุม และ Neutron Agents บนโหนดเครือข่ายและโหนด Compute

ตั้งค่า Sudo Permissions สำหรับบริการ OpenStack

เนื่องจากกระบวนการ Nova, Neutron และ Glance ต้องการสิทธิ์ root หรือ sudo เราจึงต้องสร้าง sudo permissions พิเศษสำหรับผู้ใช้งานเหล่านี้ OpenStack ยังจำกัดขอบเขตสิทธิ์เหล่านี้ผ่านการตั้งค่า rootwrap รันสคริปต์ต่อไปนี้:

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

Clone Neutron Repository

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 ~

สร้างฐานข้อมูล MySQL สำหรับ Neutron

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 Service User ใน Keystone

สคริปต์ข้อมูลตัวอย่างในบทความก่อนหน้าไม่ได้เพิ่มข้อมูลสำหรับบริการ Neutron สร้าง Neutron service user:

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

มอบบทบาท Admin ให้ Neutron User

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

ตรวจสอบการสร้าง User

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

เพิ่ม Neutron Service ลงใน Keystone Catalog

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

เพิ่ม Endpoint ข้อมูล Neutron

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

ลบไฟล์ตั้งค่าพื้นฐานที่ยาวและยากต่อการแก้ไข แล้วแทนที่ด้วยไฟล์ที่เรียบง่ายกว่า:

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_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

ตั้งค่า Log Rotation สำหรับ Neutron

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

กำหนดค่า ML2 Plugin สำหรับ GRE Tunnels

Neutron รองรับเทคโนโลยีเครือข่าย Layer 2 หลายแบบผ่าน ML2 Plugin กำหนดค่า ML2 plugin agent ให้ใช้ GRE tunnels สำหรับการแยกเครือข่ายของโครงการ แม้ agent นี้จะไม่รันบนโหนดควบคุม Neutron Server ก็ต้องรู้จัก plugin นี้:

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

สร้างตารางฐานข้อมูล Neutron

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

ตั้งค่า Startup Script สำหรับ Neutron Server

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

สร้าง Upstart Script สำหรับ Neutron Server

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 Server และตรวจสอบ

start neutron
ps aux | grep neutron

รอประมาณ 15 วินาที ก่อนรันคำสั่งที่สอง หาก Neutron ไม่เริ่มทำงาน ให้ใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นด้วยตนเองเพื่อ debug:

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 หลายตัวบนโหนดควบคุม