ในบทความแรกของชุดบทความนี้ เราได้เริ่มติดตั้ง 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 หลายตัวบนโหนดควบคุม