Red Hat OpenStack Platform Operational Tools


Red Hat OpenStack Platform 8

OpenStack 環境の集中ロギングとモニタリング

OpenStack Documentation Team

概要

本書では、集中ロギング、可用性の監視、パフォーマンスの監視を提供する運用ツールのインストールと設定について説明します。

はじめに

Red Hat OpenStack Platform には、オペレーターが OpenStack 環境の維持に役立つオプションのツールスイートが同梱されています。これらのツールは、以下の機能を果たします。

  • 集中ロギング
  • 可用性監視
  • パフォーマンスの監視

本書では、これらのツールの準備とインストールについて説明します。

警告

現在、Red Hat OpenStack Platform Operational Tool Suite はテクノロジープレビュー機能です。Red Hat テクノロジープレビューの詳細は、テクノロジー プレビュー機能のサポート範囲 を参照してください

第1章 アーキテクチャー

1.1. 集中ロギング

集中ロギングのツールチェーンは、以下のような複数のコンポーネントで設定されます。

  • ログ収集エージェント(Fluentd)
  • ログリレー/トランスフォーマー(Fluentd)
  • データストア(Elasticsearch)
  • API/Presentation Layer (Kibana)

以下の図は、これらのコンポーネントとその対話を示しています。

図1.1 集中ロギングのハイレベルアーキテクチャー

図1.2 Red Hat OpenStack Platform の単一ノードデプロイメント

図1.3 Red Hat OpenStack Platform の HA デプロイメント

1.2. 可用性監視

可用性監視のツールチェーンは、以下を含む複数のコンポーネントで設定されます。

  • 監視エージェント(Sensu)
  • 監視リレー/プロキシー(RabbitMQ)
  • 監視コントローラー/サーバー(Sensu)
  • API/Presentation Layer (Uchiwa)

以下の図は、これらのコンポーネントとその対話を示しています。

図1.4 ハイレベルでの可用性監視のアーキテクチャー

図1.5 Red Hat OpenStack Platform の単一ノードデプロイメント

図1.6 Red Hat OpenStack Platform の HA デプロイメント

1.3. パフォーマンスのモニタリング

パフォーマンス監視のツールチェーンは、以下を含む多くのコンポーネントで設定されます。

  • コレクションエージェント(collectd)
  • Collection Aggregator/Relay (Graphite)
  • データストア(whisperdb)
  • API/Presentation Layer (Grafana)

以下の図は、これらのコンポーネントとその対話を示しています。

図1.7 高いレベルでのパフォーマンスモニタリングアーキテクチャー

図1.8 Red Hat OpenStack Platform の単一ノードデプロイメント

図1.9 Red Hat OpenStack Platform の HA デプロイメント

第2章 集中型ロギングスイートのインストール

