【参考訳】Nomad

【参考訳】Nomad

【参考訳】Nomad はてなブックマーク - 【参考訳】Nomad


HashiCorp から、HashiConf 2015 および HashiCorp の blog で Nomad の発表がありました。例によって、参考訳を作成しましたので、参考程度にどうぞ。新ツールotto (Vagrantの知見を元にマイクロサービス・アーキテクチャ基盤の構築・デプロイをコマンドラインで行うツール)や Vault 0.3 のリリースについては、この後また改めてを予定しています。
—–
Nomad – HashiCorp
https://www.hashicorp.com/blog/nomad.html

■ Nomad

私達は今日 Nomad を発表します。これはマイクロサービスやバッチ・ワークロード向けに設計されたクラスタ・マネージャとスケジューラです。Nomad は分散し、高い可用性を持ち、複数のデータセンタやリージョンにわたる数千のノードにスケールすることができます。

Nomad が提供するのは、インフラをまたがるアプリケーションのデプロイという、一般的なワークフローです。開発者はジョブの宣言をするとき、どのようにアプリケーションがデプロイされるべきか、そして、どのようにリソースを使うか(CPU、メモリ、ディスク)を定義します。Nomad はこれらのジョブを受け取ると、それらを実行可能なリソースを探し出します。スケジューリング・アルゴリズムによって全てのコンテナが満足に動作するようにし、多くのアプリケーションが最適なリソースが利用可能なホスト上で動作するようにまとめるものです。Nomad がサポートしているのは、仮想化、コンテナ化、標準的なアプリケーション(訳者注:バイナリなど)を主要なオペレーティング・システム上で実行できるようにしますので、幅広いワークロードを柔軟にサポートします。

Nomad はプロダクション環境でのデプロイに使用しており、私達が一般公開できるようになったのを誇りに思います。私達はプロジェクトの将来に興奮しいます。Nomadが基礎を構築する始まりとなります。

詳細については、以下をお読みください。

■ 機能

Nomad はリソース・マネージャとスケジューラの機能を組みあわせたものです。リソース・マネージャとしては、Nomad はホスト毎に利用可能なリソースと許容量に関する情報を収集します。スケジューラとしては、中央 Nomad サーバが先の情報を使い、ジョブが実行される適切な場所を決定します。この仕組みによって Nomad は多くの可能性を持ちますが、ここでは主要な機能をいくつか紹介します:

* Docker:Nomad は Docker を優先ワークロード・タイプとしてサポートしています。Nomad に「docker」タスク・ドライバを使ってジョブを送信すると、コンテナ化されたアプリケーションを簡単にデプロイ(配置)できます。ジョブは必要なインスタンス数を指定していますので、Nomad は設置や障害発生時の復旧を自動的に処理します。

* 運用を簡単に:Nomad はクライアントもサーバも単一のバイナリとして実行できます。実行にあたっては、その他の拡張サービスの調整やストレージを必要としません。Nomad は分散し、高い可用性を持ち、単純化のためにリソース・マネジメントとスケジューリングを単一のシステムで実現しています。

* マルチ・データセンタとマルチ・リージョン:Nomad はデータセンタのグループという、大きなリージョンのインフラをモデルとします。リージョン・レベルから、データセンタをまたがるスケジューリングを実行します。登録されたシステム全体において、指定されたジョブは複数のリージョンで同時に処理されます。

* 柔軟なワークロード:Nomad はタスク・ドライバという拡張をサポートしているので、コンテナ化、仮想化、標準的なアプリケーションを実行することができます。ユーザは Docker コンテナ、仮想マシン、Java のようなアプリケーション・ランタイムを簡単に開始できます。Nomad は Linux、Windows、BSD、OSX をサポートしており、あらゆるワークルオー度で柔軟に実行できます。

