Ubuntu 14.04の実稼働環境でConsulを構成する方法

前書き

Consulは、分散された可用性の高いデータセンター対応のサービス検出および構成システムです。 これを使用して、クライアントが所属するインフラストラクチャの最新のビューを常に保持できる、柔軟で強力なインターフェイスでサービスとノードを提示できます。

Consulは、インフラストラクチャに関する一貫した利用可能な情報を提供するために使用されるさまざまな機能を提供します。 これには、サービスとノードの検出メカニズム、タグ付けシステム、ヘルスチェック、コンセンサスベースの選択ルーチン、システム全体のキー/値ストレージなどが含まれます。 組織内で領事を活用することにより、アプリケーションやサービスに対する高度な認識を簡単に構築できます。

https://www.digitalocean.com/community/tutorials/an-introduction-to-using-consul-a-service-discovery-system-on-ubuntu-14-04 [最後のガイド]では、 consulの機能のデモ。 このガイドでは、インフラストラクチャへのサービス検出の実装を開始するために使用できる、本番用のconsul設定の作成を開始します。

前提条件と目標

このシリーズでは、相互に通信し、サービス情報、キー/値ストレージプール、およびクライアントマシンの他の詳細を維持できるサーバーシステムをセットアップします。 ソフトウェアをインストールし、構成の一部を自動化するときに、システムの生産準備を整えるための最初のステップがこのガイドで行われます。

consulのドキュメントでは、各データセンターで3つまたは5つの* consulサーバー*を実行して、サーバー障害が発生した場合のデータ損失を回避することを推奨しています。 Consulサーバーは、面倒な作業を行うコンポーネントです。 サービスとキー/値の情報に関する情報を保存します。 選挙中の行き詰まりの問題を回避するには、奇数のサーバーが必要です。

consulサーバーとは別に、他のマシンで* consulエージェント*を実行できます。 Consulエージェントは非常に軽量で、サーバーにリクエストを転送するだけです。 サーバーを隔離する方法を提供し、サーバーのアドレスを知る責任をエージェント自体に任せます。

後のガイドでセキュリティメカニズムの一部を実装するには、すべてのマシンに単一ドメイン内の名前を付ける必要があります。 これは、後でワイルドカードSSL証明書を発行できるようにするためです。

私たちのマシンの詳細はこちらです:

Hostname IP Address Role

server1.example.com

192.0.2.1

bootstrap consul server

server2.example.com

192.0.2.2

consul server

server3.example.com

192.0.2.3

consul server

agent1.example.com

192.0.2.50

consul client

このデモでは64ビットUbuntu 14.04サーバーを使用しますが、最新のLinuxサーバーでも同様に機能するはずです。 構成が完了したら、サービス、チェック、およびノー​​ドを簡単に追加できるシステムを配置する必要があります。

rootユーザーとしてマシンにログインして、このガイドの手順を完了します。

Consulのダウンロードとインストール

まだconsulをリンクにインストールしていない場合:[最初のconsulガイドの紹介]、今すぐインストールする必要があります。 設定する4台のマシンのそれぞれに、システムレベルのアプリケーションとしてconsulをインストールします。

consulアプリケーションを調べる前に、実行可能ファイルを抽出するために `+ unzip `を取得する必要があります。 ローカルシステムパッケージキャッシュを更新してから、 ` apt +`を使用してパッケージをインストールします。

apt-get update
apt-get install unzip

これで、領事プログラムを取得できます。 consulプロジェクトのページは、Windows、OS X、およびLinuxのバイナリパッケージへのダウンロードリンクを提供します。

上記のページに移動し、サーバーを表すオペレーティングシステムとアーキテクチャを右クリックします。 このガイドでは、64ビットサーバーを使用しているため、「linux」の下の「amd64」リンクを使用します。 「リンクの場所をコピー」またはブラウザが提供する同様のオプションを選択します。

ターミナルで、実行可能ファイルを保持する `+ / usr / local / bin`ディレクトリに移動します。 「+ wget +」とスペースを入力し、サイトからコピーしたURLを貼り付けます。