2.1. 集中型ログリレー/トランスフォーマーのインストール

  1. 以下の最小仕様を満たすベアメタルシステムを見つけます。

    • 8 GB のメモリー
    • シングルソケット Xeon クラス CPU
    • 500 GB のディスク容量
  2. Red Hat Enterprise Linux 7 をインストールします。
  3. システムが Operational Tools パッケージにアクセスできるようにします。

    1. システムを登録してサブスクライブします。

      # subscription-manager register
      # subscription-manager list --consumed
      Copy to Clipboard Toggle word wrap

      OpenStack サブスクリプションが自動的にアタッチされない場合は、手動でサブスクリプションをアタッチ する ためのドキュメントを参照してください。

    2. 最初に有効なリポジトリーを無効にし、操作ツールに適したリポジトリーのみを有効にします。

      # subscription-manager repos --disable=*
      # subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-optional-rpms --enable=rhel-7-server-openstack-8-optools-rpms
      Copy to Clipboard Toggle word wrap
      注記

      ベース OpenStack リポジトリー(rhel-7-server-openstack-8-rpms)をこのノードで有効にしないでください。このリポジトリーには、特定の Operational Tools 依存関係の新しいバージョンが含まれている可能性があり、Operational Tools パッケージと互換性がない場合があります。

  4. 以下のコマンドを実行して ElasticsearchFluentdKibana ソフトウェアをインストールします。

    # yum install elasticsearch fluentd rubygem-fluent-plugin-elasticsearch kibana httpd
    Copy to Clipboard Toggle word wrap
  5. Elasticsearch で Cross-origin resource sharing (CORS)を有効にします。これを行うには、/etc/elasticsearch/elasticsearch.yml を編集し、以下の行をファイルの最後に追加します。

    http.cors.enabled: true
    http.cors.allow-origin: "/.*/"
    Copy to Clipboard Toggle word wrap
    注記

    これにより、Elasticsearch JavaScript アプリケーションを Web サーバーの任意の Web ページから呼び出すことができます。Kibana サーバーからの CORS のみを許可するには、以下を使用します。

    http.cors.allow-origin: "http://LOGGING_SERVER"
    Copy to Clipboard Toggle word wrap

    IP アドレスまたはホスト名を使用して Kibana にアクセスするかどうかに応じて、LOGGING_SERVERKibana サーバーの IP アドレスまたはホスト名に置き換えます。ただし、Elasticsearch サービスが信頼されるホストからのみアクセス可能である場合、/ .*/ を使用しても安全です

  6. Elasticsearch インスタンスを起動し、起動時に有効にします。

    # systemctl start elasticsearch
    # systemctl enable elasticsearch
    Copy to Clipboard Toggle word wrap

    Elasticsearch インスタンスが機能していることを確認するには、以下のコマンドを実行します。

    # curl http://localhost:9200/
    Copy to Clipboard Toggle word wrap

    これにより、以下のような応答が返されるはずです。

    {
      "status" : 200,
      "name" : "elasticsearch.example.com",
      "cluster_name" : "elasticsearch",
      "version" : {
        "number" : "1.5.2",
        "build_hash" : "c88f77ffc81301dfa9dfd81ca2232f09588bd512",
        "build_timestamp" : "2015-02-19T13:05:36Z",
        "build_snapshot" : false,
        "lucene_version" : "4.10.3"
      },
      "tagline" : "You Know, for Search"
    }
    Copy to Clipboard Toggle word wrap
  7. Fluentd をログデータを受け入れ、これを Elasticsearch に書き込むように設定します。/etc/fluentd/fluent.conf を編集し、そのコンテンツを以下に置き換えます。

    # In v1 configuration, type and id are @ prefix parameters.
    # @type and @id are recommended. type and id are still available for backward compatibility
    
    <source>
      @type forward
      port 4000
      bind 0.0.0.0
    </source>
    
    <match **>
      @type elasticsearch
      host localhost
      port 9200
      logstash_format true
      flush_interval 5
    </match>
    Copy to Clipboard Toggle word wrap
  8. Fluentd を起動し、起動時に有効にします。

    # systemctl start fluentd
    # systemctl enable fluentd
    Copy to Clipboard Toggle word wrap
    ヒント

    Fluentd のジャーナルをチェックし、起動時にエラーがないことを確認します。

    # journalctl -u fluentd -l -f
    Copy to Clipboard Toggle word wrap
  9. KibanaElasticsearch インスタンスを参照するように設定します。/etc/httpd/conf.d/kibana3.conf を作成し、以下の内容を内部に配置します。

    <VirtualHost *:80>
    
      DocumentRoot /usr/share/kibana
      <Directory /usr/share/kibana>
        Require all granted
        Options -Multiviews
      </Directory>
    
    </VirtualHost>
    Copy to Clipboard Toggle word wrap
  10. たとえば、Kibana および Elasticsearch へのアクセスを許可されたユーザーのみに制限する必要がある場合(たとえば、これらのサービスはオープンネットワーク内のシステム上で実行されているため)、HTTP Basic 認証を使用して仮想ホストのセキュリティーを保護し、Elasticseach をプロキシーの背後に移動します。これを行うには、次の手順を実行します。

    1. 以下の内容で /etc/httpd/conf.d/kibana3.conf ファイルを作成します。

      <VirtualHost *:80>
      
        DocumentRoot /usr/share/kibana
        <Directory /usr/share/kibana>
          Options -Multiviews
          AuthUserFile /etc/httpd/conf/htpasswd-kibana
          AuthName "Restricted Kibana Server"
          AuthType Basic
          Require valid-user
        </Directory>
      
        # Proxy for Elasticsearch
        <LocationMatch "^/(_nodes|_aliases|.*/_aliases|_search|.*/_search|_mapping|.*/_mapping)$">
          ProxyPassMatch http://127.0.0.1:9200/$1
          ProxyPassReverse http://127.0.0.1:9200/$1
        </LocationMatch>
      
        # Proxy for kibana-int/{dashboard,temp}
        <LocationMatch "^/(kibana-int/dashboard/|kibana-int/temp)(.*)$">
          ProxyPassMatch http://127.0.0.1:9200/$1$2
          ProxyPassReverse http://127.0.0.1:9200/$1$2
        </LocationMatch>
      
      </Virtualhost>
      Copy to Clipboard Toggle word wrap
      注記

      AuthUserFile オプションに別のパスを使用し、AuthName オプションのその他の説明を使用できます。

    2. Kibana へのアクセスが許可されるユーザー名とパスワードのペアを作成します。これには以下のコマンドを実行します。

      # htpasswd -c /etc/httpd/conf/htpasswd-kibana user_name
      Copy to Clipboard Toggle word wrap
      注記

      AuthUserFile オプションに別のパスを使用している場合は、それに応じてコマンドを変更します。

      user_name を任意のユーザー名に置き換えます。プロンプトが表示されたら、このユーザー名で使用するパスワードを入力します。パスワードを再入力するよう求められます。

    3. 必要に応じて、以下のコマンドを実行して、独自のパスワードを持つユーザーをさらに作成します。

      # htpasswd /etc/httpd/conf/htpasswd-kibana another_user_name
      Copy to Clipboard Toggle word wrap
    4. localhost インターフェイスのみをリッスンするように Elasticsearch を設定します。これを行うには、エディターで /etc/elasticsearch/elasticsearch.yml ファイルを開き、以下のオプションを追加します。

      network.host: 127.0.0.1
      Copy to Clipboard Toggle word wrap
    5. また、以下のオプションを /etc/elasticsearch/elasticsearch.yml に追加して、CORS で HTTP の Basic 認証データを使用できるように Elasticsearch を設定する必要もあります。

      http.cors.allow-credentials: true
      Copy to Clipboard Toggle word wrap
    6. Elasticsearch を再起動して、これらの変更を有効にします。

      # systemctl restart elasticsearch
      Copy to Clipboard Toggle word wrap
    7. 最後に、Elasticsearch ファイルがプロキシーを使用してダウンロードされ、HTTP Basic 認証データがブラウザーによって送信されていることを確認します。これを行うには、/usr/share/kibana/config.js ファイルを編集します。このファイルで以下の行を見つけます。

      elasticsearch: "http://"+window.location.hostname+":9200",
      Copy to Clipboard Toggle word wrap

      そして、以下のように変更します。

      elasticsearch: {server: "http://"+window.location.hostname, withCredentials: true},
      Copy to Clipboard Toggle word wrap
  11. Kibana (Apache 内)を有効にして Elasticsearch に接続し、Apache を起動して起動時に有効にします。

    # setsebool -P httpd_can_network_connect 1
    # systemctl start httpd
    # systemctl enable httpd
    Copy to Clipboard Toggle word wrap
  12. システムでファイアウォールを開き、Fluentd および httpd への接続を許可します。

    # firewall-cmd --zone=public --add-port=4000/tcp --permanent
    # firewall-cmd --zone=public --add-service=http --permanent
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  13. さらに、HTTP 認証および Elasticsearch プロキシーを設定していない場合は、ファイアウォールを開いて Elasticsearch への直接接続を許可します。

    # firewall-cmd --zone=public --add-port=9200/tcp --permanent
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
    重要

    HTTP 認証を使用した Kibana および Elasticseach へのアクセスを制限しない場合、Kibana および Elasticsearch によって提供される情報は、認証なしですべてのユーザーが利用できます。データを保護するには、システムまたは開いている TCP ポート(80、4000、および 9200)が信頼できるホストからのみアクセスできることを確認してください。