* スケールするために構築:Nomad は世界中にスケールするインフラをサポートできるように設計されました。Nomad は分散し、高い可用性を持っています。これには、リーダー選出と状態のレプリケーションの両方を使うことで、障害に対する可用性をもたらします。Nomad は同時処理(concurrent)の最適化を行うため、全てのサーバがスケジューリングの決定に参加することができます。これにより、必要なワークロードをサポートするための、全体のスループットやレイテンシの減少を提供します。

■ Nomad のジョブ

ジョブとは Nomad の中核となるものであり、Nomad がどのようにタスクを実行すべきかを記述するものです。ジョブの指定には HCL 言語を使いますので、簡単に読むことができ、バージョンコントロールが簡単になります。ジョブは Nomad に対して、何を、どのように、どこで実行するのか宣言・指定するものです。

以下は Docker を使ってウェブ・サバを実行するという Nomad アプリケーションの例です。

# hashicorp/web/frontend job の定義
job "hashicorp/web/frontend" {
    # Run in two datacenters
    datacenters = ["us-west-1", "us-east-1"]

    # linux 上でのワークロードを定義
    constraint {
        attribute = "$attr.kernel.name"
        value = "linux"
    }

    # ジョブをローリング・アップデートする設定
    update {
        # 30秒毎に更新
        stagger = "30s"

        # 更新処理は単一のタスク
        max_parallel = 1
    }

    # タスク・グループの定義
    group "frontend" {
        # トラフィックを処理できる十分なサーバを確保
        count = 10

        task "web" {
            # サーバの実行に Docker を使う
            driver = "docker"
            config {
                image = "hashicorp/web-frontend:latest"
            }

            # リソースを指定するAsk for some resources
            resources {
                cpu = 500
                memory = 128
                network {
                    mbits = 10
                    dynamic_ports = ["http"]
                }
            }
        }
    }
}

これは非常に簡単な例ですが、Nomad のいくつかの機能を表しています。Nomad のジョブはタスクグループによってまとめられます。タスク・グループとはタスクの集まりであり、一緒に実行されます。各々のタスクは個別のアプリケーションとしてドライバに実行されます。ドライバを使うことで、Nomad は仮想化、コンテナ化、標準的なアプリケーションをスムーズに実行できます。

リリース時点では、Nomad は完全仮想化マシンの実行に Qemu が利用でき、コンテナの実行には Docker、Java のスタンドアロン jar の実行や、インストール済みのあらゆるアプリケーションを実行するための「exec」ドライバがあります。これらのドライバは、様々な処理を行えることを意味しており、今後利用可能またはサポートされるドライバは増えていく予定です。

このサンプル・ジョブには Nomad の強制実行機能(constraint enforcement abilities)も含まれています。強制(constraint)によって、タスクを実行するホストを制限したり、ジョブの実行を、個々のタスク・レベルまたはグループで指定します。これにより、アプリケーションの実行に必要なカーネルのバージョンを指定するために使ったり、PCI コンプライアンスのようなビジネス的な理由に使うことができます。

「update」ブロックを見てみると、どのようなジョブを実行するか定義されており、ジョブの定義が変更があったときの更新方針を指定してあることがわかります。これにより、開発者は簡単にローリング・アップデートすることができ、アプリケーションのサービス中断を最小化します。更新について付け加えると、アプリケーションはタスクグループのカウント数を任意のものに変更することで、簡単にスケールできます。

最後に、私達はこのようにタスクが必要なリソースを定義することができます。この機能を使うことにより、スケジューラは多くのアプリケーションを単一のマシンで最大限まとめてつく逢うことができます。リソース分離(resource isolation)のためには、cgroups、namespacecesといったオペレーティング・システムの制御を使うか、実行前に chroot で制限します。

■ 利用している技術

Nomad は一般的に用いられるスケジューラとなるように作られており、簡単に使いますが、複雑なワークロードを大きくスケールしても十分に扱えるようにしています。私達は先行技術について注意深く学んだ後、背系に取り組みました。私達の分散システム・ツールでプロダクションで使われているライブラリを用い、それらを最大限に活かすようにしています。

