12

私はCoreOSに頭を悩ませようとしており、彼らの公式ドキュメント、いくつかのランダムな記事を熟読し、CTO によるこの優れたプレゼンテーションも見ました。

最初に、私の上記の主張が間違っているか、何らかの形で誤解されている場合は、まず私を訂正してください! 私が多かれ少なかれ順調に進んでいると仮定すると、ここでいくつかの懸念があります。

  • Ubuntu や Debian などの他の Linux ディストリビューションにはない、CoreOS が Docker を含むアプリに提供する具体的な利点は何ですか? 言い換えれば、Docker/CoreOS と Docker/Ubuntu のどちらに移行することで、どのような客観的なメリットが得られるのでしょうか?
  • フリートは、Mesos や Kubernetes のようなスケジューリング エンジンのように見えます。これらのプロジェクトの直接の競合相手ですか、それとも異なる「層」(異なるタイプの責任) でスケジューリングを処理しますか? もしそうなら、これらの違いは何ですか?
4

3 に答える 3

10

ここには多くの可動部分があります。すでに投稿された回答は非常に優れています。どんな回答にも意見はあると思います。100バウンティポイントを目指して、あなたのパンチリストを調べてみようと思いました:-)

CoreOS/Flannel/Kubernetes/Fleet を毎日約 6 か月使用しています。紹介にURLを載せてくださったので、見ることにしました。うわー、素晴らしいプレゼンテーション。Brandon Philips はとても良い先生だと思います。彼がそれぞれのテクノロジーを導入する際に、その上に築き上げた方法が気に入っています。そのチュートリアルを誰にでもお勧めします。

CoreOS は Linux ベースのオペレーティング システムです。それは非常に簡素化されており、余分な実行はありません。私にとって、それはこれらのことをします:

  • 自動更新。これはうまくいきます。デュアル パーティション、非アクティブな更新、アクティブなスワップ、フォールバック (フォールバックを経験したことがないと思います)。「展開後にオペレーティング システムを更新する方法」の問題に取り組み、比較的簡単に行えるようにしました。
  • systemd 初期化システム。これは私が好きになるのに少し時間がかかりました (/etc/init.d の人なので) が、しばらくすると気に入ってしまいます。かなり急な学習曲線があります。何が起こっているかを理解したら、systemd がどのようにマシンで特定のもの、依存関係、再起動 (必要に応じて) を実行し続けるか、ソケット (スーパー initd など) をリッスンし、プロセス、d-bus を生成するか (わかりませんが) を気に入るはずです。この部分についてはまだたくさん)。systemd では「ユニット」を指定でき、ユニットには依存関係、前後のプロセスなどを含めることができます。
  • 基本的なサービス。CoreOS システムで実行されている各サービスから簡単な説明行をコピーしました。
    • systemd - PID 1 として実行され、システムの残りの部分を起動するシステムおよびサービス マネージャーを提供します。
    • docker - Docker は、あらゆるアプリケーションを軽量コンテナとしてパック、出荷、実行するためのオープンソース プロジェクトです
    • etcd - etcd は、共有構成とサービス検出のための分散型の一貫したキー値ストアです
    • sshd - sshd (OpenSSH デーモン) は、ssh(1) のデーモンプログラムです。これらのプログラムは一緒に rlogin と rsh を置き換え、安全でないネットワークを介して 2 つの信頼できないホスト間で安全な暗号化通信を提供します。
    • locksmithd - locksmith は CoreOS 更新エンジンの再起動マネージャーであり、etcd を使用して、マシンのクラスターのサブセットのみが常に再起動されるようにします。locksmithd は CoreOS マシンでデーモンとして実行され、更新後の再起動動作を制御します。
    • journald - systemd-journald は、ログ データを収集して保存するシステム サービスです。
    • timesyncd - systemd-timesyncd は、ローカル システム クロックをリモート ネットワーク タイム プロトコル サーバーと同期するために使用できるシステム サービスです。
    • update_engine
    • udevd - systemd-udevd はカーネル uevent をリッスンします。イベントごとに、systemd-udevd は udev ルールで指定された一致する命令を実行します。udev(7) を参照してください。
    • logind - systemd-logind は、ユーザーのログインを管理するシステム サービスです。
    • resolve - systemd-resolved は、ネットワークの名前解決を管理するシステム サービスです。キャッシング DNS スタブ リゾルバーと LLMNR リゾルバーおよびレスポンダーを実装します。
    • hostnamed - これは、ユーザー プログラムからホスト名と関連するマシン メタ データを制御するために使用できる小さなデーモンです。
    • networkd - systemd-networkd は、ネットワークを管理するシステム サービスです。仮想ネットワーク デバイスを作成するだけでなく、表示されるネットワーク デバイスを検出して構成します。