2.2. すべてのノードでのログ収集エージェントのインストール

OpenStack 環境内の全システムからログを収集し、それらを集中ロギングサーバーに送信するには、すべての OpenStack システムで以下のコマンドを実行します。

  1. Operational Tools リポジトリーを有効にします。

    # subscription-manager repos --enable=rhel-7-server-openstack-8-optools-rpms
    Copy to Clipboard Toggle word wrap
  2. fluentd および rubygem-fluent-plugin-add をインストールします。

    # yum install fluentd rubygem-fluent-plugin-add
    Copy to Clipboard Toggle word wrap
  3. すべての OpenStack ログファイルを読み取るパーミッションを持つように Fluentd ユーザーを設定します。これを行うには、以下のコマンドを実行します。

    # for user in {keystone,nova,neutron,cinder,glance}; do usermod -a -G $user fluentd; done
    Copy to Clipboard Toggle word wrap

    グループが欠落していることについて一部のノードでエラーが発生する可能性があることに注意してください。これは、すべてのノードがすべてのサービスを実行しているわけではないため無視できます。

  4. Fluentd を設定します。/etc/fluentd/fluent.conf が以下のようになっていることを確認してください。LOGGING_SERVER を、上記で設定した集中ロギングサーバーのホスト名または IP アドレスに置き換えます。

    # In v1 configuration, type and id are @ prefix parameters.
    # @type and @id are recommended. type and id are still available for backward compatibility
    
    # Nova compute
    <source>
      @type tail
      path /var/log/nova/nova-compute.log
      tag nova.compute
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.compute>
      type add
      <pair>
        service nova.compute
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Nova API
    <source>
      @type tail
      path /var/log/nova/nova-api.log
      tag nova.api
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.api>
      type add
      <pair>
        service nova.api
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Nova Cert
    <source>
      @type tail
      path /var/log/nova/nova-cert.log
      tag nova.cert
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.cert>
      type add
      <pair>
        service nova.cert
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Nova Conductor
    <source>
      @type tail
      path /var/log/nova/nova-conductor.log
      tag nova.conductor
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.conductor>
      type add
      <pair>
        service nova.conductor
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Nova Consoleauth
    <source>
      @type tail
      path /var/log/nova/nova-consoleauth.log
      tag nova.consoleauth
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.consoleauth>
      type add
      <pair>
        service nova.consoleauth
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Nova Scheduler
    <source>
      @type tail
      path /var/log/nova/nova-scheduler.log
      tag nova.scheduler
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match nova.scheduler>
      type add
      <pair>
        service nova.scheduler
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Neutron Openvswitch Agent
    <source>
      @type tail
      path /var/log/neutron/openvswitch-agent.log
      tag neutron.openvswitch
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match neutron.openvswitch>
      type add
      <pair>
        service neutron.openvswitch
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Neutron Server
    <source>
      @type tail
      path /var/log/neutron/server.log
      tag neutron.server
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match neutron.server>
      type add
      <pair>
        service neutron.server
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Neutron DHCP Agent
    <source>
      @type tail
      path /var/log/neutron/dhcp-agent.log
      tag neutron.dhcp
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match neutron.dhcp>
      type add
      <pair>
        service neutron.dhcp
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Neutron L3 Agent
    <source>
      @type tail
      path /var/log/neutron/l3-agent.log
      tag neutron.l3
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match neutron.l3>
      type add
      <pair>
        service neutron.l3
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Neutron Metadata Agent
    <source>
      @type tail
      path /var/log/neutron/metadata-agent.log
      tag neutron.metadata
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match neutron.metadata>
      type add
      <pair>
        service neutron.metadata
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Keystone
    <source>
      @type tail
      path /var/log/keystone/keystone.log
      tag keystone
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match keystone>
      type add
      <pair>
        service keystone
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Glance API
    <source>
      @type tail
      path /var/log/glance/api.log
      tag glance.api
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match glance.api>
      type add
      <pair>
        service glance.api
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Glance Registry
    <source>
      @type tail
      path /var/log/glance/registry.log
      tag glance.registry
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match glance.registry>
      type add
      <pair>
        service glance.registry
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Cinder API
    <source>
      @type tail
      path /var/log/cinder/api.log
      tag cinder.api
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match cinder.api>
      type add
      <pair>
        service cinder.api
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Cinder Scheduler
    <source>
      @type tail
      path /var/log/cinder/scheduler.log
      tag cinder.scheduler
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match cinder.scheduler>
      type add
      <pair>
        service cinder.scheduler
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    # Cinder Volume
    <source>
      @type tail
      path /var/log/cinder/volume.log
      tag cinder.volume
      format multiline
      format_firstline /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      format /(?<time>[^ ]* [^ ]*) (?<pid>[^ ]*) (?<loglevel>[^ ]*) (?<class>[^ ]*) \[(?<context>.*)\] (?<message>.*)/
      time_format %F %T.%L
    </source>
    
    <match cinder.volume>
      type add
      <pair>
        service cinder.volume
        hostname "#{Socket.gethostname}"
      </pair>
    </match>
    
    <match greped.**>
      @type forward
      heartbeat_type tcp
      <server>
        name LOGGING_SERVER
        host LOGGING_SERVER
        port 4000
      </server>
    </match>
    Copy to Clipboard Toggle word wrap
  5. Fluentd が設定されたので、Fluentd サービスを起動し、これを起動時に有効にします。

    # systemctl start fluentd
    # systemctl enable fluentd
    Copy to Clipboard Toggle word wrap

