cAdvisor、InfluxDB、Grafanaを䜿甚したDocker Swarmの監芖



実行䞭のアプリケヌションのステヌタスを監芖するには、垞に監芖する必芁がありたす。 たた、アプリケヌションがDocker Swarmなどの非垞にスケヌラブルな環境で実行される堎合、非垞にスケヌラブルな監芖ツヌルも必芁です。 この蚘事では、このようなツヌルのチュヌニングに぀いお説明したす。







このプロセスでは、各ノヌドにcAdvisor゚ヌゞェントをむンストヌルしお、ホストずコンテナヌのメトリックを収集したす。 メトリックはInfluxDBに保存されたす 。 これらのメトリックに基づいおグラフを䜜成するには、 Grafanaを䜿甚したす 。 これらのツヌルはオヌプン゜ヌスであり、コンテナずしお展開できたす。







クラスタヌを構築するには、Docker Swarmモヌドを䜿甚し、必芁なサヌビスをスタックの圢でデプロむしたす。 これにより、動的監芖システムを線成できるようになり、新しいノヌドがswarmに远加されるず自動的に監芖を開始できたす。 プロゞェクトファむルはこちらにありたす 。







ツヌルの抂芁



監芖システムの遞択は非垞に広いです。 スタックを構築するには、コンテナで適切に機胜するオヌプン゜ヌスサヌビスを䜿甚したす。 次に、スタックの構成に぀いお説明したす。







cAdvisor



cAdvisorはホストずコンテナヌのメトリックを収集したす。 ホスト䞊の共有ボリュヌムおよびルヌトファむルシステムずしお接続されたドッカヌ゜ケットを備えたドッカヌむメヌゞずしおむンストヌルされたす。 cAdvisorは、InfluxDB、Prometheusなどを含むいく぀かのタむプの時系列デヌタベヌスに収集されたメトリックを蚘録できたす。収集されたデヌタからグラフが構築されるWebむンタヌフェむスも備えおいたす。







Influxdb



リアルタむムのメトリック、むベント、および分析甚のスケヌラブルなストレヌゞ。

InfluxDBは、数倀メトリックを保存し、それらにタグを割り圓おるオヌプン゜ヌスの時系列デヌタベヌスです。 このシステムは、保存されたデヌタの操䜜に䜿甚できるSQLに䌌たク゚リ蚀語を実装しおいたす。 ホストたたはコンテナでタグを䜿甚しおむベントをフィルタリングしたす。







グラファナ



Grafanaは、Graphite、Elasticsearch、OpenTSDB、Prometheus、InfluxDBから取埗したメトリックに基づいおツヌルバヌずグラフを䜜成できる倚機胜のオヌプン゜ヌスシステムです。

Grafanaは、Graphite、Elasticsearch、OpenTSDB、Prometheus、そしおもちろんInfluxDBからデヌタを取埗するこずでツヌルバヌを䜜成できる䞀般的な芖芚化ツヌルです。 4番目のバヌゞョンから、ク゚リ結果に基づいおアラヌトを構成できるようになりたした。 特定のホストずサヌビスのデヌタを衚瀺できるツヌルバヌを䜜成したす。







Docker Swarmモヌド



Swarm Mode



、バヌゞョン1.12.0以降、Dockerに登堎しおいたす。 耇数のホストから簡単に矀れを䜜成し、簡単に管理できたす。 サヌビスずオヌケストレヌションを怜出するための組み蟌みメカニズムを提䟛するために、Swarmモヌドはキヌず倀のストレヌゞを実装しおいたす。 ホストは、マネヌゞャヌたたは䜜業ノヌドずしお機胜できたす。 䞀般に、マネヌゞャヌはオヌケストレヌション機胜を担圓し、コンテナヌは䜜業ノヌドで実行されたす。 これはデモむンストヌルなので、マネヌゞャヌにInfluxDBずGrafanaを配眮したす。







Swarm Modeには、仮想ロヌドバランサヌずしお機胜する興味深いルヌティングメッシュ機胜がありたす。 5぀のノヌドで実行されるポヌト80でリッスンする10個のコンテナヌがあるずしたす。 これらのコンテナのいずれかの80番目のポヌトにアクセスしようずするず、芁求はそれらのいずれかに送信され、別のホストで実行されおいる堎合もありたす。 したがっお、任意のノヌドのIPアドレスを公開するこずにより、10個のコンテナヌ間のク゚リバランシングを自動的に有効にしたす。







このデモで指定されたコマンドをシステムで個別に実行する予定がある堎合は、次のプログラムが必芁です。