cd /usr/local/bin
wget

これで、以前にインストールした `+ unzip +`コマンドを使用してバイナリパッケージを抽出できます。 その後、圧縮ファイルを削除できます。

unzip *.zip
rm *.zip

これで、すべてのサーバーで「+ consul +」コマンドを使用できるようになります。

必要なディレクトリとシステム構造を作成する

`+ consul +`コマンドを使用すると、構造化されていない方法でconsulを簡単に試すことができます。 これにより、いくつかの機能をテストできます。 これは、ソフトウェアに慣れるために最後のガイドで行いました。

ただし、管理しやすい信頼性の高いシステムのセットアップを試みるため、この機能を実現するための構造を作成します。 各コンピューター(サーバーとクライアント)で次の手順を実行します。

最初に注意すべきことは、タスク固有のユーザーを作成することです。 これはユーザー特権の分離の標準的なケースであるため、専用のユーザーでconsulプロセスを実行します。

次のように入力して、ユーザーを作成します。

adduser consul

すべてのプロンプトをスキップできます(パスワードを設定することもできます。 それ以外の場合は文句を言います)あなたが望むなら。

次に、サービスを開始する方法に応じて使用するさまざまな構成を格納する構成階層を作成します。 これを簡単にするために、 + / etc +`構成構造内に親 `+ consul.d +`ディレクトリを作成し、各システムでこの下に `+ bootstrap ++ server +、および `+ client +`というサブディレクトリを配置します。 :

mkdir -p /etc/consul.d/{bootstrap,server,client}

これらのそれぞれに構成を後で配置できます。 各サーバーは、おそらくこれらのディレクトリを最大で2つ使用しますが、各ホストで一貫性を保つための構造を作成します。

また、consulがリブート間で永続データを保存できる場所を作成する必要があります。 この目的のために `+ / var / consul `にディレクトリを作成し、それをデータを管理できるように ` consul +`ユーザーに渡します:

mkdir /var/consul
chown consul:consul /var/consul

この構造が整っていれば、構成ファイルの作成を開始できるはずです。

ブートストラップ構成の作成

作成する必要がある最初の構成は、クラスターのブートストラップ用です。 これは、クラスターを最初に作成するためにのみ必要であるため、あまり一般的なイベントではありません。 ただし、構成ファイルを作成して、クラスターが完全にダウンした場合にすぐに再開できるようにします。

この構成ファイルは、consulサーバーの1つだけに配置することも、すべてのconsulサーバーに配置して、ブートストラップのオプションを追加することもできます。 このデモでは、 `+ server1 +`にのみ配置します。

設定ファイルはシンプルなJSONに保存されるため、管理が非常に簡単です。 `+ bootstrap +`サブディレクトリに最初のファイルを作成します:

nano /etc/consul.d/bootstrap/config.json

このファイルでは、この構成を使用するときに、consulをブートストラップモードのサーバーとして起動するように指定することで開始できます。

{
   "bootstrap": true,
   "server": true
}

クラスターが存在するデータセンターも指定する必要があります。 これは、クラスターの物理的な場所を識別するのに役立つ任意の名前にすることができます。 Consulはデータセンターに対応しており、これらの指定はデータセンターごとに異なるクラスターを整理するのに役立ちます。

`+ / var / consul +`で作成したデータディレクトリを渡すこともできます。 Consulはこれを使用して、クラスターの状態に関する情報を保存します。

{
   "bootstrap": true,
   "server": true,
   "datacenter": "nyc2",
   "data_dir": "/var/consul"
}

次に、consulが使用するウィスパープロトコルに暗号化を実装します。 この機能は、共有秘密システムを使用して組み込まれています。 シークレットは、16ビットのbase-64エンコードされた文字列でなければなりません。 この値に適切な値を取得するために、ファイルを一時的に終了します。

ターミナルでは、 `+ consul +`コマンドを使用して、必要な長さとエンコードのキーを生成できます。 タイプ:

consul keygen

生成された値をコピーして、構成ファイルを再度開きます。