これで、http://LOGGING_SERVER/index.html#/dashboard/file/logstash.json で実行されている Kibana にアクセスでき、ログが表示されることを確認できるはずです。Kibana 設定で HTTP Basic 認証を有効にしている場合、このページにアクセスするには有効なユーザー名とパスワードを入力する必要があります。

注記

デフォルトでは、ロギングサーバーのフロントページ http://LOGGING_SERVER/ は、技術的な要件と追加の設定情報を提供する Kibana のウェルカム画面です。ログをここで利用可能にする必要がある場合は、Kibana アプリケーションディレクトリーの default.json ファイルを logstash.json に置き換えますが、今後このファイルを再度必要とする場合に、最初に default.json のバックアップコピーを作成します。

# mv /usr/share/kibana/app/dashboards/default.json /usr/share/kibana/app/dashboards/default.json.orig
# cp /usr/share/kibana/app/dashboards/logstash.json /usr/share/kibana/app/dashboards/default.json
Copy to Clipboard Toggle word wrap

第3章 Availability Monitoring Suite のインストール

3.1. Monitoring Relay/Controller のインストール

  1. 以下の最小仕様を満たすベアメタルシステムを見つけます。

    • 4 GB のメモリー
    • シングルソケット Xeon クラス CPU
    • 100 GB のディスク容量
  2. Red Hat Enterprise Linux 7 をインストールします。
  3. システムが Operational Tools パッケージにアクセスできるようにします。

    1. システムを登録してサブスクライブします。

      # subscription-manager register
      # subscription-manager list --consumed
      Copy to Clipboard Toggle word wrap

      OpenStack サブスクリプションが自動的にアタッチされない場合は、手動でサブスクリプションをアタッチ する ためのドキュメントを参照してください。

    2. 最初に有効なリポジトリーを無効にし、操作ツールに適したリポジトリーのみを有効にします。

      # subscription-manager repos --disable=*
      # subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-optional-rpms --enable=rhel-7-server-openstack-8-optools-rpms
      Copy to Clipboard Toggle word wrap
      注記

      ベース OpenStack リポジトリー(rhel-7-server-openstack-8-rpms)をこのノードで有効にしないでください。このリポジトリーには、特定の Operational Tools 依存関係の新しいバージョンが含まれている可能性があり、Operational Tools パッケージと互換性がない場合があります。

  4. システムでファイアウォールを開き、RabbitMQ および Uchiwa への接続を許可します。

    # firewall-cmd --zone=public --add-port=5672/tcp --permanent
    # firewall-cmd --zone=public --add-port=3000/tcp --permanent
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  5. 監視サーバーに必要なコンポーネントをインストールします。

    # yum install sensu uchiwa redis rabbitmq-server
    Copy to Clipboard Toggle word wrap
  6. バックボーンサービスである RabbitMQRedis を設定します。RedisRabbitMQ の両方を起動し、起動時に有効にします。

    # systemctl start redis
    # systemctl enable redis
    # systemctl start rabbitmq-server
    # systemctl enable rabbitmq-server
    Copy to Clipboard Toggle word wrap
  7. ホストにアクセスできるユーザー名とパスワードの組み合わせを使用して、新しい RabbitMQ 仮想ホストを、sensu に設定します。

    # rabbitmqctl add_vhost /sensu
    # rabbitmqctl add_user sensu sensu
    # rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"
    Copy to Clipboard Toggle word wrap
  8. ベースサービスが実行され、設定されたので、Sensu モニタリングサーバーを設定します。以下の内容で /etc/sensu/conf.d/rabbitmq.json を作成します。

    {
      "rabbitmq": {
        "port": 5672,
        "host": "localhost",
        "user": "sensu",
        "password": "sensu",
        "vhost": "/sensu"
      }
    }
    Copy to Clipboard Toggle word wrap
  9. 次に、以下の内容で /etc/sensu/conf.d/redis.json を作成します。

    {
      "redis": {
        "port": 6379,
        "host": "localhost"
      }
    }
    Copy to Clipboard Toggle word wrap
  10. 最後に、以下の内容で /etc/sensu/conf.d/api.json を作成します。

    {
      "api": {
        "bind": "0.0.0.0",
        "port": 4567,
        "host": "localhost"
      }
    }
    Copy to Clipboard Toggle word wrap
  11. すべての Sensu サービスを開始して有効にします。

    # systemctl start sensu-server
    # systemctl enable sensu-server
    # systemctl start sensu-api
    # systemctl enable sensu-api
    Copy to Clipboard Toggle word wrap
  12. Sensu の Web インターフェイスである Uchiwa を設定します。これを行うには、/etc/uchiwa/uchiwa.json を編集し、そのデフォルトコンテンツを以下の内容に置き換えます。

    {
      "sensu": [
        {
          "name": "Openstack",
          "host": "localhost",
          "port": 4567
        }
      ],
      "uchiwa": {
        "host": "0.0.0.0",
        "port": 3000,
        "refresh": 5
      }
    }
    Copy to Clipboard Toggle word wrap
  13. Uchiwa の Web インターフェイスを起動して有効にします。

    # systemctl start uchiwa
    # systemctl enable uchiwa
    Copy to Clipboard Toggle word wrap