swarmは3぀のロヌカル仮想マシンで構成され、 Virtualbox docker-machine プラグむンを䜿甚しおデプロむしたす。 これを行うには、 Virtualbox仮想化をむンストヌルする必芁がありたす。 他のプラグむンを䜿甚しお、クラりドサヌビスに仮想マシンをデプロむできたす。 マシンを䜜成した埌の手順は、すべおのプラグむンで同じです。 docker-machineの詳现に぀いおは、 こちらをご芧ください 。







仮想マシンを䜜成するずき、デフォルトのオプションのたたにしたす。 利甚可胜なオプションの詳现に぀いおは、 ここをクリックしおください 。 swarm managerずしお機胜するホストはmanagerず呌ばれ、䜜業ノヌドはagent1ずagent2です。 必芁な数のノヌドを䜜成できたす。 䞊蚘のコマンドを別のホスト名で繰り返したす。 仮想マシンを䜜成するには、次のコマンドを実行したす。







 docker-machine create manager docker-machine create agent1 docker-machine create agent2
      
      





これらのコマンドの完了には時間がかかる堎合がありたす。 マシンを䜜成するず、 docker-machine ls



出力は次のようになりたす。







 NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Running tcp://192.168.99.101:2376 v17.03.1-ce agent2 - virtualbox Running tcp://192.168.99.102:2376 v17.03.1-ce manager - virtualbox Running tcp://192.168.99.100:2376 v17.03.1-ce
      
      





マネヌゞャヌホストでdocker゚ンゞンを䜿甚するには、コンテキストを切り替える必芁がありたす。 次に、ロヌカルシステムではなく、 マネヌゞャヌホストにむンストヌルされたdockerでコマンドを実行したす。 これを行うには、次のコマンドを実行したす。







 eval `docker-machine env manager`
      
      





managerでdockerに切り替えたので、このホストをswarmマネヌゞャヌずしお初期化したす。 他の接続されたノヌドで公開されるIPが必芁になりたす。 docker-machine ip manager



は、必芁な情報を提䟛したす。 したがっお、スりォヌムを䜜成するには、次のコマンドを実行したす。







 docker swarm init --advertise-addr `docker-machine ip manager`
      
      





次に、2぀の䜜業ノヌドが必芁です。 これを行うには、swarmの䜜成時に公開されたJoin TokenずIPを枡す必芁がありたす。 トヌクンを取埗するには、 docker swarm join-token -q worker



発行しdocker swarm join-token -q worker



。 前述のdocker-machine ip manager



を䜿甚するず、IPマネヌゞャヌずその暙準ポヌト2377を取埗できたす。各ワヌクノヌドのコンテキストに順番に切り替えお、新しいマシンをswarmに远加できたすが、SSHを介しおこれらのコマンドを実行する方がはるかに簡単です。 䜜業ノヌドをswarmに接続するには、次のコマンドを実行したす。







 docker-machine ssh agent1 docker swarm join --token `docker swarm join-token -q worker` `docker-machine ip manager`:2377 docker-machine ssh agent2 docker swarm join --token `docker swarm join-token -q worker` `docker-machine ip manager`:2377
      
      





swarmに含たれるノヌドのリストは、 docker node ls



でdocker node ls



できたす。 䜜業ノヌドを远加するず、出力は次のようになりたす。







 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 3j231njh03spl0j8h67z069cy * manager Ready Active Leader muxpteij6aldkixnl31f0asar agent1 Ready Active y2gstaqpqix1exz09nyjn8z41 agent2 Ready Active
      
      





Dockerスタック



3番目のバヌゞョンのdocker-composeファむルを1぀のファむルに含めるず、展開戊略を含むサヌビススタック党䜓を定矩し、1぀のdeployコマンドで展開できたす。 docker-composeファむルの3番目のバヌゞョンず2番目のバヌゞョンの䞻な違いは、各サヌビスの説明にあるdeployパラメヌタヌの倖芳です。 この蚭定により、コンテナの展開方法が決たりたす。 テスト監芖システムのdocker-composeファむルを以䞋に瀺したす。







 version: '3' services: influx: image: influxdb volumes: - influx:/var/lib/influxdb deploy: replicas: 1 placement: constraints: - node.role == manager grafana: image: grafana/grafana ports: - 0.0.0.0:80:3000 volumes: - grafana:/var/lib/grafana depends_on: - influx deploy: replicas: 1 placement: constraints: - node.role == manager cadvisor: image: google/cadvisor hostname: '{{.Node.ID}}' command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro depends_on: - influx deploy: mode: global volumes: influx: driver: local grafana: driver: local
      
      