nano /etc/consul.d/bootstrap/config.json

コピーした文字列を `+ encrypt +`パラメータの値として使用します:

{
   "bootstrap": true,
   "server": true,
   "datacenter": "nyc2",
   "data_dir": "/var/consul",
   "encrypt": ""
}

最後に、ログレベルを指定し、ログにsyslogを使用することを示すための追加情報を追加します。

{
   "bootstrap": true,
   "server": true,
   "datacenter": "nyc2",
   "data_dir": "/var/consul",
   "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
   "log_level": "INFO",
   "enable_syslog": true
}

完了したら、ファイルを保存して閉じます。

通常のサーバー構成の作成

ブートストラップ構成が完了したので、一般的なサーバー構成の基礎として使用できます。 クラスターがブートストラップされると、サーバー構成が使用されます。

編集のために、ブートストラップファイルを `+ server1 +`からそのマシンのサーバーサブディレクトリにコピーすることから始めます。

cp /etc/consul.d/bootstrap/config.json /etc/consul.d/server

ファイルを開いて、必要な変更を加えます。

nano /etc/consul.d/server/config.json

開始するには、この構成は非ブートストラップ構成用であるため、ブートストラップフラグをオフにする必要があります。

サーバー構成のために変更する必要がある他の唯一のものは、このノードが起動時に参加を試みる他のサーバーのIPアドレスを指定することです。 これは自動的に参加するため、サーバーの起動後にクラスターに手動で参加する必要はありません。

{
   "bootstrap": ,
   "server": true,
   "datacenter": "nyc2",
   "data_dir": "/var/consul",
   "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
   "log_level": "INFO",
   "enable_syslog": true,
   "start_join": ["", ""]
}

`+ encrypt +`パラメータは、システムのすべての参加者で同じである必要があります。そのため、ファイルのコピーはすでにその要件を満たしています。 新しい構成を作成するときは、このことに留意してください。

完了したらファイルを保存します。

この構成ファイルの内容を、consulサーバーとして機能する他のマシンにコピーする必要があります。 最初のホストで行ったように、それらを `+ / etc / consul.d / server / config.json +`のファイルに配置します。

他のホストで変更する必要がある唯一の値は、接続を試みるIPアドレスです。 独自のIPではなく、最初のサーバーへの接続を試行することを確認する必要があります。 たとえば、この例の2番目のサーバーには、次のようなファイルがあります。

{
   "bootstrap": false,
   "server": true,
   "datacenter": "nyc2",
   "data_dir": "/var/consul",
   "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
   "log_level": "INFO",
   "enable_syslog": true,
   "start_join": ["", "192.0.2.3"]
}

完了したら、作成したファイルを保存して閉じます。

クライアント構成の作成

これで、サーバー構成はすべて完了しました。 クライアントマシンを適切な構成で稼働させることに集中できます。

クライアントマシンのクライアントサブディレクトリにある構成ファイルを開きます。

nano /etc/consul.d/client/config.json

新しい構成の基礎として、以前の構成を再び使用します。 サーバーファイルの1つの内容をこのファイルにコピーします。

これはサーバー構成にのみ適用されるため、 `+ bootstrap `パラメーターの記述を削除し、 ` server +`パラメーターをfalseに変更することから始めます。

次に、Web UIディレクトリの場所を指定するパラメーターを追加します。 これに必要なファイルを少し取得します。 それらが存在する場所は `+ / home / consul / dist +`です。

最後に、 `+ start_join +`パラメーターを調整して、すべてのサーバーを一覧表示します。

{
   "server": ,
   "datacenter": "nyc2",
   "data_dir": "/var/consul",

   "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
   "log_level": "INFO",
   "enable_syslog": true,
   "start_join": ["", "", ""]
}

完了したら、ファイルを保存して閉じます。

Web UIファイルのダウンロード

Web UIを提供するようにクライアントを構成したので、これを可能にする実際のファイルを取得する必要があります。

領事ウェブサイトで、http://www.consul.io/downloads_web_ui.html [consul web UI]へのリンクを右クリックし、「リンクの場所をコピーする」または同様のオプションを選択します。