3.2. すべてのノードでの可用性監視エージェントのインストール

OpenStack 環境内の全システムを監視するには、すべてのシステムで以下のコマンドを実行します。

  1. Operational Tools リポジトリーを有効にします。

    # subscription-manager repos --enable=rhel-7-server-openstack-8-optools-rpms
    Copy to Clipboard Toggle word wrap
  2. Sensu をインストールします。

    # yum install sensu
    Copy to Clipboard Toggle word wrap
  3. Sensu エージェントを設定します。/etc/sensu/conf.d/rabbitmq.json を編集して、以下の内容を追加します。必ず、MONITORING_SERVER を、前のセクションで設定した監視サーバーのホスト名または IP アドレスに置き換えます。

    {
      "rabbitmq": {
        "port": 5672,
        "host": "MONITORING_SERVER",
        "user": "sensu",
        "password": "sensu",
        "vhost": "/sensu"
      }
    }
    Copy to Clipboard Toggle word wrap
  4. /etc/sensu/conf.d/client.json を編集して、以下の内容を追加します。FQDN をマシンのホスト名に置き換え、ADDRESS をマシンのパブリック IP アドレスに置き換えてください。

    {
      "client": {
        "name": "FQDN",
        "address": "ADDRESS",
        "subscriptions": [ "all" ]
      }
    }
    Copy to Clipboard Toggle word wrap
  5. 最後に、Sensu クライアントを開始して有効にします。

    # systemctl start sensu-client
    # systemctl enable sensu-client
    Copy to Clipboard Toggle word wrap