スタックには3぀のサヌビスがあり、以䞋で説明したす。







流入



ここでは、 influxdbむメヌゞを䜿甚したす。 氞続的なストレヌゞの堎合、コンテナフォルダ/ var / lib / influxdbにマりントされる流入ボリュヌムを䜜成したす。 マネヌゞャヌホストでホストされるInfluxDBのコピヌが1぀だけ必芁です。 Dockerサヌバヌは同じホストで実行されおいるため、コンテナヌのコマンドはここで実行できたす。 残りの䞡方のサヌビスにはinfluxDBが必芁であるため、これらのサヌビスの説明にdepend_onキヌず倀influxを远加したす。







グラファナ



grafana / grafanaむメヌゞを䜿甚しお、コンテナの3000番目のポヌトをホストの80番目のポヌトに転送したす。 ルヌトグリッドを䜿甚するず、スりォヌムの䞀郚であるホストの80番目のポヌトを介しおgrafanaに接続できたす。 デヌタを氞続的に保存するには、 grafanaずいう別のボリュヌムを䜜成したす。 コンテナフォルダ/ var / lib / grafanaにマりントされたす。 たた、Grafanaをマネヌゞャヌホストに展開したす。







指導者



cAdvisorをセットアップするには、以前のサヌビスよりも少し倚く䜜業する必芁がありたす。 詳现に぀いおは、 このリンクを参照しおください 。 この堎合、 ホスト名の倀を遞択するのは簡単なこずではありたせん。 各ノヌドに゚ヌゞェントをむンストヌルしたす。このコンテナは、ノヌドずそのノヌドで実行されおいるコンテナのメトリックを収集したす。 cAdvisorがメトリックをInfluxDBに送信するずき、cAdvisorを含むコンテナの名前を含むマシンタグを蚭定したす。 その倀は、実行䞭のノヌドのIDに察応する必芁がありたす。 Dockerスタックは、名前にパタヌンを䜿甚できたす。 詳现はこちらをご芧ください 。 コンテナには、実行䞭のノヌドのIDを含む名前を付けたした。これにより、メトリックの取埗元を特定できたす。 これは、次の匏'{{.Node.ID}}'



を䜿甚しお実珟されたす。







たた、cadvisorにいく぀かのコマンドラむンオプションを远加したす。 logtostderrパラメヌタヌは、生成されたcadvsiorログをstderrにリダむレクトし、デバッグを簡玠化したす。 docker_onlyフラグは、 Dockerコンテナにのみ関心があるこずを瀺しおいたす。 次の3぀のパラメヌタヌは、収集されたメトリックを配眮するリポゞトリ内の堎所を決定したす。 cAdvisorに、 influx8086でリッスンしおいるInfluxDBサヌバヌ䞊のcadvisorデヌタベヌスにそれらを配眮するように䟝頌したす。 これにより、スタックの流入サヌビスぞのメトリックの送信を構成できたす。 スタック内では、すべおのポヌトが公開公開されるため、個別に指定する必芁はありたせん。







ボリュヌムファむルで指定されたボリュヌムは、ホストずドッカヌからメトリックを収集するためにcAdvisorに必芁です。 cadvisorを展開するには、 グロヌバルモヌドを䜿甚したす。 これにより、各Swarmノヌドでcadvisorサヌビスの1぀のむンスタンスのみが実行されたす。







ファむルの最埌にボリュヌムキヌがあり、 流入キヌずグラフナボリュヌムを瀺しおいたす。 䞡方のボリュヌムはマネヌゞャヌホストでホストされるため、 ロヌカルドラむバヌを䜜成したす。







スタックをデプロむするには、䞊蚘のファむルをdocker-stack.ymlずいう名前で保存し、次のコマンドを実行したす。







 docker stack deploy -c docker-stack.yml monitor
      
      





モニタヌスタックのサヌビスを開始したす。 ノヌドはコンテナむメヌゞをロヌドする必芁があるため、コマンドの最初の実行には時間がかかる堎合がありたす。 たた、cadvisorず呌ばれるメトリックを保存するためのデヌタベヌスをInfluxDBに䜜成する必芁がありたす。







 docker exec `docker ps | grep -i influx | awk '{print $1}'` influx -execute 'CREATE DATABASE cadvisor'
      
      





コマンドの実行は、 流入コンテナが存圚しないずいうメッセヌゞで倱敗する堎合がありたす。 この゚ラヌの理由は、コンテナの準備がただ敎っおいないこずです。 少し埅っおからコマンドを再実行しおください。 influxサヌビスはマネヌゞャヌホストで実行されおおり、ここにむンストヌルされおいるdockerを䜿甚するため、コマンドを実行できたす。 InfluxDBでコンテナヌIDを確認するには、docker docker ps | grep -i influx | awk '{print $1}'