クライアント上で、「+ su 」を使用して「 consul 」ユーザーになります。 ` consul +`ユーザーのホームディレクトリにWebディレクトリを設定します。

su consul
cd ~

ここで、「+ wget +」と入力し、その後にスペースを入力して、Web UIダウンロード用にコピーしたリンクを貼り付けます。 この記事の執筆時点では、次のようになります。

wget

ダウンロードしたファイルを解凍し、zipファイルを削除します。

unzip *.zip
rm *.zip

これにより、ホームディレクトリ内に「+ dist +」というディレクトリが作成されます。 これは、構成ファイルでWeb UIパラメーターを指定したディレクトリです。

続行する前に、consulユーザーのセッションを終了してルートセッションに戻る必要があります。

exit

Upstartスクリプトを作成する

これで、構成ファイルが配置されました。 次に、問題が発生した場合に起動および再起動時にconsulインスタンスが自動的に開始されるように、upstartスクリプトの作成に集中できます。

クラスターのブートストラップは頻繁に行う必要があるものではないため(ほとんどの場合、クラスター自体が持続し、単一ノードを再起動してクラスターに再参加する必要がある場合があります)、ブートストラップをupstartスクリプトに考慮しません。 このプロセスを手動で完了する方法については、後ほど説明します。

スタートアップスクリプトは、サーバーとクライアントで似ています。 いずれかのconsulサーバーで、 `+ / etc / init +`ディレクトリ内にファイルを作成して、consul設定を保持します。

nano /etc/init/consul.conf

このファイルの内容を他のサーバーにコピーし、クライアント構成の基礎としても使用します。 このファイル内での最初の注文は、プロセスの説明を作成することです。 サーバーでは次のものを使用します。

description "Consul server process"

次に、プロセスを開始する条件を指定します。 このサービスでは、ローカルファイルシステムがマウントされ、パブリックネットワークインターフェイスが実行されているときにサービスを開始する必要があります。

また、プロセスをいつ停止するかを指定します。 standard Linux runlevelsを使用して、通常の動作モードのいずれでもない場合にプロセスを停止するように指示できます(停止または再起動時にプロセスを停止します)サーバー):

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

プロセスが突然停止した場合、プロセスを再起動するようにinitシステムに指示できます。 また、プロセスを実行するユーザーとグループも指定します。 プロセスを分離するために、consulユーザーとグループを作成したことを思い出してください。

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

最後に、実行する実際のコマンドを提供する必要があります。 これは、単にエージェントモードで実行される `+ consul +`コマンドになります。 サーバー構成仕様を含むディレクトリをコマンドの引数として渡します。

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

exec consul agent -config-dir /etc/consul.d/server

完了したらファイルを保存します。

このファイルの内容を、各サーバーとクライアントの `+ / etc / init / consul.conf +`というファイルにコピーします。

クライアントでは、ファイルを少し変更する必要があります。 これがクライアントマシンであるという事実を参照するように説明を変更する必要があります。 また、実際の `+ consul +`コマンドに渡される設定ディレクトリを変更する必要があります。

最終ファイルは次のようになります。

description "Consul  process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

exec consul agent -config-dir /etc/consul.d/

完了したら、ファイルを保存して閉じます。

クラスターを開始する

これで、consulクラスターを迅速に起動して実行するためのすべての準備が整いました。 プロセスは比較的簡単です。

ブートストラップ設定ファイル(この場合)を含むサーバーで、 `+ su +`を使用してconsulユーザーに簡単に変更します。 その後、consulを呼び出して、ブートストラップディレクトリを引数として渡すことができます。

su consul
consul agent -config-dir /etc/consul.d/bootstrap

サービスが起動し、ターミナルウィンドウを占有するはずです。 ブートストラップモードでは、このサーバーはリーダーとして自選し、クラスターを形成するための基盤を作成します。

他のconsulサーバーで、rootとして、次のように入力してupstartスクリプトで作成したconsulサービスを開始します。