CoreOS では、実行するすべてのものをコンテナーにする必要はありません。UNIXボックスが実行するものは何でも実行します。yum と apt-get が目立って欠落していますが、wget は含まれています。したがって、プログラム、ライブラリ、さらには wget を介して apt-get を「インストール」して、CoreOS ベースを汚染することができます。しかし、それは良いことではありません。あなたは本当にそれを元の状態に保ちたいと思っています。そのために、サンドボックスのようなコンテナーを実行して、ログアウトすると消える作業を実行できる「ツールボックス」が含まれています。

CoreOS の私のお気に入りの部分は、cloud-config です。最初の起動時に、cloud-config と呼ばれる user_data を提供できます。これは、最初の起動時にベース CoreOS に何をすべきかを指示する yaml ファイルです。これは、フリート、フランネル、kubernetes などをインストールする場所です。選択した組み合わせを VM に繰り返しインストールするための非常に簡単な方法です。典型的な cloud-config では、構成ファイルを作成し、他のマシンからファイルをコピーして新しいマシンにインストールし、CoreOS の systemd に管理させたい他のプロセス (フランネル、フリートなど) を制御するユニット ファイルを作成します。そして、それは完全に再現可能です。

CoreOS に関するもう 1 つの興味深い点を次に示します。既存のユニットの依存関係と構成を変更できます。たとえば、CoreOS は docker を起動します。しかし、docker の起動シーケンスを変更したいので、既存のシステム docker 構成を補強するドロップイン構成を追加できます。これを使用して、docker が起動する前にflannelの依存関係をドロップインするため、flannel が提供するネットワークを使用するように docker を構成できます。これは必ずしも CoreOS である必要はありませんが、すべてが適合します。

CoreOSだけでなく、Ubuntuでもcloud-configを使用できると思いますが、同じことができます。したがって、Ubuntu よりも CoreOS から得られる利点は、頻繁に新しいリリースを取得し、オペレーティング システムが自動更新され、「余分な」実行が何もないことです (無駄がなく、攻撃ベクトルが減少します)。フォールアウトです)。CoreOS は docker 用に調整されており (既に実行されています)、ubuntu ではまだ実行されていません。ただし、ubuntuでdockerを実行するcloud-configファイルを作成できます...要約すると、CoreOSを理解していると思います。

CoreOS で得られるもう 1 つのことは、有料または無料の会社からの直接のサポートです。このフォーラムと CoreOS Dev/CoreOS User Google グループを通じて、CoreOS の人々から多くの質問に答えてもらいました。

あなたの艦隊の説明もかなり良いです。フリートはクラスターを管理します。クラスターは、1 つ以上の CoreOS マシンです。したがって、フリートを使用する場合は、CoreOS を使用する必要があります。これは、Ubuntu に対する CoreOS の利点の 1 つになると思います。

systemd のユニット ファイルがホストでのプロセスの実行を制御する方法と同様に、フリートのユニット ファイルはクラスターでのプロセスの実行を制御します。少し複雑な構文がありますが、フリートのユニット ファイルは systemd のユニット ファイルとほぼ同じです。それらは非常によく合います。フリートのユニット ファイルは etcd のデータベースに保存されるため、ユニット サービスをホストするマシンがダウンした場合でも、取り込まれたユニットは永続的です。ユニットの説明は etcd に存在します。

Fleet には、クラスター内のマシンの一覧表示、ユニット ファイルの一覧表示、実行中のユニットの表示などを行うコマンドもあります。基本的に、クラスター (またはすべてのマシン、または特定の種類のマシン ( ssd ドライブを使用する)、または他の何かが実行されているのと同じマシン (アフィニティ) など)。

フリートはそれを実行し続けます。マシンがなくなると、そのユニットはクラスター内の他のマシンで実行されます。

チュートリアルでは、Brandon が Fleet を使用して Kubernetes を起動しています。やり方はとても簡単です。フリート ユニット ファイルがフリート クラスター内のすべてのマシンに Kubernetes を配置するようにすることで、マシンがフリート クラスターに追加および削除されると、Kubernetes は自動的にそのマシンを使用し、Kubernetes がそれらで実行されるようにスケジュールします。私もこのように Kubernetes クラスターを実行しました。とはいえ、今はあまりやっていません。目に見えない利点があると確信していますが、私の環境では必要ないように感じます。既にクラウド構成ファイルを使用してマシンを起動しているため、そこに Kubernetes ノード サービスを直接配置するのは簡単です。実際、cloud-config では、Fleet を使用して Kubernetes を起動したい場合、Fleet ユニット ファイルを作成し、Fleet を開始し、作成したユニット ファイルを Fleet に送信する必要があります。Kubernetes ノードを開始するためのユニット ファイルを作成できたときです。しかし、私は脱線します...

フリートは、Kubernetes と同様のスケジューリング メカニズムです。ただし、Fleet は、Kubernetes がコンテナーを対象としている場合、ユニット ファイルを介して systemd のように任意の実行可能ファイルを開始できます。Kubernetes では、次の定義が可能です。

  • レプリケーション コントローラ
  • サービス
  • ポッド
    • コンテナ

(他のものも)。