これで、http://MONITORING_SERVER:3000 で実行されている Uchiwa にアクセスできるはずです。

第4章 Performance Monitoring Suite のインストール

4.1. コレクションアグリゲーター/リバランスのインストール

  1. 以下の最小仕様を満たすベアメタルシステムを見つけます。

    • 4 GB のメモリー
    • シングルソケット Xeon クラス CPU
    • 500 GB のディスク容量
  2. Red Hat Enterprise Linux 7 をインストールします。
  3. システムが Operational Tools パッケージにアクセスできるようにします。

    1. システムを登録してサブスクライブします。

      # subscription-manager register
      # subscription-manager list --consumed
      Copy to Clipboard Toggle word wrap

      OpenStack サブスクリプションが自動的にアタッチされない場合は、手動でサブスクリプションをアタッチ する ためのドキュメントを参照してください。

    2. 最初に有効なリポジトリーを無効にし、操作ツールに適したリポジトリーのみを有効にします。

      # subscription-manager repos --disable=*
      # subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-optional-rpms --enable=rhel-7-server-openstack-8-optools-rpms
      Copy to Clipboard Toggle word wrap
      注記

      ベース OpenStack リポジトリー(rhel-7-server-openstack-8-rpms)をこのノードで有効にしないでください。このリポジトリーには、特定の Operational Tools 依存関係の新しいバージョンが含まれている可能性があり、Operational Tools パッケージと互換性がない場合があります。

  4. システムでファイアウォールを開き、Graphite および Grafana への接続を許可します。

    # firewall-cmd --zone=public --add-port=2003/tcp --permanent
    # firewall-cmd --zone=public --add-port=3030/tcp --permanent
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  5. 完了したら、以下のコマンドを実行して Graphite および Grafana ソフトウェアをインストールします。

    # yum install python-carbon graphite-web grafana httpd
    Copy to Clipboard Toggle word wrap
  6. Grafana Web インターフェイスを設定して、アクセスを許可するようにします。/etc/httpd/conf.d/graphite-web.conf を編集し、以下のように Require 行を変更します。

    ...
    <Directory "/usr/share/graphite/">
        <IfModule mod_authz_core.c>
            # Apache 2.4
            Require all granted
        </IfModule>
    ...
    Copy to Clipboard Toggle word wrap
  7. /etc/grafana/grafana.ini を編集し、http_port3030 に変更します。
  8. Graphite Web の背後にあるデータベースを同期します。以下のコマンドを実行します。スーパーユーザーを作成するプロンプトが表示されたら、no を選択します。

    # sudo -u apache /usr/bin/graphite-manage syncdb --noinput
    Copy to Clipboard Toggle word wrap
  9. すべての Graphite および Grafana サービスを起動して、有効にします。

    # systemctl start httpd
    # systemctl enable httpd
    # systemctl start carbon-cache
    # systemctl enable carbon-cache
    # systemctl start grafana-server
    # systemctl enable grafana-server
    Copy to Clipboard Toggle word wrap
  10. GrafanaGraphite インスタンスと対話するように設定します。

    1. http://PERFORMANCE_MONITORING_HOST:3030/ に移動します。Grafana ログインページが表示されるはずです。
    2. admin/admin のデフォルトの認証情報を入力して、システムにログインします。
    3. ログインしたら、画面左上にある Grafana ロゴをクリックし、Data Sources を選択します。
    4. ページ上部で Add new をクリックし、以下の詳細を入力します。

      Expand

      名前

      graphite

      デフォルト

      あり(選択)

      graphite

      URL

      http://localhost/

      アクセス

      proxy

      Basic 認証

      いいえ(未選択)

    5. 最後に、下部の Add ボタンをクリックします。