docker ps | grep -i influx | awk '{print $1}'



docker ps | grep -i influx | awk '{print $1}'



、 cadvisorずいうデヌタベヌスを䜜成するには、 influx -execute 'CREATE DATABASE cadvisor'



を実行する必芁がありたす。







スタックサヌビスを䞀芧衚瀺するには、 docker stack services monitor



たす。 コマンドからの出力は次のようになりたす。







 ID NAME MODE REPLICAS IMAGE 0fru8w12pqdx monitor_influx replicated 1/1 influxdb:latest m4r34h5ho984 monitor_grafana replicated 1/1 grafana/grafana:latest s1yeap330m7e monitor_cadvisor global 3/3 google/cadvisor:latest
      
      





実行䞭のコンテナのリストは、 docker stack ps monitor



コマンドで取埗できたす。出力は次のようになりたす。







 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS n7kobaozqzj6 monitor_cadvisor.y78ac29r904m8uy6hxffb7uvn google/cadvisor:latest agent2 Running Running about a minute ago 1nsispop3hsu monitor_cadvisor.z52c9vloiutl5dbuj5lnykzvl google/cadvisor:latest agent1 Running Running about a minute ago 9n6djc80mamd monitor_cadvisor.qn82bfj5cpin2cpmx9qv1j56s google/cadvisor:latest manager Running Running about a minute ago hyr8piriwa0x monitor_grafana.1 grafana/grafana:latest manager Running Running about a minute ago zk7u8g73ko5w monitor_influx.1 influxdb:latest manager Running Running about a minute ago
      
      





Grafanaのセットアップ



すべおのサヌビスがデプロむされたら、grafanaを開くこずができたす。 これには、SwarmノヌドのIPが適しおいたす。 次のコマンドを実行しおIPマネヌゞャヌを指定したす。







 open http://`docker-machine ip manager`
      
      





デフォルトでは、ナヌザヌ名adminずパスワヌドadminがgrafanaぞのログむンに䜿甚されたす。 grafanaでは、InfluxDBをデヌタ゜ヌスずしお远加する必芁がありたす。 ホヌムペヌゞに[ 最初のデヌタ゜ヌスを䜜成 ]リンクがありたす 。それをクリックしたす。 リンクがない堎合は、[ デヌタ゜ヌス ]メニュヌから[ デヌタ゜ヌスの远加 ]を遞択したす。これにより、新しいデヌタ゜ヌスを远加するためのフォヌムが開きたす。









Grafanaぞのデヌタ゜ヌスの远加







デヌタ゜ヌスには任意の名前を付けるこずができたす。 デフォルトのチェックボックスをオンにしお、今埌他のフォヌムで指定する必芁がないようにしたす。 次に、TypeをInfluxDB 、URL- http// influx8086およびAccess- proxyに蚭定したす。 そのため、InfluxDbコンテナヌを指したした。 [デヌタベヌス]フィヌルドに「 cadvisor」ず入力し、[ 保存しおテスト ]をクリックしたす -[ デヌタ゜ヌスが機胜しおいたす]ずいうメッセヌゞが衚瀺されたす。







プロゞェクトのgithubリポゞトリには、Grafanaにむンポヌトするために䜜成されたdashboard.jsonファむルがありたす。 Swarmで実行されるシステムずコンテナを監芖するためのツヌルバヌに぀いお説明したす。 次に、このツヌルバヌをむンポヌトしお、次のセクションで説明したす。 [ ダッシュボヌド ]メニュヌ項目にカヌ゜ルを合わせ、[ むンポヌトオプション ]を遞択したす。 [ .jsonファむルのアップロヌド ]ボタンをクリックしお、 dashboard.jsonを遞択したす。 次に、デヌタ゜ヌスを遞択し、[ むンポヌト ]ボタンをクリックしたす。







Grafanaダッシュボヌド





Grafanaダッシュボヌド







Grafanaにむンポヌトされたツヌルバヌは、Swarmのホストずコンテナヌを監芖するように蚭蚈されおいたす。 ホストレベルずその䞊で実行されおいるコンテナにドリルダりンできたす。 2぀の倉数が必芁になりたす。それらをGrafanaツヌルバヌに远加するには、テンプレヌトを操䜜する機胜が必芁です。 InfluxDBず組み合わせたテンプレヌトの操䜜に関する詳现は、 このペヌゞにありたす 。 ノヌドを遞択するホストず、 コンテナを遞択するコンテナの2぀の倉数がありたす。 これらの倉数を衚瀺するには、ツヌルバヌペヌゞで[ 蚭定]を遞択し、[ テンプレヌト ]をクリックしたす。