したがって、フリートはスケジューリングの別の「レイヤー」に過ぎないという主張は適切です。フリートがさまざまなことをスケジュールしていることを付け加えることができます。私の仕事では、フリート レイヤーは使用しません。コンテナーのみを使用しているため、Kubernetes に直接ジャンプするだけです。

最後に、フランネルに関する主張は正しくありません。Flannel はデータベースに etcd を使用しています。Flannel は、ホスト間でルーティングする各ホストのプライベート ネットワークを作成します。flannel ネットワークは docker に渡され、docker はそのネットワークを使用して IP アドレスを割り当てるように指示されます。そのため、flannel を使用する Docker プロセスは IP 経由で相互に通信できます。各コンテナは独自の IP アドレスを取得するため、すべてのポート マッピングをスキップできます。これらの docker プロセスは、flannel ネットワーク上のインフラおよびマシン内で通信できます。私は間違っているかもしれませんが、フリートとフランネルの間には何の関係もないと思います. また、etcd や Fleet が flannel を使用してデータをルーティングするとは思わない。フランネルが使用されているかどうかに関係なく、Etcd とフリート ルート。Docker コンテナーは、flannel 経由でトラフィックをルーティングします。

-g

于 2015-07-12T22:27:41.363 に答える
3

はい、あなたの理解はかなり正しいです。

Coreos は、より安全なオペレーティング システムとして設計されており、デフォルトで自動更新され、最小限のサービスを実行して攻撃ベクトルを軽減します。http://www.activestate.com/blog/2013/08/alex-polvi-explains-coreos

すべてがコンテナー内で実行されるか、静的にコンパイルされるか (例として golang バイナリー)、またはシェル スクリプトである必要があります。Python や Ruby はインストールされていません。

フリートによって開始されたコンテナー/systemd ユニットは、サーバーに障害が発生した場合 (コンテナーがエフェメラルであると仮定)、別のノードで再スケジュールでき、デプロイの制約に従いながら、要求された数のインスタンスをクラスター上で実行し続ける必要があります。https://coreos.com/using-coreos/clustering/

Mesos はスケジューラのフレームワークに近く、実行するジョブを提供するために何か他のもの (クロノス/マラソン) が必要ですが、その点で非常に柔軟で、サーバー リソースの利用をより適切に処理します。

私は Flannel の経験はあまりありませんが、Docker の将来のバージョンで提供される新しいネットワーク プラグインにより、コンテナー ネットワークのオプションが増える可能性があります。http://blog.docker.com/2015/06/networking-receives-an-upgrade/

于 2015-07-11T07:47:23.197 に答える
2

Docker/CoreOS と Docker/Ubuntu のどちらに移行することで得られる客観的なメリットは何ですか?

技術的なメリット

私が CoreOS に惹かれる機能は次のとおりです。

  • 単一マシンの OS ではなく、クラスターです
  • 失敗を念頭に置いて構築されています
  • 自己更新です

CoreOS はクラスターですが、Ubuntu は単一のマシンです。CoreOS では、コンテナーが存在するマシンが消えると、クラスターは別の場所でコンテナーを起動します。その Ubuntu サーバーに障害が発生すると、そのコンテナーもダウンします。CoreOS では、マシンを使い捨てにすることができます。これは良いことです。

そうは言っても、CoreOS はデータの永続性を処理しないことに注意してください。コンテナに格納されたデータが存在しません! ;) 私の場合、必要に応じて EBS ボリュームを動的にアタッチします。

設計上の利点

私にとってより重要なことは、上記の技術的利点が設計上の利点をもたらすことです。「このプロセスはランダムに消える」ことを知ってシステム設計に入ることは、回復力を構築するのに最適です。最初から、サービスはステートレスであり、依存するサービスがどのシステム上にあるのか文字通りわからないため、検出可能でなければなりません。分散構成ストアであるCoreOS のetcdを使用して、サービスの場所を検出できます。最後に、プロセスが同じマシン上にない可能性があるため、水平方向にスケーラブルなシステムには必須の、ネットワーク アクセス可能なサービスが唯一の方法です。

全体として、CoreOS はTwelve-Factor Appsの構築に最適で、 Chaos Monkeyを無料で入手できます。

フリートは、Mesos や Kubernetes のようなスケジューリング エンジンのように見えます。これらのプロジェクトの直接の競合相手ですか、それとも異なる「層」(異なるタイプの責任) でスケジューリングを処理しますか? もしそうなら、これらの違いは何ですか?

はい、フリートはコンテナーをスケジュールし、クラスター内のどこで実行するかを決定します。そのマシンがなくなった場合、フリートは稼働中のマシンで再起動する責任も負います。

私は Kubernetes について深く掘り下げていませんが、重複しているようです。これまでのところ、Fleet は単一のコンテナー (「ユニット」) の実行を処理するのに対し、Kubernetes は補完的であり、システムを構成する複数のユニットを調整します。たとえば、Fleet は Postgres が実行され続けることを保証します。Kubernetes は、Postgres、Redis、Django などで構成されるアプリケーションがすべて正常に動作することを保証します。

于 2015-07-13T16:59:01.037 に答える