「Dockerを理解する」という出版物に触発され、Webアプリケーションを起動するためのドッカーの周りの松葉杖の小さな例です。
さまざまなストラップテクノロジーを試しましたが、一部(fig)は少し使いにくいように見え、一部(kubernetis、mesos)は抽象的で複雑に見えます。
私の構成には複数のマシンがあり、マシン上でさまざまなWebアプリケーションが実行されていますが、その一部はローカルストレージを必要とします。 基本的なスキームとして、2つのフロントエンドと1つのバックエンドの構成を採用し、必要に応じてceph(FS)がバックエンドのデータローミングを提供します。
車にはプライベートネットワークインターフェイスがあります。 フロントエンドにはパブリックなものもあります。
構成の日に、多くのetcd + skydns(サービス検出)、runit(コンテナーの状態の監視)、およびansible(構成)を使用します。 以下に、ansibleモジュールのコードを示します。これについて説明します。
新しいサービスを開始するとどうなるか見てみましょう。 たとえば、influxdbを実行します。
ansible -i hosts node-back-1 -s -m rundock -a 'state=enabled name=influxdb image="registry.s.prod.example.com:5000/influxdb:latest" args="--volumes-from data.influxdb -p $PRIVATE_IP:8083:8083" announce=8086 port=8086'
Ansibleは、runitの新しいタスクをマシンに追加します。これには、コンテナとアナウンスメントという2つのサブタスクが含まれます。
$ cat /etc/sv/docker-influxdb/services/service/run
runitは古いコンテナを強制終了し、新しいコンテナをダウンロードして、インタラクティブにdockerを起動します。 コンテナが停止すると、runitはコンテナを再起動します。
data.influxdb
コンテナでは、influxがデータを保存するFSへの途中で
data.influxdb
行われました。
2番目のサービス:
$ cat /etc/sv/docker-influxdb/services/announce/run
bashモジュールは組み込みコマンドとしてsleepを追加し、bashはドメインのレコードを更新し、influxdbはnode-back-1.influxdb.s.prod.example.comで利用可能になります。
松葉杖 :コンテナがクラッシュループに入った場合でもアナウンスは生きているため、良い方法では、アナウンスはコンテナ内から行う必要があります。
フロントエンドのgrafanaを固定します。
ansible -i hosts node-back-1 -s -m rundock -a 'state=enabled name=grafana image="tutum/grafana:latest" args="-e INFLUXDB_HOST=influxdb.s.prod.example.com -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=metrics -e INFLUXDB_USER=metrics -e INFLUXDB_PASS=metrics -e HTTP_PASS=metrics -e INFLUXDB_IS_GRAFANADB=true" announce=8087 port=80'
ここで、ポートとアナウンスは異なります。標準コンテナはポート80でgrafanaを提供し、8087に配布するためです。
最後に、nginxのアップストリーム:
upstream docker_grafana { server grafana.s.prod.example.com:8087; keepalive 512; }
松葉杖 :手で釘付けされるポート。 良い方法では、
このような
ものがnginxにSRVレコードの使用方法を教えるかもしれません。
ソリューションの安定性について話してください。
フロントエンド。 フロントエンドが停止した場合、DNSレコードを更新する必要があります。 私たちはしばらく嘘をつき、悲しみを感じます。
発見。 etcd / skydnsは、コンセンサスで適切に組み立てられている場合、一般に殺すのが困難です。
バックエンドサービス。 複数のバックエンドを実行できるように、マシン名なしでサービスを解決します。 skydnsは、負荷を分散するか、停止したサービスをすばやく置き換えます。
ファイルシステム。 理想的な世界では、私たちは完全に不変の状態にありますが、人生ではすべてが悲しいです。 レプリケーションを理解するデータベースは、ローカルディスクまたは通常の
--volume
ストレージを保持できます。 コンテナ間で何かを配布する必要がある場合、cefが機能します(paxosも、殺すのは困難です)。