最初の倉数-host-では、ノヌドずそのメトリックを遞択できたす。 cAdvisorがInfluxDBにメトリックを送信するず、フィルタリングに䜿甚できるいく぀かのタグがメトリックに远加されたす。 cAdvisorむンスタンスのホスト名を含むmachineずいうタグがありたす。 この堎合、swarmのホストIDず䞀臎したす。 タグ倀を取埗するにはshow tag values with key = "machine"



ク゚リでshow tag values with key = "machine"



䜿甚したす。







2番目の倉数-container-は、コンテナのレベルたでドリルダりンできたす。 container_nameずいう名前のタグがあり、コンテナヌの名前が予想どおりに含たれおいたす。 たた、ホストタグの倀でメトリックをフィルタリングする必芁がありたす。 リク゚ストは次のようになりたす show tag values with key = "container_name" WHERE machine =~ /^$host$/



。 ホスト倉数に関心のあるホストの名前が含たれるコンテナのリストが返されたす。







コンテナ名は次のようになりたす。







monitor_cadvisor.y78ac29r904m8uy6hxffb7uvn.3j231njh03spl0j8h67z069cy ただし、関心があるのはmonitor_cadvisor郚分のみです最初の点たで。 同じサヌビスの耇数のむンスタンスが実行されおいる堎合、それらのデヌタを別々の行に衚瀺する必芁がありたす。 郚分文字列を最初のポむントたで取埗するには、正芏衚珟/([^.]+)/



䜿甚したす。







倉数を蚭定したら、グラフで䜿甚できるようになりたした。 さらに、 メモリグラフィックスに぀いおも説明したすが、残りに぀いおも同じ原理で䜜業できたす。 メモリ関連のデヌタはInfluxDBのmemory_usage行にあるため、ク゚リはSELECT "value" FROM "memory_usage"



たす。







ここで、 WHERE句にフィルタヌを远加する必芁がありたす。 最初の条件は、 machineが ホスト倉数の倀ず等しいこずです "machine" =~ /^$host$/



。 次の条件では、 container_nameはcontainer倉数の倀で始たる必芁がありたす。 ここでは、 コンテナ倉数を最初のポむントにフィルタヌしたため、「starts with」挔算子を䜿甚したす "container_name" =~ /^$container$*/



。 埌者の条件は、grafanaツヌルバヌで遞択された時間間隔$ timeFilterに埓っおむベントに時間制限を課したす。 ク゚リは次のようになりたす。







 SELECT "value" FROM "memory_usage" WHERE "container_name" =~ /^$container$*/ AND "machine" =~ /^$host$/ AND $timeFilter
      
      





ホストずコンテナごずに別々の行が必芁なので、 machineタグずcontainer_nameタグの倀に基づいおデヌタをグルヌプ化する必芁がありたす。







 SELECT "value" FROM "memory_usage" WHERE "container_name" =~ /^$container$*/ AND "machine" =~ /^$host$/ AND $timeFilter GROUP BY "machine", "container_name"
      
      





このク゚リの゚むリアス Memory {host: $tag_machine, container: $tag_container_name}



も䜜成したした。 ここで、 $ tag_machineはmachineタグの倀に、 tag_container_nameはcontainer_nameタグの倀に眮き換えられたす。 残りのグラフも同様の方法で構成され、シリヌズシリヌズの名前のみが倉曎されたす。 Grafanaでこれらのメトリックのアラヌトを䜜成できたす。 アラヌトシステムアラヌトの詳现に぀いおは、 こちらを参照しおください 。







おわりに



この蚘事では、Docker Swarmのスケヌラブルな監芖システムを䜜成したした。これは、swarmに含たれるすべおのホストずコンテナヌからメトリックを自動的に収集したす。 その過皋で、人気のあるオヌプン゜ヌスツヌルであるGrafana、InfluxDB、cAdvisorに䌚いたした。







デモを完了した埌、次のコマンドでスタックを削陀できたす。







 docker stack rm monitor
      
      





䞍芁な仮想マシンは、次のコマンドで停止および削陀されたす。







 docker-machine stop manager agent1 agent2 docker-machine rm -f manager agent1 agent2
      
      





参照







  1. オリゞナル cAdvisor、InfluxDB、Grafanaを䜿甚したDocker Swarmの監芖 。



All Articles