クラスタ管理には Google BorgOmega を用いました。これらは10年にわたってプロダクションで使われ磨き上げられています。Omega は novel optimistic concurrency mechanism(novel 並行処理最適化メカニズム)を取り込んだもので、私達が採用したのは、複数のスケジューラにまたがるワークロードの実装のために、必要なものが最もサポートされていたためです。

リーダー選出(Leader election)には スタンフォードで生まれた Raft 合意アルゴリズムを使いました。私達は Consul の開発と実装にあたり、強力なサービス・ディスカバリと、千を超える組織、1000万以上のサーバ管理に用いられています。Nomad が Raft を使うのは、あらゆる外部要因を除外したり、ストレージの操作を簡単にしたかったからです。

統合(Federation)Serf を基盤としたゴシップ・プロトコルを使っており、これらは SWIM 上で構築されたものです。Serf は世界中で開発されており、そこにはサン・ディエゴのスーパーコンピュータ・センタも含まれています。この技術により、メンバー管理や、極めて高いインフラのスケールをもたらします。ゴシップを使うのは軽量なため、Nomad は複数のリージョンを統合して1つのグローバルなクラスタを形成できます。

データストレージには BoltDB を使います。これは ACID に完全に対応しているデータベースであり、マルチ・バージョン・コンカレンシー・制御(Multi-Version Concurrency Contro;MVCCC)を実現します。これらの性質により、Nomad のデータをあらゆる状態で安全に保管します。

ステート・インデキシング(State Indexing)には MemDB を使います。これはメモリ上(インメモリ)にイミュータブル(不変)なインデックスを構築します。MemDB が提供するのはスケジューリングの決定にあたり、現在アクセスできる状態かどうかをロック接続なしに行うもので、Nomad が効果的にスケールできるようにします。

■ HashiCorp による構築

HashiCorp は DevOps 問題を解決するための、技術的に面白く簡単に使えるソリューションを作り上げます。私達は技術の選択にあたって近道を使いません。重要なのは、私達が使うのであれば、経験を経ずに近道をしたり、ツールを操作したりしません。それにより、HashiCorp が提供sルウツールは安定しており、スケーラブルであり、簡単に使ったり運用できます。

Nomad はこのようにして作られた8番目のツールです。私達は VagrantPackerSerfConsulTerraformVaultOtto を作りました。Nomad はエコシステムとして私達のツールと一緒に働きますが、他のツールを必ずしも必要としません。私達は Nomad を既存のツールとより近づけることを計画しています。そこには、サービス・ディスカバリ、セキュリティ、キャパシティ管理といった機能です。Otto は Nomad を透過的に使えるようにし、可能な限り簡単に使えるようにします。私達は Nomad を提供できることを誇りに思います。また、コミュニティが Nomad を学び、使い始めることに興奮しています。

■ 詳しい情報

Nomad についての詳細は、Nomad のウェブサイトをご覧ください。次のステップに進むには、以下のページを読み進めてください:

* intro … 導入セクションでは、Nomad とは何であるか、どのように動作するのかの詳細を説明します。そして、使い始めるにあたっての導入ガイドで、Nomad を自分のマシンで動かし、ジョブのスケジューリングを始められます。

* Internals … 内部セクションでは、Nomard が内部で扱っている高度なトピックについて、興味ある方向けの詳細な情報を扱っています。Nomad を使う上では読む必要はありませんが、Nomad の背景技術について学びたい場合は、読むことを推奨します。

* Comparison to other software … Nomad が他の選択肢とどのような違いがあるのか知りたい場合は、こちらのページを読むことで何が違うかの詳細を知ることができます。

* GitHub … Nomad のソースコードは GitHub に置かれていますので、必要があれば参照できます。私達はまずドキュメントを読むことを推奨します。Nomaed の実装を理解するにあたって、大きな手助けになるでしょう。

■ 原文

Nomad – HashiCorp
https://www.hashicorp.com/blog/nomad.html