4.2. すべてのノードでのパフォーマンス監視収集エージェントのインストール

OpenStack 環境内の全システムのパフォーマンスを監視するには、すべてのシステムで以下のコマンドを実行します。

  1. Operational Tools リポジトリーを有効にします。

    # subscription-manager repos --enable=rhel-7-server-openstack-8-optools-rpms
    Copy to Clipboard Toggle word wrap
  2. collectd をインストールします。

    # yum install collectd
    Copy to Clipboard Toggle word wrap
  3. パフォーマンス監視アグリゲーター/再レイアウトにデータを送信するように collectd を設定します。これを行うには、次の内容で /etc/collectd.d/10-write_graphite.conf を作成します。ここで、PERFORMANCE_MONITORING_HOST は、パフォーマンス監視アグリゲーター/再lay として以前に設定されたホストのホスト名または IP アドレスに置き換えます。

    <LoadPlugin write_graphite>
      Globals false
    </LoadPlugin>
    
    <Plugin write_graphite>
      <Carbon>
        Host "PERFORMANCE_MONITORING_HOST"
        Port "2003"
        Prefix "collectd."
        EscapeCharacter "_"
        StoreRates true
        LogSendErrors true
        Protocol "tcp"
      </Carbon>
    </Plugin>
    Copy to Clipboard Toggle word wrap
  4. SELinux を使用している場合は、collectd から tcp ネットワーク接続を許可します。

    # setsebool -P collectd_tcp_network_connect=1
    Copy to Clipboard Toggle word wrap
  5. collectd を開始して有効にします。

    # systemctl start collectd
    # systemctl enable collectd
    Copy to Clipboard Toggle word wrap

しばらくすると、http://PERFORMANCE_MONITORING_HOST:3030/ で実行中の Graphite Web ユーザーインターフェイスにメトリックが表示されるはずです。

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat