web-dev-qa-db-ja.com

KubernetesやDocker1.12 Swarmなどのコンテナークラスターでは、外部DNSを使用して、適切なホスト上の適切なコンテナーにどのように解決しますか?

たぶん私はばかげているかもしれませんし、良い言葉を使っていないだけかもしれませんが、StackexchangeやWeb全体のどこにも答えが1つも見つかりません。

私は多くのウェブサイトを作成しましたが、主にWordpress、Drupal、...
(そして最近、私はScala and Goを体験し始め、これらの言語についての知識を得るためにWebサイトを作成しようとしています。)
私のDNSプロバイダーはほとんどDNSMadeEasyです。

最初は、Debianで1つの大きな専用サーバーを使用していましたが、さまざまなWebサイトがさまざまなフォルダーにあり、Nginx、PHP-FPM、 ...すべての私のウェブサイトにサービスを提供しています。従来のセットアップ。

それから数年前、私はDockerセットアップに切り替えましたが、まだ1つのホストで、1つのNginxコンテナー、1つのPHP-FPMコンテナー、1つのMySQLコンテナーがあります、... Webサイトごと。
そして、すべての前に1つのnginxリバースプロキシコンテナがあり、ウェブサイトexample.comの訪問者をexample.comコンテナにリダイレクトします。

従来のセットアップまたはDockerベースのセットアップのいずれかで、ホストのIPアドレスをDNSMadeEasyのさまざまなWebサイトのAレコードに割り当てていました。そしてvoilà、すべてが期待どおりに機能します。

ここで、Docker Swarm(1.12 Swarm)またはKubernetesを使用して、単一ホストセットアップから複数ホスト別名クラスターセットアップに切り替えたいと思います。そもそもDockerに切り替えることが目的だったため、より簡単にスケーリングできるようになりました。
そのため、さまざまなWebサイトのコンテナーは、クラスターのさまざまなホストに分散されます。

OpenStackで実行されているヨーロッパのクラウドを使用することを計画しています。GoogleCloudEngineやのようなアメリカのクラウドを使用できず(<>プライバシー法)、使用したくない(<>高すぎる)ためです。 AWS EC2(<> Patriot Act <> European Data)、ですから、これらのクラウドを使用するように言わないでください。 このOpenstackクラウドで、KubernetesクラスターとDocker Swarmクラスターを既にセットアップできました。

私の質問:私が理解できないのは、自動的に作成される新しいサービスとポッドを動的にWebサイトに向ける方法です。

私が4人のホスト(1人のマスターと3人のワーカー)を持っているとしましょう。
ラウンドロビンDNS解決を実行した場合、4つのホストの4つのIPすべてをWebサイトのAレコードに入れて、 4つ目は、悪夢であり、キャッシュヘッダーとすべてを含む完全な混乱になります。 さらに、DNSMadeEasyには、レコードを自動的に追加および削除するAPIがあるため、このプラグインがAWS Route53で行うように、WebサイトのAレコードまたはCNAMEレコードを自動的に更新できるはずです。 : https://github.com/wearemolecule/route53-kubernetes(これは外部LoadBalancerを使用していることがわかるので、セットアップには外部lbも必要だと思います。その解決策に従う必要がある場合は?)

KubernetesとDocker Swarmの両方がサービス検出にDNSを使用し、登録と選択にetcd/consulを使用していることを認識しています。
しかし、私が理解していることから、これは外部のDNSシステムではなく、内部のDNSシステムとして使用されています。?

または、NSをホストにポイントし、DnsMadeEasy !! ??の代わりにホストを使用する必要があります

私は何かが足りないのですか?私はそれを間違っていますか?

誰かが私を助けてください、私は物事を整理しようとして大きな頭痛がし始めます:)

Y

3
Yannovitch

Swarm-modeを備えたDocker1.12には、負荷分散が組み込まれています。

あなたの場合、その主な利点は、特定のコンテナが実行されるホストに応じてDNSを動的に更新する必要がないことです(DNS ttlとキャッシュのために、とにかく災害につながる可能性があります)。

たとえば、次のように実行したとします。

docker service create --name nginx -p 80:80 nginx

これにより、1つのレプリカでnginxサービスが作成されるため、スウォーム内のランダムなホストで1つのコンテナーが開始されます。ただし、組み込みの負荷分散は、スウォームホストのanyのポート80で、コンテナーが実行されているホストに要求をルーティングします。同様に、サービスを次のように拡張する場合:

docker service scale nginx=2

これにより、セットアップが非常に簡単になります。

  1. DNSMadeEasyラウンドロビン 機能を使用して、群れのすべてのホストIPのAレコードを追加します。
  2. docker service createを使用してアプリをデプロイします
  3. 利益

あなたの質問から、あなたはあなたの群れで複数のサイトを運営したいと思っているように思えます、例えば。複数のアプリがすべてポート80とポート443でリッスンしています。@ Flippyが指摘しているように、これを行うには、現在、リクエストのホストヘッダーを検査してリクエストを適切に転送するHAProxyやnginxなどのレイヤー7ロードバランサーを実行する必要があります。これはDocker1.12 Swarmモードでも簡単に実行でき、これは 優れた入門ガイド です。

4
friism

KubernetesビルトインDNS

Kubernetes 1.3以降、DNSは、アドオンマネージャークラスターアドオンを使用して自動的に起動される組み込みサービスです。 DNSポッドとサービスがクラスターでスケジュールされ、キューブレットは、DNSサービスのIPを使用してDNS名を解決するように個々のコンテナーに指示するように構成されます。

クラスターで定義されたすべてのサービス(DNSサーバー自体を含む)には、DNS名が割り当てられます。デフォルトでは、クライアントポッドのDNS検索リストには、ポッド自体の名前空間とクラスターのデフォルトドメインが含まれます。これは、例で最もよく説明されています。

Kubernetes名前空間バーにfooという名前のサービスがあるとします。名前空間バーで実行されているポッドは、fooのDNSクエリを実行するだけでこのサービスを検索できます。名前空間quuxで実行されているポッドは、foo.barのDNSクエリを実行することでこのサービスを検索できます。

詳細については、 Kubernetesドキュメント を確認してください。

NGINXロードバランシング

負荷分散のデフォルト構成:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

詳細については、 NGINXドキュメント を確認してください。

DNS REST API

次に、必要に応じてDNSプロバイダーAPIと対話するカスタムスクリプトを作成できます。

詳細については、DNSMadeEasy REST APIドキュメント を確認してください。

3
Flippym