start consul

これらのサーバーはブートストラップされたサーバーに接続し、クラスターを完成させます。 この時点で、3台のサーバーのクラスターがあり、そのうち2台は正常に動作しており、1台はブートストラップモードになっています。つまり、他のサーバーに相談せずに経営判断を下すことができます。

これは私たちが望むものではありません。 各サーバーを同じ基盤に配置します。 クラスターが作成されたので、ブートストラップされたconsulインスタンスをシャットダウンしてから、通常のサーバーとしてクラスターに再入力できます。

これを行うには、ブートストラップされたサーバーのターミナルで「+ CTRL-C +」を押します。

CTRL-C

次に、ルートセッションに戻って、他のサーバーで行ったようにconsulサービスを開始します。

exit
start consul

これにより、以前にブートストラップされたサーバーが昇格されていない特権でクラスターに参加し、クラスターが最終状態になります。

クラスターが完全に機能するようになったので、クライアントマシンは接続できます。 クライアントマシンで、rootと同じ手順を実行します。

start consul

クライアントは、クライアントとしてクラスターに接続します。 クラスタのメンバー(サーバーとクライアント)を見るには、いずれかのマシンでそのメンバーをconsulに尋ねます。

consul members
Node     Address             Status  Type    Build  Protocol
server3  192.0.2.3:8301  alive   server  0.3.0  2
server2  192.0.2.2:8301  alive   server  0.3.0  2
server1  192.0.2.1:8301  alive   server  0.3.0  2
agent1   192.0.2.50:8301    alive   client  0.3.0  2

Web UIへの接続

クラスタへのWebインターフェイスをホストするようにクライアントマシンを構成しました。 ただし、これはローカルインターフェースで提供されているため、マシンのパブリックインターフェースを使用してアクセスすることはできません。

Web UIにアクセスするには、UIファイルを保持するクライアントマシンへのSSHトンネルを作成します。 Consulは、ポート8500でHTTPインターフェイスを提供します。 ローカルポート8500をクライアントマシンのポート8500にトンネルします。 ローカルコンピューターで次のように入力します。

ssh -N -f -L 8500:localhost:8500 root@

これにより、リモートマシンに接続され、ローカルポートとリモートポートの間にトンネルが作成され、接続がバックグラウンドになります。

ローカルWebブラウザーで、次のように入力して、consul Webインターフェースにアクセスできるようになりました。

http://localhost:8500

これにより、デフォルトのWeb UIページが表示されます。

image:https://assets.digitalocean.com/articles/consul_intro/consul_default.png [Consul web UIランディングページ]

このインターフェイスを使用して、サーバーの状態を確認し、サービスとインフラストラクチャの概要を取得できます。

Web UIの使用が終了したら、SSHトンネルを閉じることができます。 `+ ps `コマンドと ` grep +`を使用してプロセスのpid番号を検索し、転送したポート番号を検索します。

ps aux | grep 8500
1001        0.0  0.0  43900  1108 ?        Ss   12:03   0:00 ssh -N -f -L 8500:localhost:8500 [email protected]
1001      5309  0.0  0.0  13644   948 pts/7    S+   12:12   0:00 grep --colour=auto 8500

上記の出力(使用したトンネリングコマンドを含む行)で強調表示されている番号は、探しているpid番号です。 次に、これを `+ kill +`コマンドに渡して、トンネルを閉じます。

kill

結論

これで、領事のメンバーを安定して管理できるようになりました。 consulクラスターは、ブートストラップして、すばやく簡単に起動できます。 既存のサーバーの構成ファイル(consul configおよびupstartスクリプト)をコピーすることにより、追加のノードを迅速に構成できます。

現在、サービスを簡単に管理できるように領事環境が設定されていますが、まだ通信を完全に保護していません。 https://www.digitalocean.com/community/tutorials/how-to-secure-consul-with-tls-encryption-on-ubuntu-14-04 [次のガイド]では、設定方法に焦点を当てますメンバーのRPC通信を暗号化および検証するためのSSL証明書の検証。

Related