Glynn Foster著
2015年1月公開
|
hol_single_host.py
構成スクリプトこのラボでは、Oracle OpenWorld 2014のHands-On Labセッション9821で行った作業について説明します。Oracle Solaris 11でのOpenStack構成方法の基礎について解説します。OpenStackは広く使用されているオープン・ソースのクラウド・インフラストラクチャで、Oracle Solaris 11.2にはこれが統合されていますOpenStackには、Webベースのダッシュボードからデータセンター内のコンピューティング・リソース、ストレージ・リソース、ネットワーク・リソースを一元的に管理するためのさまざまなサービスが含まれています。
図1:リソース管理に便利なOpenStackのダッシュボード
OpenStackの各サービスを要約すると表1のようになります。
表1:OpenStackのサービスサービス名 | 説明 |
---|---|
Nova | コンピューティングの仮想化 |
Cinder | ブロック・ストレージ |
Neutron | ソフトウェア定義ネットワーク(SDN) |
Keystone | クラウド・サービス間の認証 |
Glance | イメージの管理とデプロイ |
Horizon | Webベースのダッシュボード |
このラボでは、OpenStackをシングル・ノード・インスタンス内でセットアップします。一般的なエンタープライズ・デプロイ環境では、これらのサービスはロードバランシングやその他の高可用性機能によって複数のノードに分散されます。
Oracle Solaris 11.2リリースでは、統合アーカイブと呼ばれる新しいアーカイブ形式が導入されました。統合アーカイブにより、ゴールデン・イメージ方式のデプロイを簡単に実行できます。管理者は稼働中のシステムのスナップショットをすぐに取得し、そのスナップショットをクローンとしてクラウド環境内にデプロイできます。このラボでは、統合アーカイブを作成して、OpenStackのサービスやそれらの構成方法について実際に体験していきます。
このラボでは以下のセットアップが必要です。
root
のパスワード:solaris11
)solaris
とIPアドレス範囲10.158.56.0/21
/repository/publishers/solaris
にあるOracle Solaris Image Packaging Systemリポジトリのクローン/root/hol_single_host.py
に配置(このスクリプトは付録に記載されています。このスクリプトはローカルに配置し、root
ユーザーまたは特権ユーザーで実行する必要があります)最初に、ホストOSでターミナル・ウィンドウを起動し、ユーザー名/パスワードとしてroot/solaris11
と指定し、SSH接続を開始します。
# ssh root@10.158.56.x Password: Oracle Corporation SunOS 5.11 11.2 June 2014
まず、以下のコマンドを実行して、Image Packaging SystemリポジトリからOpenStackパッケージをインストールします。
# pkg install openstack rabbitmq rad-evs-controller Packages to install:182 Services to change: 3 Create boot environment:No Create backup boot environment:Yes DOWNLOAD PKGS FILES XFER (MB) SPEED Completed 182/182 23198/23198 116.4/116.4 806k/s PHASE ITEMS Installing new actions 26599/26599 Updating package state database Done Updating package cache 0/0 Updating image state Done Creating fast lookup database Done Updating package cache 1/1
パッケージが正常にインストールされたので、次にOracle Solaris Service Management Facilityサービスのrad:local
を再起動する必要があります。Oracle Solarisリモート管理デーモン(rad
)は、OpenStack用のOracle Solarisプラグインで利用するOracle Solaris 11の管理インタフェースに、プログラムからアクセスできるようにします。
# svcadm restart rad:local
また、オープン・ソースのRabbitMQサービスも有効化する必要があります。RabbitMQはメッセージ・システムであり、OpenStackコア・サービス間で通信できるようにします。
# svcadm enable rabbitmq # svcs rabbitmq STATE STIME FMRI online 23:58:04 svc:/application/rabbitmq:default
Keystoneは、OpenStackコア・サービス間での認証機能を提供します。このラボで構成して有効化する1つ目のサービスです。
OpenStackは、一連の構成ファイルを利用します。構成ファイルには、キーと値のペアから成るセクションが定義されます。この1つ目のサービスについては手動で適切な設定を行いますが、以降のサービスについては便宜上、スクリプトを利用します。
/etc/keystone/keystone.conf
ファイルを編集して、以下のように設定します。
[DEFAULT] admin_token = ADMIN [identity] driver = keystone.identity.backends.sql.Identity [catalog] driver = keystone.catalog.backends.sql.Catalog [token] provider = keystone.token.providers.uuid.Provider [signing] token_format = UUID
Keystoneサービスを有効化します。
# svcadm enable -rs keystone # svcs keystone STATE STIME FMRI online 23:59:31 svc:/application/openstack/keystone:default
認証を成功させるためには、OpenStackコア・サービスに対応した各テナントにわたって存在するユーザーを、Keystoneデータベースに移入する必要があります。この例では、sample_data.sh
スクリプトによって提供されるサンプル・データ(表2を参照)を利用します。このスクリプトは、OpenStack基本パッケージに含まれています。本番環境では、LDAPやMicrosoft Active Directoryなどのディレクトリ・サービスとKeystoneを関連付けることになります。
ユーザー | テナント | パスワード |
---|---|---|
admin |
demo | secrete |
nova |
service | nova |
cinder |
service | cinder |
neutron |
service | neutron |
glance |
service | glance |
sample_data.sh
スクリプトを実行します。
# /usr/demo/openstack/keystone/sample_data.sh +-------------+---------------------------------------+ | Property | Value | +-------------+---------------------------------------+ | adminurl | http://localhost:$(admin_port)s/v2.0 | | id | cdd38de578ffe450a4ebd17e6345ed72 | | internalurl | http://localhost:$(public_port)s/v2.0 | | publicurl | http://localhost:$(public_port)s/v2.0 | | region | RegionOne | | service_id | db9909b96b916b6ed04a818c6f407df0 | +-------------+---------------------------------------+ +-------------+------------------------------------------------------+ | Property | Value | +-------------+------------------------------------------------------+ | adminurl | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s | | id | 48d62b0291f44c258f0bef5fe72024b9 | | internalurl | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s | | publicurl | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s | | region | RegionOne | | service_id | c38ced19a4894a5bc61cbb77e9868bbf | +-------------+------------------------------------------------------+ +-------------+----------------------------------------+ | Property | Value | +-------------+----------------------------------------+ | adminurl | http://localhost:8776/v1/$(tenant_id)s | | id | 975e3db88eb56836e779e1b0e8d2dd21 | | internalurl | http://localhost:8776/v1/$(tenant_id)s | | publicurl | http://localhost:8776/v1/$(tenant_id)s | | region | RegionOne | | service_id | 39daf3d31c0348f0ae32b04a2ed3dbc4 | +-------------+----------------------------------------+ +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://localhost:9292 | | id | a77c1ed7d1a44751afeed55e2e0bbc99 | | internalurl | http://localhost:9292 | | publicurl | http://localhost:9292 | | region | RegionOne | | service_id | 903f1738fc066deed8a8c4a38925d1e5 | +-------------+----------------------------------+ +-------------+--------------------------------------+ | Property | Value | +-------------+--------------------------------------+ | adminurl | http://localhost:8773/services/Admin | | id | 86d0e7f081d7e512b6638534f391b6ee | | internalurl | http://localhost:8773/services/Cloud | | publicurl | http://localhost:8773/services/Cloud | | region | RegionOne | | service_id | 86b96889f88be522abf19d7ff8e7db18 | +-------------+--------------------------------------+ +-------------+---------------------------------------------+ | Property | Value | +-------------+---------------------------------------------+ | adminurl | http://localhost:8080/v1 | | id | 756642548112e822be94a5da3a73588e | | internalurl | http://localhost:8080/v1/AUTH_$(tenant_id)s | | publicurl | http://localhost:8080/v1/AUTH_$(tenant_id)s | | region | RegionOne | | service_id | 6d22986ee9c76880e0f0c0da4aa8fe0f | +-------------+---------------------------------------------+ +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://localhost:9696/ | | id | bbe5bf886bff4c089c0dbc42a65fa521 | | internalurl | http://localhost:9696/ | | publicurl | http://localhost:9696/ | | region | RegionOne | | service_id | f5c6aeb5a53bceb6f022b85e0b63956f | +-------------+----------------------------------+
この結果を検証します。このためには、環境変数のSERVICE_ENDPOINT
とSERVICE_TOKEN
を設定し、クライアント・サイドのコマンドであるkeystone
を実行します。
# export SERVICE_ENDPOINT=http://localhost:35357/v2.0/ # export SERVICE_TOKEN=ADMIN # keystone user-list +----------------------------------+---------+---------+-------+ | id | name | enabled | email | +----------------------------------+---------+---------+-------+ | 5bdefb773d3c61fed79d96c5540f9766 | admin | True | | | 8b54a70c235ee1179f15a198a70be099 | cinder | True | | | 7949ac987dd5c514e778ba3932586109 | ec2 | True | | | d79d19dc2945ed758747c2e2d8ab7e89 | glance | True | | | ac11eb0e1aed68f2c45085797c8bade5 | neutron | True | | | d9e6d0ddfbaf4ca6a6ee9bb951877d3d | nova | True | | | eb3237eea75ae619aba6cf75a49f798f | swift | True | | +----------------------------------+---------+---------+-------+
Glanceは、OpenStackのイメージ管理を行うサービスです。このサービスは、新しい仮想マシン(VM)インスタンスの作成時にコンピューティング・ノード上にインストールする一連のイメージを管理します。このサービスは、いくつかの異なるサービスから成り、最初にそれらのサービスを構成する必要があります。便宜上、この構成をすぐに実行するために、付録に記載されているhol_single_host.py
スクリプトを利用します。
# ./hol_single_host.py glance configuring glance
このスクリプトにより以下のファイルが構成され、さらにGlanceエンドポイントに対して適切な構成(通常はユーザー/パスワード情報)が適用されます。
/etc/glance/glance-api.conf
/etc/glance/glance-registry.conf
/etc/glance/glance-cache.conf
/etc/glance/glance-api-paste.ini
/etc/glance/glance-registry-paste.ini
/etc/glance/glance-scrubber.conf
Glanceサービスを有効化します。
# svcadm enable -rs glance-api glance-db glance-registry glance-scrubber
以下のコマンドを実行して、この構成が正常に行われたかを確認できます。この実行結果より、イメージ・レジストリに正常に接続できてはいるものの、現時点ではGlanceにロードされているイメージがないことが分かります。
# export OS_AUTH_URL=http://localhost:5000/v2.0/ # export OS_PASSWORD=glance # export OS_USERNAME=glance # export OS_TENANT_NAME=service # glance image-list +----+------+-------------+------------------+------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +----+------+-------------+------------------+------+--------+ +----+------+-------------+------------------+------+--------+
次に、Glanceに対して、インスタンス用に利用可能なイメージを移入します。Oracle Solaris実装では、統合アーカイブと呼ばれる新しいタイプのアーカイブを利用できます。そのため、ここでは統合アーカイブを作成します。
コンピューティング・サービス用の仮想化テクノロジーとしてOracle Solarisゾーンを利用するため、まずは非大域ゾーンを作成する必要があります。
# zonecfg -z myzone create # zoneadm -z myzone install The following ZFS file system(s) have been created: rpool/VARSHARE/zones/myzone Progress being logged to /var/log/zones/zoneadm.20140911T002211Z.myzone.install Image:Preparing at /system/zones/myzone/root. Install Log:/system/volatile/install.2985/install_log AI Manifest:/tmp/manifest.xml.JFaOZf SC Profile:/usr/share/auto_install/sc_profiles/enable_sci.xml Zonename: myzone Installation:Starting ... Creating IPS image Startup linked:1/1 done Installing packages from: solaris origin:http://localhost:8008/ DOWNLOAD PKGS FILES XFER (MB) SPEED Completed 282/282 53274/53274 351.9/351.9 4.1M/s PHASE ITEMS Installing new actions 71043/71043 Updating package state database Done Updating package cache 0/0 Updating image state Done Creating fast lookup database Done Updating package cache 1/1 Installation:Succeeded Note:Man pages can be obtained by installing pkg:/system/manual done. Done:Installation completed in 230.010 seconds. Next Steps:Boot the zone, then log into the zone console (zlogin -C) to complete the configuration process. Log saved in non-global zone as /system/zones/myzone/root/var/log/zones/zoneadm.20140911T002211Z.myzone.install # zoneadm -z myzone boot # zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 myzone running /system/zones/myzone solaris excl
次に、最後の構成を行うため、このゾーンにログインします。
# zlogin -C myzone [Connected to zone 'myzone' console]
ログイン後、Oracle Solarisシステム構成ツールが表示されます。作成したゾーンをアーカイブする前に、このツールを用いて残りの構成を行います(表3を参照)。この構成はゾーンのデプロイ時には使用しませんが、アーカイブの作成前にこの構成を行っておく必要があります。このツールはファンクション・キーで操作できます。
表3:システム構成ツールで指定する構成情報項目 | 設定内容 |
---|---|
ホスト名 | myzone |
ネットワーク | 192.168.56.100(手動設定) |
DNS | DNSの構成はなし |
ネーム・サービス | なし |
タイムゾーンとロケール | 任意の設定を選択 |
root パスワード |
solaris11 |
構成情報の選択を完了すると、以下のような出力が表示されます。
SC profile successfully generated as: /etc/svc/profile/sysconfig/sysconfig-20140911-002744/sc_profile.xml Exiting System Configuration Tool.Log is available at: /system/volatile/sysconfig/sysconfig.log.4666 Hostname: myzone myzone console login:
これで、root
ユーザー(パスワードsolaris11
)でログインできます。
myzone console login:root Password:solaris11 Sep 11 00:33:57 myzone login:ROOT LOGIN /dev/console Oracle Corporation SunOS 5.11 11.2 June 2014
virtinfo
コマンドを実行すると、現在非大域ゾーンにいることが分かります。
root@myzone:~# virtinfo NAME CLASS non-global-zone current logical-domain parent
統合アーカイブを作成する前に、もう1つ別の構成を行う必要があります。OpenStackを用いてインスタンスをデプロイする際には、SSH公開キーペアを指定する必要があります。SSH公開キーペアは、通常はインスタンスへのおもな認証手法として利用されます。パスワード不要の運用にするため、ゾーンのスナップショットを作成する前に、この非大域ゾーン内で稼働するSSHサーバー・サービスの構成を一部変更する必要があります。
/etc/ssh/sshd_config
ファイルを編集します。
root@myzone:~# vi /etc/ssh/sshd_config
PermitRootLogin
というキーと値のペアを探し、without-password
と設定します。
PermitRootLogin without-password
~~.
エスケープ・シーケンスを入力して、ゾーンから出ます。
root@myzone:~# ~~. #
これでようやく統合アーカイブを作成できます。
# archiveadm create -z myzone myzone.uar Initializing Unified Archive creation resources... Unified Archive initialized:/root/myzone.uar Logging to:/system/volatile/archive_log.5578 Executing dataset discovery... Dataset discovery complete Creating install media for zone(s)... Media creation complete Preparing archive system image... Beginning archive stream creation... Archive stream creation complete Beginning final archive assembly... Archive creation complete
次に、イメージをGlanceにアップロードします。
# export OS_AUTH_URL=http://localhost:5000/v2.0/ # export OS_PASSWORD=glance # export OS_USERNAME=glance # export OS_TENANT_NAME=service # glance image-create --container-format bare --disk-format raw \ --is-public true --name "Base Zone" --property architecture=sparc64 \ --property hypervisor_type=solariszones \ --property vm_mode=solariszones < myzone.uar +----------------------------+--------------------------------------+ | Property | Value | +----------------------------+--------------------------------------+ | Property 'architecture' | sparc64 | | Property 'hypervisor_type' | solariszones | | Property 'vm_mode' | solariszones | | checksum | 336bdfe5f76876fe24907e35479101e7 | | container_format | bare | | created_at | 2014-09-11T00:52:14.269232 | | deleted | False | | deleted_at | None | | disk_format | raw | | id | b42e47ee-d8dc-e50c-d6e0-9206d761ce41 | | is_public | True | | min_disk | 0 | | min_ram | 0 | | name | Base Zone | | owner | f17341f0a2a24ec9ec5f9ca497e8c0cc | | protected | False | | size | 1277245440 | | status | active | | updated_at | 2014-09-11T00:52:42.352947 | +----------------------------+--------------------------------------+
NovaはOpenStackのコンピューティング・サービスであり、新しいインスタンスのスケジュール設定やデプロイを行います。Glanceと同様に複数のサービスから成り、それらのサービスを構成して有効化する必要があります。ここでもスクリプトを用いて、すばやく構成します。
# ./hol_single_host.py nova configuring nova
さらに、Novaではサービスの起動順に少し気を配る必要があります。まず、コンダクタ・サービス(原則的に、コンピューティング・ノードからNovaデータベースへのアクセスをプロキシするサービス)を有効化してから、他のサービスを有効化してください。
# svcadm enable -rs nova-conductor # svcadm enable -rs nova-api-ec2 nova-api-osapi-compute nova-scheduler nova-cert nova-compute
Novaが正常に機能しているかを確認します。いくつかの環境変数を設定して、エンドポイントの情報を表示します。
# export OS_AUTH_URL=http://localhost:5000/v2.0/ # export OS_PASSWORD=nova # export OS_USERNAME=nova # export OS_TENANT_NAME=service # nova endpoints +-------------+-------------------------------------------------------------+ | nova | Value | +-------------+-------------------------------------------------------------+ | adminURL | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | id | 08eb495c11864f67d4a0e58c8ce53e8b | | internalURL | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | publicURL | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | region | RegionOne | | serviceName | nova | +-------------+-------------------------------------------------------------+ +-------------+----------------------------------+ | neutron | Value | +-------------+----------------------------------+ | adminURL | http://localhost:9696/ | | id | 96e693c539c0ca3ee5f0c04e958c33fe | | internalURL | http://localhost:9696/ | | publicURL | http://localhost:9696/ | | region | RegionOne | +-------------+----------------------------------+ +-------------+----------------------------------+ | glance | Value | +-------------+----------------------------------+ | adminURL | http://localhost:9292 | | id | 121ad7a65c0fce83834583b2c0c7c3fb | | internalURL | http://localhost:9292 | | publicURL | http://localhost:9292 | | region | RegionOne | +-------------+----------------------------------+ +-------------+-----------------------------------------------------------+ | cinder | Value | +-------------+-----------------------------------------------------------+ | adminURL | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | id | ee83dab8b39d4d0ad480a75cadb965dc | | internalURL | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | publicURL | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc | | region | RegionOne | +-------------+-----------------------------------------------------------+ +-------------+--------------------------------------+ | ec2 | Value | +-------------+--------------------------------------+ | adminURL | http://localhost:8773/services/Admin | | id | 1558b719141ae2fed54ff0bfe80cb646 | | internalURL | http://localhost:8773/services/Cloud | | publicURL | http://localhost:8773/services/Cloud | | region | RegionOne | +-------------+--------------------------------------+ +-------------+----------------------------------------------------------------+ | swift | Value | +-------------+----------------------------------------------------------------+ | adminURL | http://localhost:8080/v1 | | id | 51f1908de52f68af984c849985924e0b | | internalURL | http://localhost:8080/v1/AUTH_f17341f0a2a24ec9ec5f9ca497e8c0cc | | publicURL | http://localhost:8080/v1/AUTH_f17341f0a2a24ec9ec5f9ca497e8c0cc | | region | RegionOne | +-------------+----------------------------------------------------------------+ +-------------+----------------------------------+ | keystone | Value | +-------------+----------------------------------+ | adminURL | http://localhost:35357/v2.0 | | id | 371c73559bd842d6b961d021eeeaa2e5 | | internalURL | http://localhost:5000/v2.0 | | publicURL | http://localhost:5000/v2.0 | | region | RegionOne | +-------------+----------------------------------+
正常に機能しているため、次に進みます。
Cinderは、OpenStackでブロック・ストレージを提供します。ブロック・ストレージは通常、コンピューティング・インスタンスに関連付けます。これまでと同様に、複数のサービスを構成して有効化する必要があります。
# ./hol_single_host.py cinder configuring cinder # svcadm enable -rs cinder-api cinder-db cinder-scheduler cinder-volume:setup cinder-volume:default
すべて正常に構成されたことを再確認します。
# export OS_AUTH_URL=http://localhost:5000/v2.0/ # export OS_PASSWORD=cinder # export OS_USERNAME=cinder # export OS_TENANT_NAME=service # cinder list +----+--------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +----+--------+--------------+------+-------------+----------+-------------+ +----+--------+--------------+------+-------------+----------+-------------+
まだブロック・ストレージを割り当てていないため、この結果は正常です。
NeutronはOpenStackでネットワーク機能を提供し、同じテナント内やサブネット内でのVMの相互通信や、VMから外部への直接通信を実行できるようにします。この機能は、異なる多数のサービスによって実現されます。Oracle Solaris実装は内部的にElastic Virtual Switch(EVS)を利用します。EVSは、複数のコンピューティング・ノードにわたって必要な調査を行い、トラフィックを適切にルーティングします。EVSとNeutron間でSSHキーとrad
を用いてある程度の信頼性を確保するには、一部の構成をOpenStackの外部で行う必要があります。
まず、evsuser
、neutron
、root
の各ユーザーのSSHキーを生成しましょう。
# su - evsuser -c "ssh-keygen -N '' -f /var/user/evsuser/.ssh/id_rsa -t rsa" Generating public/private rsa key pair. Your identification has been saved in /var/user/evsuser/.ssh/id_rsa. Your public key has been saved in /var/user/evsuser/.ssh/id_rsa.pub. The key fingerprint is: 13:cb:06:c4:88:5e:10:7d:84:8b:c8:38:30:83:89:9f evsuser@solaris # su - neutron -c "ssh-keygen -N '' -f /var/lib/neutron/.ssh/id_rsa -t rsa" Generating public/private rsa key pair. Created directory '/var/lib/neutron/.ssh'. Your identification has been saved in /var/lib/neutron/.ssh/id_rsa. Your public key has been saved in /var/lib/neutron/.ssh/id_rsa.pub. The key fingerprint is: 13:d6:ef:22:4b:f0:cf:9f:14:e3:ee:50:05:1a:c7:a5 neutron@solaris # ssh-keygen -N '' -f /root/.ssh/id_rsa -t rsa Generating public/private rsa key pair. Created directory '/root/.ssh'. Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: c1:6f:a5:38:fc:11:85:16:ad:1d:ad:cd:2f:38:ce:26 root@solaris
次に、これらのサービス間でパスワード不要のアクセスを実現するために、さまざまなSSH公開キーをauthorized_keys
に追加する必要があります。
# cat /var/user/evsuser/.ssh/id_rsa.pub /var/lib/neutron/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub \ >> /var/user/evsuser/.ssh/authorized_keys
最後に、これらのサービスにログインして、1回限りの質問に答える必要があります。
# su - evsuser -c "ssh evsuser@localhost true" The authenticity of host 'localhost (::1)' can't be established. RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3. Are you sure you want to continue connecting (yes/no)?yes Warning:Permanently added 'localhost' (RSA) to the list of known hosts. # su - neutron -c "ssh evsuser@localhost true" The authenticity of host 'localhost (::1)' can't be established. RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3. Are you sure you want to continue connecting (yes/no)?yes Warning:Permanently added 'localhost' (RSA) to the list of known hosts. # ssh evsuser@localhost true The authenticity of host 'localhost (::1)' can't be established. RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3. Are you sure you want to continue connecting (yes/no)?yes Warning:Permanently added 'localhost' (RSA) to the list of known hosts.
Oracle Solarisでは、コントローラという概念を用いて、データセンター内の複数のリソースにわたってEVSを管理します。コントローラは、一元化された調整ポイントです。このノードに適切なコントローラを構成し(複数のコンピューティング・ノードでこの構成を行う場合は、それぞれのコンピューティング・ノードで同じ作業を行う必要があります)、EVSデータベースを初期化します。
# evsadm set-prop -p controller=ssh://evsuser@localhost # evsadm # evsadm show-prop PROPERTY PERM VALUE DEFAULT controller rw ssh://evsuser@localhost --
このセットアップでは、VXLANを利用して、ネットワーク・トラフィックに適切にタグを付け、トラフィックを分離します。そのように構成するには、以下のコマンドを実行します。
# evsadm set-controlprop -p l2-type=vxlan # evsadm set-controlprop -p vxlan-range=200-300
また、コントローラのアップリンク・ポートとしてnet0
(ここで利用できる唯一のNIC)を設定する必要があります。
# evsadm set-controlprop -p uplink-port=net0 # evsadm show-controlprop PROPERTY PERM VALUE DEFAULT HOST l2-type rw vxlan vlan -- uplink-port rw net0 -- -- vlan-range rw -- -- -- vlan-range-avail r- -- -- -- vxlan-addr rw 0.0.0.0 0.0.0.0 -- vxlan-ipvers rw v4 v4 -- vxlan-mgroup rw 0.0.0.0 0.0.0.0 -- vxlan-range rw 200-300 -- -- vxlan-range-avail r- 200-300 -- --
これで、EVSによる基本構成が完了したので、この基本構成を利用するようにNeutronを構成できます。ここでは便宜上、スクリプトを利用します。
# ./hol_single_host.py neutron configuring neutron # svcadm enable -rs neutron-server neutron-dhcp-agent
Neutronをテストし、正常に機能していることを確認しましょう。
# export OS_AUTH_URL=http://localhost:5000/v2.0/ # export OS_PASSWORD=neutron # export OS_USERNAME=neutron # export OS_TENANT_NAME=service # neutron net-list
まだネットワークを作成していないため、結果が空であることは想定内です。
最後に、Horizonを構成します。HorizonはOpenStack用のWebベースのダッシュボードであり、マルチテナント環境でのセルフサービス機能を提供します。スクリプトを利用してこの構成を行います。
# ./hol_single_host.py horizon configuring horizon # cp /etc/apache2/2.2/samples-conf.d/openstack-dashboard-http.conf /etc/apache2/2.2/conf.d # svcadm enable apache22 # svcs apache22 STATE STIME FMRI online 1:53:42 svc:/network/http:apache22
ホスト環境内でブラウザを起動し、割り当てられたIPアドレス(http://10.158.56.x/horizon
)にアクセスします。ログイン画面で、ユーザー名/パスワードとしてadmin
/secrete
と指定します。
図2:ログイン画面
サインイン後、OpenStack管理者向けのメイン・ダッシュボードが表示されます。画面の左側には、管理パネルとプロジェクト・パネルをそれぞれ示す2つのタブがあります。プロジェクト・パネルには、この現在のユーザーが属しているプロジェクトが一覧表示されます。プロジェクトは、組織的なグループに分類するための手段と考えてください。
ここでは、管理者としてインスタンスを起動せずに、Adminタブで新しいユーザーを作成します。メニューから「Users」を選択して、以下の画面を開きます。
図3:Users画面
数人のユーザーがすでに定義されています。定義済みのユーザーは管理者か、または各種OpenStackサービス向けのユーザーです。
「Create User」ボタンをクリックし、このユーザーの詳細情報を入力します(図4を参照)。ここでは、この新しいユーザーをデモ・プロジェクトに追加しますが、必要であれば同様に新しいプロジェクトを作成してもかまいません。
図4:Create User画面
サインアウトし、この新しいユーザーでログインします。
次に必要となる作業は、このユーザーの鍵ペアの追加です。メニューから「Access & Security」を選択して、以下の画面を開きます。
図5:Access & Security画面
現時点では、鍵ペアは定義されていません。「Import Keypair」ボタンをクリックして、図6のImport Keypair画面を開きます。
この例では、大域ゾーンのSSH公開鍵を利用します。まず、以下のコマンドを実行して鍵を取得し、この鍵をImport Keypair画面のPublic Keyフィールドに入力します。
root@solaris:~# cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0Khp4Th5VcKQW4LttqzKAR8O60gj43cB0CbdpiizEhXEbVgjI7IlnZl o9iSEFpJlnZrFQC8MU2L7Hn+CD5nXLT/uK90eAEVXVqwc4Y7IVbEjrABQyB74sGnJy+SHsCGgetjwVrifR9 fkxFHgjxXkOunXrPMe86hDJRpZLJFGYZZezJRtd1eRwVNSHhJdZmUac7cILFJen/wSsM8TOSAkh+ZWEhwY3 o08nZg2IWdMImPbwPwtRohJSH3W7XkDE85d7UZebNJpD9kDAw6OmXsY5CLgV6gEoUExZ/J4k29WOrr1XKR3 jiRqQlf3Kw4YuK9JUi/gPhg2lTOhISgJoelorQ== root@solaris
図6:Import Keypair画面
SSH鍵ペアのインポート終了後、このインスタンス用のネットワークを作成します。メニューから「Networks」を選択して、以下の画面を開きます。
図7:Networks画面
現時点でネットワークは定義されていません。新しいネットワークを作成しましょう。まず、「Create Network」ボタンをクリックします。
mynetwork
というネットワークを、サブネット名mysubnet
として、192.168.x.0/24
のアドレス範囲で作成します。この指定により、このネットワークを選択するインスタンスは、このアドレス範囲内(192.168.x.3
から始まる)で作成されます。
図8:Create Network画面
作成後のネットワークがNetworks画面の一覧に表示されます。
図9:Networks画面に表示される作成後のネットワーク
これで、新しいインスタンスを起動できるようになりました。メニューから「Instances」を選択して、以下の画面を開きます。
図10:Instance画面
新しいインスタンスを起動しましょう。まず、「Launch Instance」ボタンをクリックします。
インスタンスの名称はmyinstance
とします。このインスタンスに、tiny
というOracle Solaris非大域ゾーンのフレーバを指定します。フレーバは、このインスタンスに付与する必要があるリソースの規模を表します。図11から分かるように、10GBのルート・ディスクと2,048MBのRAMが適用されます。このインスタンスを、先ほどアップロードしてGlanceに保管したイメージ(Base Zone
という名称のもの)からブートするようにします。
図11:Launch Instance画面
Detailsタブの内容に問題がなければ、次にAccess & Securityタブに移ります。この画面では、先ほどの鍵ペアが選択済みですので、すぐにNetworkingタブに移ります。この画面で、ネットワークとして「mynetwork
」を選択し、「Launch」ボタンをクリックします。
図12:Networkingタブ
少し待った後、インスタンスが192.168.x.3
というIPアドレスにより正常にブートされます。
図13:インスタンスのステータスが"アクティブ"であることを示す画面
これで、このインスタンスにログインできるようになりました。このラボでは、内部ネットワーク・トポロジをセットアップするだけの単純な手順を確認しました。一般的なクラウド環境では、VMが外部と通信するための外部ネットワークをセットアップします。そのようなVMには、大域ゾーンからアクセスする必要があります。
root@solaris:~# ssh root@192.168.x.3 The authenticity of host '192.168.66.3 (192.168.66.3)' can't be established. RSA key fingerprint is 89:64:96:91:67:ab:6b:35:58:37:35:b8:ab:f3:e5:98. Are you sure you want to continue connecting (yes/no)?yes Warning:Permanently added '192.168.66.3' (RSA) to the list of known hosts. Last login:Thu Sep 11 00:33:57 2014 Oracle Corporation SunOS 5.11 11.2 June 2014 root@host-192-168-66-3:~# ipadm NAME CLASS/TYPE STATE UNDER ADDR lo0 loopback ok -- -- lo0/v4 static ok -- 127.0.0.1/8 lo0/v6 static ok -- ::1/128 net0 ip ok -- -- net0/dhcp inherited ok -- 192.168.66.3/24 root@host-192-168-66-3:~# exit logout Connection to 192.168.66.3 closed.
大域ゾーンから、OpenStackにより作成された要素を確認します。まず、作成されたゾーンを確認します。
root@solaris:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 2 instance-00000001 running /system/zones/instance-00000002 solaris excl
リスト1
リスト1では、1つの非大域ゾーンが正常に稼働していることが分かります。この非大域ゾーンがNovaインスタンスに相当します。次に、このインスタンスに対して作成されたネットワークを確認します。
root@solaris:~# ipadm NAME CLASS/TYPE STATE UNDER ADDR evsaf75747a_3_0 ip ok -- -- evsaf75747a_3_0/v4 static ok -- 192.168.66.2/24 lo0 loopback ok -- -- lo0/v4 static ok -- 127.0.0.1/8 lo0/v6 static ok -- ::1/128 net0 ip ok -- -- net0/v4 static ok -- 10.158.56.70/24
リスト2
リスト2では、新しいNICがあることが分かります。以前、このVMでは1つの物理NICしかなかったことを考慮すると、新しいNICは仮想NICであることがうかがえます。実際に確認しましょう。
root@solaris:~# dladm show-vnic LINK OVER SPEED MACADDRESS MACADDRTYPE VIDS evsaf75747a_3_0 evs-vxlan200 1000 2:8:20:6d:cb:f4 fixed 0 instance-00000002/net0 evs-vxlan200 1000 2:8:20:72:63:4a fixed 0
リスト3
リスト3では、新しいNICはVNICであることが分かりますが、さらに新しいインスタンス向けにVNICが作成されています。EVSでどのような構成が行われたかを確認しましょう。
root@solaris:/rpool# evsadm show-evs EVS TENANT STATUS NVPORTS IPNETS HOST mynetwork 49068a0d5bce6f8780e7bb786feb9d75 busy 2 mysubnet solaris
リスト4
リスト4では、1つのElastic Virtual Switchが作成されていることが分かります。このサブネットのIPネットワークを調べましょう。
root@solaris:/rpool# evsadm show-ipnet NAME TENANT SUBNET DEFROUTER AVAILRANGE mynetwork/mysubnet 49068a0d5bce6f8780e7bb786feb9d75 192.168.66.0/24 192.168.66.1 192.168.66.4-192.168.66.254
リスト5
リスト5では、192.168.x.0/24
のサブネットが作成され、そのデフォルト・ルーターは192.168.x.1
であることが分かります。この仮想スイッチがどのように構成されているかを確認するために、割り当てられている仮想ポートを調査します(リスト6を参照)。
root@solaris:~# evsadm show-vport NAME TENANT STATUS VNIC HOST mynetwork/af75747a396811e4a440a52ebd715acf 49068a0d5bce6f8780e7bb786feb9d75 used evsaf75747a_3_0 solaris mynetwork/1fd1bb30397211e4962c317e4dba6ecd 49068a0d5bce6f8780e7bb786feb9d75 used instance-00000005/net0 solaris
リスト6
最後に、このElastic Virtual Switchのプロパティを確認します(リスト7を参照)。
root@solaris:~# evsadm show-evsprop EVS TENANT PROPERTY PERM VALUE DEFAULT POSSIBLE mynetwork 49068a0d5bce6f8780e7bb786feb9d75 maxbw rw -- -- -- mynetwork 49068a0d5bce6f8780e7bb786feb9d75 priority rw -- medium low,medium, high mynetwork 49068a0d5bce6f8780e7bb786feb9d75 l2-type r- vxlan -- -- mynetwork 49068a0d5bce6f8780e7bb786feb9d75 vlanid r- -- -- -- mynetwork 49068a0d5bce6f8780e7bb786feb9d75 vni r- 200 -- -- mynetwork 49068a0d5bce6f8780e7bb786feb9d75 tenant r- 49068a0d5bce6f8780e7bb786feb9d75 -- --
リスト7
もう一度AdminタブのVolumesメニューに移り、ブロック・ストレージをプロビジョニングします。myvolume
(1GB
のサイズ)の作成後、この画面は以下のようになります。
図14:Volumes画面
もう一度zfs list
コマンドを実行して大域ゾーンを確認すると(リスト8を参照)、新しいデータセットがrpool/cinder
の下に作成されていることが分かります。これは、デフォルトのCinderプラグインが基本のZFSボリューム・ドライバであり、このドライバがrpool
からZFSデータセットをプロビジョニングするためです。
root@solaris:/#zfs list | grep cinder rpool/cinder 1.03G 24.5G 31K /rpool/cinder rpool/cinder/volume-25f4c9b0-2645-cecd-e13d-e76d371d026f 1.03G 25.5G 16K -
リスト8
Cinderは、iSCSI経由でボリュームをプロビジョニングするか、またはOracle ZFS Storage Applianceから直接プロビジョニングするように構成できます。
お疲れ様でした。これでこのラボは終了です。時間があり、続きに興味がある方は、以下の追加演習に挑戦してください。ご参加いただき、ありがとうございました。
このラボでは、VMが192.168.x.0/24
アドレス空間で通信するためのプライベート・ネットワークを構成しました。VMが10.158.56.x
のホストにpingできるように、NeutronとEVSを構成してみてください。
ヒント:neutron-l3-agent
サービスを利用する必要があります。
Swiftは、OpenStackでオブジェクト・ストレージ機能を提供するサービスです。このラボでは説明しませんでしたが、インスタンスにオブジェクト・ストレージ機能を提供するようにSwiftをセットアップしてみてください。
hol_single_host.py
構成スクリプト#!/usr/bin/python # Copyright (c) 2013, 2014, Oracle and/or its affiliates.All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License.You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the # License for the specific language governing permissions and limitations # under the License. import ConfigParser import grp import os import pwd import shutil import sys import time import netifaces from M2Crypto import RSA from subprocess import CalledProcessError, Popen, PIPE, check_call def keystone(): print "configuring keystone" config = ConfigParser.RawConfigParser() config.readfp(open("/etc/keystone/keystone.conf")) config.set("DEFAULT", "admin_token", "ADMIN") config.set("identity", "driver", "keystone.identity.backends.sql.Identity") config.set("catalog", "driver", "keystone.catalog.backends.sql.Catalog") config.set("token", "provider", "keystone.token.providers.uuid.Provider") config.set("signing", "token_format", "UUID") with open("/etc/keystone/keystone.conf", "wb") as fh: config.write(fh) def glance(): print "configuring glance" config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-api.conf")) config.set("keystone_authtoken", "admin_tenant_name", "service") config.set("keystone_authtoken", "admin_user", "glance") config.set("keystone_authtoken", "admin_password", "glance") with open("/etc/glance/glance-api.conf", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-cache.conf")) config.set("DEFAULT", "auth_url", "http://127.0.0.1:5000/v2.0/") config.set("DEFAULT", "admin_tenant_name", "service") config.set("DEFAULT", "admin_user", "glance") config.set("DEFAULT", "admin_password", "glance") with open("/etc/glance/glance-cache.conf", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-registry.conf")) config.set("keystone_authtoken", "admin_tenant_name", "service") config.set("keystone_authtoken", "admin_user", "glance") config.set("keystone_authtoken", "admin_password", "glance") with open("/etc/glance/glance-registry.conf", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-api-paste.ini")) config.set("pipeline:glance-api", "pipeline", "versionnegotiation authtoken context apiv1app") config.set("filter:authtoken", "auth_host", "127.0.0.1") config.set("filter:authtoken", "auth_port", "35357") config.set("filter:authtoken", "auth_protocol", "http") config.set("filter:authtoken", "admin_tenant_name", "service") config.set("filter:authtoken", "admin_user", "glance") config.set("filter:authtoken", "admin_password", "glance") with open("/etc/glance/glance-api-paste.ini", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-registry-paste.ini")) config.set("pipeline:glance-registry", "pipeline", "authtoken context apiv1app") config.set("filter:authtoken", "auth_host", "127.0.0.1") config.set("filter:authtoken", "auth_port", "35357") config.set("filter:authtoken", "auth_protocol", "http") config.set("filter:authtoken", "admin_tenant_name", "service") config.set("filter:authtoken", "admin_user", "glance") config.set("filter:authtoken", "admin_password", "glance") with open("/etc/glance/glance-registry-paste.ini", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/glance/glance-scrubber.conf")) config.set("DEFAULT", "filesystem_store_datadir", "/var/lib/glance/images") config.set("DEFAULT", "swift_store_auth_address", "127.0.0.1:5000/v2.0/") config.set("DEFAULT", "swift_store_user", "johndoe:johndoe") config.set("DEFAULT", "swift_store_key", "a86850deb2742ec3cb41518e26aa2d89") config.set("DEFAULT", "s3_store_host", "127.0.0.1:8080/v1.0/") config.set("DEFAULT", "s3_store_access_key", '"<20-char AWS access key>"') config.set("DEFAULT", "s3_store_secret_key", '"<40-char AWS secret key>"') config.set("DEFAULT", "s3_store_bucket", '"<lowercased 20-char aws key>"') config.set("DEFAULT", "s3_store_create_bucket_on_put", "False") config.set("DEFAULT", "auth_url", "http://127.0.0.1:5000/v2.0/") config.set("DEFAULT", "admin_tenant_name", "service") config.set("DEFAULT", "admin_user", "glance") config.set("DEFAULT", "admin_password", "glance") with open("/etc/glance/glance-scrubber.conf", "wb") as fh: config.write(fh) def neutron(): print "configuring neutron" config = ConfigParser.RawConfigParser() config.readfp(open("/etc/neutron/neutron.conf")) config.set("DEFAULT", "allow_overlapping_ips", "False") if not config.has_section("keystone_authtoken"): config.add_section("keystone_authtoken") config.set("keystone_authtoken", "auth_host", "127.0.0.1") config.set("keystone_authtoken", "auth_port", "35357") config.set("keystone_authtoken", "auth_protocol", "http") config.set("keystone_authtoken", "admin_tenant_name", "service") config.set("keystone_authtoken", "admin_user", "neutron") config.set("keystone_authtoken", "admin_password", "neutron") config.set("keystone_authtoken", "signing_dir", "/var/lib/neutron/keystone-signing") with open("/etc/neutron/neutron.conf", "wb") as fh: config.write(fh) def nova(): print "configuring nova" config = ConfigParser.RawConfigParser() config.readfp(open("/etc/nova/nova.conf")) config.set("DEFAULT", "firewall_driver", "nova.virt.firewall.NoopFirewallDriver") config.set("DEFAULT", "neutron_url", "http://localhost:9696") config.set("DEFAULT", "neutron_admin_username", "neutron") config.set("DEFAULT", "neutron_admin_password", "neutron") config.set("DEFAULT", "neutron_admin_tenant_name", "service") config.set("DEFAULT", "neutron_admin_auth_url", "http://localhost:5000/v2.0") config.set("DEFAULT", "neutron_auth_strategy", "keystone") with open("/etc/nova/nova.conf", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/nova/api-paste.ini")) config.set("filter:authtoken", "admin_tenant_name", "service") config.set("filter:authtoken", "admin_user", "nova") config.set("filter:authtoken", "admin_password", "nova") with open("/etc/nova/api-paste.ini", "wb") as fh: config.write(fh) def cinder(): print "configuring cinder" config = ConfigParser.RawConfigParser() config.readfp(open("/etc/cinder/cinder.conf")) config.set("DEFAULT", "my_ip", "localhost") config.set("DEFAULT", "scheduler_driver", "cinder.scheduler.simple.SimpleScheduler") config.set("DEFAULT", "zfs_volume_base", "rpool/cinder") with open("/etc/cinder/cinder.conf", "wb") as fh: config.write(fh) config = ConfigParser.RawConfigParser() config.readfp(open("/etc/cinder/api-paste.ini")) config.set("filter:authtoken", "admin_tenant_name", "service") config.set("filter:authtoken", "admin_user", "cinder") config.set("filter:authtoken", "admin_password", "cinder") config.set("filter:authtoken", "signing_dir", "/var/lib/cinder/keystone-signing") with open("/etc/cinder/api-paste.ini", "wb") as fh: config.write(fh) def horizon(): print "configuring horizon" # who loves sed? cmd = ["gsed", '-i', "-e", "s@SECURE_PROXY_SSL_HEADER@#SECURE_PROXY_SSL_HEADER@", "-e", "s@CSRF_COOKIE_SECURE@#CSRF_COOKIE_SECURE@", "-e", "s@SESSION_COOKIE_SECURE@#SESSION_COOKIE_SECURE@", "-e", "s@from horizon.utils @#from horizon.utils@", "-e", "s@SECRET_KEY@#SECRET_KEY@", "/etc/openstack_dashboard/local_settings.py"] try: check_call(cmd) except CalledProcessError: print "text/gnu-sed not installed: skipping horizon configuration." return def main(args): if not args: print "hol_single_host.py [args]" print "Arguments can be one of: all, keystone, glance, nova, cinder, horizon, neutron" if "all" in args: args = ["keystone", "glance", "nova", "cinder", "horizon", "swift", "neutron"] if "keystone" in args: keystone() if "glance" in args: glance() if "nova" in args: nova() if "cinder" in args: cinder() if "horizon" in args: horizon() if "neutron" in args: neutron() if __name__ == "__main__": main(sys.argv[1:])
また、次のリソースも参照してください。
Glynn Fosterは、Oracle SolarisのPrincipal Product ManagerですOpenStack、Oracle Solaris Image Packaging System、インストール、構成管理など、さまざまなテクノロジー領域を担当しています。
リビジョン1.0、2015/01/07 |