JUJU + MAASによるOpenstackの構築と、 Gnocchi Grafanaを使用したリソース監視の作成に挑戦しました。
今回の筆者は コムシス情報システム株式会社 山本 聡(やまもと さとる)です。 以前のエントリーでKubernetesの構築について書かせていただきました。 http://tech.virtualtech.jp/entry/2018/03/29/104216
実行環境
構成はk8s構築で使用した物理サーバを流用します。 また、Openstack外部接続用のネットワークを追加しました。
MAASのインストール
MAAS、Ubuntuのインストールを実施します。
以下の設定でUbuntu Serverをインストール
インストールモード:Install Ubuntu Server(通常のインストール)
Language:日本語
Timezone:日本
Keyboard:Japanese
ソフトウェアの選択:OpenSSH Server
ネットワーク設定からMAAS+JUJUのインストール
JUJUのインストールまで以前のエントリーと同様です。 http://tech.virtualtech.jp/entry/2018/03/29/104216
MAASで認識された各サーバにタグを付与
Openstackのデプロイ用にMAAS上の各ノードにタグを付与します。
- node01
コントローラーノードとして設定
- node02
コンピュート及びcephノードとして設定
- node03
コンピュート及びcephノードとして設定
Openstackデプロイ
Openstackデプロイ用yamlファイルの作成
Openstack自動構築用のyamlファイルを用意します。 "tags="で記述される箇所がMAASのタグと一致するよう注意してください。
$ vim openstack-telemetry.yaml
machines: '0': series: xenial constraints: "arch=amd64 tags=node01" '1': series: xenial constraints: "arch=amd64 tags=node02" '2': series: xenial constraints: "arch=amd64 tags=node03" relations: - - nova-compute:amqp - rabbitmq-server:amqp - - neutron-gateway:amqp - rabbitmq-server:amqp - - keystone:shared-db - mysql:shared-db - - nova-cloud-controller:identity-service - keystone:identity-service - - glance:identity-service - keystone:identity-service - - neutron-api:identity-service - keystone:identity-service - - neutron-openvswitch:neutron-plugin-api - neutron-api:neutron-plugin-api - - neutron-api:shared-db - mysql:shared-db - - neutron-api:amqp - rabbitmq-server:amqp - - neutron-gateway:neutron-plugin-api - neutron-api:neutron-plugin-api - - glance:shared-db - mysql:shared-db - - glance:amqp - rabbitmq-server:amqp - - nova-cloud-controller:image-service - glance:image-service - - nova-compute:image-service - glance:image-service - - nova-cloud-controller:cloud-compute - nova-compute:cloud-compute - - nova-cloud-controller:amqp - rabbitmq-server:amqp - - nova-cloud-controller:quantum-network-service - neutron-gateway:quantum-network-service - - nova-compute:neutron-plugin - neutron-openvswitch:neutron-plugin - - neutron-openvswitch:amqp - rabbitmq-server:amqp - - openstack-dashboard:identity-service - keystone:identity-service - - nova-cloud-controller:shared-db - mysql:shared-db - - nova-cloud-controller:neutron-api - neutron-api:neutron-api - - cinder:image-service - glance:image-service - - cinder:amqp - rabbitmq-server:amqp - - cinder:identity-service - keystone:identity-service - - cinder:cinder-volume-service - nova-cloud-controller:cinder-volume-service - - cinder-ceph:storage-backend - cinder:storage-backend - - ceph-mon:client - nova-compute:ceph - - nova-compute:ceph-access - cinder-ceph:ceph-access - - cinder:shared-db - mysql:shared-db - - ceph-mon:client - cinder-ceph:ceph - - ceph-mon:client - glance:ceph - - ceph-osd:mon - ceph-mon:osd - - ntp:juju-info - nova-compute:juju-info - - ntp:juju-info - neutron-gateway:juju-info - - ceph-radosgw:mon - ceph-mon:radosgw - - ceph-radosgw:identity-service - keystone:identity-service - - ceilometer:amqp - rabbitmq-server:amqp - - ceilometer-agent:ceilometer-service - ceilometer:ceilometer-service - - ceilometer:identity-notifications - keystone:identity-notifications - - ceilometer-agent:nova-ceilometer - nova-compute:nova-ceilometer - - aodh:shared-db - mysql:shared-db - - aodh:identity-service - keystone:identity-service - - aodh:amqp - rabbitmq-server:amqp - - gnocchi:storage-ceph - ceph-mon:client - - gnocchi:shared-db - mysql:shared-db - - gnocchi:amqp - rabbitmq-server:amqp - - gnocchi:coordinator-memcached - memcached:cache - - gnocchi:metric-service - ceilometer:metric-service - - gnocchi:identity-service - keystone:identity-service - - ceilometer:identity-credentials - keystone:identity-credentials series: xenial services: aodh: annotations: gui-x: '1500' gui-y: '0' charm: cs:aodh-12 num_units: 1 options: openstack-origin: cloud:xenial-queens to: - lxd:0 ceilometer: annotations: gui-x: '1250' gui-y: '0' charm: cs:ceilometer-252 num_units: 1 options: openstack-origin: cloud:xenial-queens to: - lxd:2 ceilometer-agent: annotations: gui-x: '1250' gui-y: '500' charm: cs:ceilometer-agent-243 num_units: 0 ceph-mon: annotations: gui-x: '750' gui-y: '500' charm: cs:ceph-mon-23 num_units: 2 options: expected-osd-count: 2 monitor-count: 2 source: cloud:xenial-queens to: - lxd:1 - lxd:2 ceph-osd: annotations: gui-x: '1000' gui-y: '500' charm: cs:ceph-osd-257 num_units: 2 options: osd-devices: /dev/sdb osd-reformat: 'yes' source: cloud:xenial-queens to: - '1' - '2' ceph-radosgw: annotations: gui-x: '1000' gui-y: '250' charm: cs:ceph-radosgw-256 num_units: 1 options: source: cloud:xenial-queens to: - lxd:1 cinder: annotations: gui-x: '750' gui-y: '0' charm: cs:cinder-268 num_units: 1 options: block-device: None glance-api-version: 2 openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - lxd:2 cinder-ceph: annotations: gui-x: '750' gui-y: '250' charm: cs:cinder-ceph-231 num_units: 0 glance: annotations: gui-x: '250' gui-y: '0' charm: cs:glance-263 num_units: 1 options: openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - lxd:2 gnocchi: annotations: gui-x: '1500' gui-y: '250' charm: cs:gnocchi-7 num_units: 1 options: openstack-origin: cloud:xenial-queens to: - lxd:0 keystone: annotations: gui-x: '500' gui-y: '0' charm: cs:keystone-275 num_units: 1 options: admin-password: openstack openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - lxd:1 memcached: annotations: gui-x: '1500' gui-y: '500' charm: cs:memcached-18 num_units: 1 to: - lxd:2 mysql: annotations: gui-x: '0' gui-y: '250' charm: cs:percona-cluster-259 num_units: 1 options: innodb-buffer-pool-size: 256M max-connections: 1000 to: - lxd:2 neutron-api: annotations: gui-x: '500' gui-y: '500' charm: cs:neutron-api-258 num_units: 1 options: flat-network-providers: physnet1 neutron-security-groups: true openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - lxd:2 neutron-gateway: annotations: gui-x: '0' gui-y: '0' charm: cs:neutron-gateway-247 num_units: 1 options: bridge-mappings: physnet1:br-ex data-port: br-ex:eno2 openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - '0' neutron-openvswitch: annotations: gui-x: '250' gui-y: '500' charm: cs:neutron-openvswitch-249 num_units: 0 nova-cloud-controller: annotations: gui-x: '0' gui-y: '500' charm: cs:nova-cloud-controller-306 num_units: 1 options: network-manager: Neutron openstack-origin: cloud:xenial-queens worker-multiplier: 0.25 to: - lxd:0 nova-compute: annotations: gui-x: '250' gui-y: '250' charm: cs:nova-compute-282 num_units: 2 options: config-flags: default_ephemeral_format=ext4 enable-live-migration: true enable-resize: true migration-auth-type: ssh openstack-origin: cloud:xenial-queens to: - '1' - '2' ntp: annotations: gui-x: '1000' gui-y: '0' charm: cs:ntp-24 num_units: 0 openstack-dashboard: annotations: gui-x: '500' gui-y: '-250' charm: cs:openstack-dashboard-257 num_units: 1 options: openstack-origin: cloud:xenial-queens to: - lxd:0 rabbitmq-server: annotations: gui-x: '500' gui-y: '250' charm: cs:rabbitmq-server-72 num_units: 1 to: - lxd:0 grafana: charm: "cs:xenial/grafana-9" num_units: 1 options: install_method: apt admin_password: password5656 annotations: gui-x: '132.75' gui-y: '1066' to: - lxd:1
設定値のポイント解説
- osd-devices: /dev/sdb
ceph-osdが設定されるサーバはディスクが2つ設定されている必要があります。
- bridge-mappings: physnet1:br-ex
- data-port: br-ex:eno2
サーバが認識するネットワークポートと一致させる必要があります。
- config-flags: default_ephemeral_format=ext4
今回はext4で構成しますが、異なるファイルシステムも使用することが出来ます。
juju deploy を実行
$ juju deploy openstack-telemetry.yaml
openstackclientをインストール
Openstackを操作するためのクライアントをインストールします。
$ sudo apt install python-openstackclient
novarc_autoファイルの作成
Openstackクライアントの動作に必要なrcファイルを作成します
$ vim novarc_auto
_OS_PARAMS=$(env | awk 'BEGIN {FS="="} /^OS_/ {print $1;}' | paste -sd ' ') for param in $_OS_PARAMS; do unset $param done unset _OS_PARAMS keystone_unit=$(juju status keystone|grep -i workload -A1|tail -n1|awk '{print $1}'|tr -d '*') echo Keystone unit: ${keystone_unit} if ! curl -qs `juju run --unit ${keystone_unit} "unit-get private-address"`:5000/v3 | grep 404 ; then echo Using keystone v3 api export OS_AUTH_URL=${OS_AUTH_PROTOCOL:-http}://`juju run --unit ${keystone_unit} "unit-get private-address"`:5000/v3 export OS_USERNAME=admin export OS_PASSWORD=openstack export OS_DOMAIN_NAME=admin_domain export OS_USER_DOMAIN_NAME=admin_domain export OS_PROJECT_DOMAIN_NAME=admin_domain export OS_PROJECT_NAME=admin export OS_REGION_NAME=RegionOne export OS_IDENTITY_API_VERSION=3 # Swift needs this: export OS_AUTH_VERSION=3 else echo Using keystone v2 api export OS_USERNAME=admin export OS_PASSWORD=openstack export OS_TENANT_NAME=admin export OS_REGION_NAME=RegionOne export OS_AUTH_URL=${OS_AUTH_PROTOCOL:-http}://`juju run --unit ${keystone_unit} "unit-get private-address"`:5000/v2.0
rcファイルの読み込み
$ source novarc_auto
監視確認
Openstack状態の確認
デプロイがすべて完了したことをjuju status
コマンドで確認後、
実際にOpenstackが操作できるかをコマンドで打ってみましょう。
$ openstack service list +----------------------------------+-----------+--------------+ | ID | Name | Type | +----------------------------------+-----------+--------------+ | 0a6aac12ae71496494a3b0748e17021b | aodh | alarming | | 2447939369d74795a0ee65bda1bfe3a1 | swift | object-store | | 4a1d931905fd43c3bf3403eb25a96bd4 | placement | placement | | 4a40e8739f9046d7978422e5331c8383 | gnocchi | metric | | 5586181aad80426392ee40c41ab9b19a | keystone | identity | | 56608d839340422a8b02af265de70ce9 | neutron | network | | 5e1abf112ca44857a347ba0bd471720e | nova | compute | | 671b147f8d06417fa1b9ff14475d0f40 | glance | image | | 9820e33afcf3467da93a7138632ea917 | cinderv3 | volumev3 | | bfb458d163314bdeaefd1e867de2ead9 | cinderv2 | volumev2 | +----------------------------------+-----------+--------------+
上記のような応答があれば成功です。
Ceilometerを有効化
今回の構成のようにCeilometerとGnocchiを連携する場合、 以下のコマンドで有効化する必要があります。
$ juju run-action ceilometer/0 ceilometer-upgrade
Dashboardにアクセス
Dashboardにアクセスします。
juju status
コマンドでopenstack-dashboardのIPアドレスを確認し、
http://xx.xx.xx.xx/horizon のURLでブラウザからアクセスしてください。
yamlファイルに認証の変更を加えていなければ、以下の情報でログインできます。
- ドメイン:admin_domain
- ユーザ名:admin
- パスワード:openstack
インスタンスの作成
監視データの蓄積をするため、監視対象となるインスタンスの作成を行います。 jujuで構築したOpenstackは初期状態においてインスタンス作成に必要な下記項目が設定されていないので、 Dashboardから設定を行ってください。
- イメージの登録
- ルーターの作成
- 内部ネットワークの作成
- 内部ネットワークサブネットの作成
- フレーバーの作成
CirrOS等の軽量イメージを使用してインスタンスを稼働しましょう。
メトリックデータの取得
実際に監視データが取得できているかを確認します。 まずはリソースの一覧から表示してみましょう。
$ openstack metric resource list +--------------------------------------+----------------------------+----------------------------------+----------------------------------+-----------------------------------------------------------------------+----------------------------------+----------+----------------------------------+--------------+-------------------------------------------------------------------+ | id | type | project_id | user_id | original_resource_id | started_at | ended_at | revision_start | revision_end | creator | +--------------------------------------+----------------------------+----------------------------------+----------------------------------+-----------------------------------------------------------------------+----------------------------------+----------+----------------------------------+--------------+-------------------------------------------------------------------+ | 579ef430-4278-51ca-ad28-4edd6897fee6 | instance_network_interface | d948eedc6f1047bfaf9539e6526dd919 | 8981ef1a6dcb4683b97b82925fd87a9f | instance-00000001-bd7f158f-369c-41dc-81b1-84487a583c6e-tap91c4a8f8-9d | 2018-04-24T01:12:48.853092+00:00 | None | 2018-04-24T01:12:48.853151+00:00 | None | 1cf01d45402749e286c098b89caf5eaf:5f5d5bfecb944273a00697e59eafc436 | | b39ba0c5-860f-598a-b0f4-82ab5afb5c50 | instance_disk | d948eedc6f1047bfaf9539e6526dd919 | 8981ef1a6dcb4683b97b82925fd87a9f | bd7f158f-369c-41dc-81b1-84487a583c6e-vdb | 2018-04-24T01:12:48.941122+00:00 | None | 2018-04-24T01:12:48.941142+00:00 | None | 1cf01d45402749e286c098b89caf5eaf:5f5d5bfecb944273a00697e59eafc436 | | 3f830f79-7cf9-5060-affd-5e4d43196ffc | instance_disk | d948eedc6f1047bfaf9539e6526dd919 | 8981ef1a6dcb4683b97b82925fd87a9f | bd7f158f-369c-41dc-81b1-84487a583c6e-vda | 2018-04-24T01:12:49.119669+00:00 | None | 2018-04-24T01:12:49.119688+00:00 | None | 1cf01d45402749e286c098b89caf5eaf:5f5d5bfecb944273a00697e59eafc436 | | bd7f158f-369c-41dc-81b1-84487a583c6e | instance | d948eedc6f1047bfaf9539e6526dd919 | 8981ef1a6dcb4683b97b82925fd87a9f | bd7f158f-369c-41dc-81b1-84487a583c6e | 2018-04-24T01:17:48.346622+00:00 | None | 2018-04-24T01:17:48.346641+00:00 | None | 1cf01d45402749e286c098b89caf5eaf:5f5d5bfecb944273a00697e59eafc436 | +--------------------------------------+----------------------------+----------------------------------+----------------------------------+-----------------------------------------------------------------------+----------------------------------+----------+----------------------------------+--------------+-------------------------------------------------------------------+
次にリソースの詳細です、instanceの詳細を表示してみます。
$ openstack metric resource show bd7f158f-369c-41dc-81b1-84487a583c6e +-----------------------+---------------------------------------------------------------------+ | Field | Value | +-----------------------+---------------------------------------------------------------------+ | created_by_project_id | 5f5d5bfecb944273a00697e59eafc436 | | created_by_user_id | 1cf01d45402749e286c098b89caf5eaf | | creator | 1cf01d45402749e286c098b89caf5eaf:5f5d5bfecb944273a00697e59eafc436 | | ended_at | None | | id | bd7f158f-369c-41dc-81b1-84487a583c6e | | metrics | compute.instance.booting.time: 41aa5d18-772c-49ef-b1f6-26ce117d9290 | | | cpu.delta: f76b4f69-8a30-4565-95af-bbf5f080cb85 | | | cpu: f9e7437c-6346-49d1-bd93-e82320afad90 | | | cpu_l3_cache: fbbb5723-f24a-4376-8253-c9b69768022c | | | cpu_util: 5c22865d-6727-4c6c-ba3d-37a6d8ee6f4c | | | disk.allocation: cb44a188-0d14-443e-aa4b-f85cc502d021 | | | disk.capacity: 8fae7b4d-43f7-4357-8250-e7644e93cd3c | | | disk.ephemeral.size: 07eb3f61-6faa-481d-aa4a-6d2e66591b05 | | | disk.iops: 62c81e4c-fb7d-4d96-8657-9e9884dc3aef | | | disk.latency: 17f8f246-36c4-4096-8901-c32d5a0ecf42 | | | disk.read.bytes.rate: 7a7776a4-abe9-4c81-8981-d2c560f52f12 | | | disk.read.bytes: bbe8c0a0-a7bc-4c67-9c62-b500f20fa7d2 | | | disk.read.requests.rate: 4508526a-af1c-4289-b340-0255f012c042 | | | disk.read.requests: 36e36446-fc08-4e20-8d1e-ffaa5c8543c5 | | | disk.root.size: 504a2693-5083-4c2b-9653-1394ad3ed415 | | | disk.usage: 8afdfafe-e499-4c8a-b6e8-c9b60fb61504 | | | disk.write.bytes.rate: 422f0e51-1fca-4762-b418-c6de634601f7 | | | disk.write.bytes: d21bd9f7-c441-4f95-ad0f-1e29fc799231 | | | disk.write.requests.rate: 114edd3e-ce8e-4fd7-b96e-5fe2808de96e | | | disk.write.requests: 6e15ee6b-965d-46e7-82a7-bd869464c956 | | | memory.bandwidth.local: a05a8117-2364-47a1-8eb8-4335227b89f2 | | | memory.bandwidth.total: 6ea4ed00-bcca-49bc-96a7-a089577f08aa | | | memory.resident: 72564fd4-e3df-46f2-b2a5-0da106e749ce | | | memory.swap.in: 8c150408-0952-4a56-8c49-7bf196d3382d | | | memory.swap.out: ba87a10a-7e53-46e4-ba0d-40285990d5e6 | | | memory.usage: 8c1008d1-a1ca-4986-8526-d95fd1a91886 | | | memory: 111aae74-7814-4228-b959-b0133b70a600 | | | perf.cache.misses: 76ac152a-cd9f-4593-be95-c586cc65471e | | | perf.cache.references: 44dae2f5-67b2-4509-8457-b6b512fee081 | | | perf.cpu.cycles: 6fdcae77-b548-4cd9-b78f-fdbf5dc9057c | | | perf.instructions: 09357908-90bb-43bb-a74b-8cb86dda8833 | | | vcpus: d1ad1631-b464-4179-95fe-573b2d83ee69 | | original_resource_id | bd7f158f-369c-41dc-81b1-84487a583c6e | | project_id | d948eedc6f1047bfaf9539e6526dd919 | | revision_end | None | | revision_start | 2018-04-24T01:17:48.346641+00:00 | | started_at | 2018-04-24T01:17:48.346622+00:00 | | type | instance | | user_id | 8981ef1a6dcb4683b97b82925fd87a9f | +-----------------------+---------------------------------------------------------------------+
監視の値を取得してみます、memory.usageの表示です。
$ openstack metric measures show 8c1008d1-a1ca-4986-8526-d95fd1a91886 +---------------------------+-------------+-------+ | timestamp | granularity | value | +---------------------------+-------------+-------+ | 2018-04-24T10:15:00+09:00 | 300.0 | 45.0 | +---------------------------+-------------+-------+
Grafanaによるグラフ化
GrafanaへGnocchi-Pluginのインストール
コマンドラインで監視データが取得できたので、今度はグラフ化に挑みます。 まずはGrafanaへGnocchiをデータソースとして利用するためのプラグインを入れます。
$ juju ssh grafana/0 $ sudo grafana-cli plugins install gnocchixyz-gnocchi-datasource installing gnocchixyz-gnocchi-datasource @ 1.7.0 from url: https://grafana.com/api/plugins/gnocchixyz-gnocchi-datasource/versions/1.7.0/download into: /var/lib/grafana/plugins Failed downloading. Will retry once. ✔ Installed gnocchixyz-gnocchi-datasource successfully Restart grafana after installing plugins . <service grafana-server restart>
Grafanaサービスをリスタートし、Grafanaサーバから抜けます。
$ sudo service grafana-server restart $ exit
Grafanaログイン情報の表示
Grafanaへログインするためのパスワードを表示します。
unit-grafana-0: id: 57b95cec-fb95-43e1-86c5-86ad0f274c33 results: password: password5656 status: completed timing: completed: 2018-04-24 01:29:02 +0000 UTC enqueued: 2018-04-24 01:29:01 +0000 UTC started: 2018-04-24 01:29:02 +0000 UTC unit: grafana/0
Grafanaへ接続
Grafanaデプロイ先アドレスにWebアクセスします。 ユーザ名はadmin、パスワードは上記で表示されたものを使用します。
Data Sourceの設定
続いてData Sourceを設定します。 Gnocchi-Pluginがインストールされていれば、TypeにGnocchiを選択できます。
しかしここで問題発生、Gnocchiへの認証モードがkeystoneを使用すると通りません。
どうやらCORSを設定しなければならないようですが、jujuの設定項目で解決ができない範囲のようです。
https://blog.sileht.net/configuring-cors-for-gnocchi-and-keystone.html
何とか出来ないものかとpluginの設定項目を探すと、認証にtokenを指定できるのを見つけました。 強引ですが、tokenを引っ張ってきて設定してみます。
$ curl -i -X POST -H "Content-Type: application/json" -d ' { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "admin", "password": "openstack", "domain": { "name": "admin_domain" } } } }, "scope": { "project": { "name": "admin", "domain": { "name": "admin_domain" } } } } }' http://172.17.30.89:5000/v3/auth/tokens HTTP/1.1 201 Created Date: Tue, 24 Apr 2018 01:42:59 GMT Server: Apache/2.4.18 (Ubuntu) X-Subject-Token: 830d04244cfc4598b8c5cbb4f2fdc31c Vary: X-Auth-Token X-Distribution: Ubuntu x-openstack-request-id: req-ceae75ca-0b04-4fe0-bb3e-cacb630a3a1c Content-Length: 6557 Content-Type: application/json {"token": {"is_domain": false, "methods": ["password"], "roles": [{"id": "097ec800c2f64a438a787f058066fbc3", "name": "Admin"}, {"id": "b6b8500fe90048e7b4700bea94ffdb31", "name": "Member"}], (省略)
tokenを渡した所、正常にData Sourceを設定できたようです。
グラフ化
設定したDeta Sourceを指定してグラフを表示させてみます。 metric IDを直接指定する方式で値が取れているのがわかります。
認証の問題
何とかグラフ化に成功しましたが、tokenの期限が切れてしまうとData Sourceが機能しなくなってしまうため、別の手法を模索する必要があると感じました。 引き続き調査したいと思います。