[和訳] Kitchen-DockerかKitchen-Dokkenか? Test KitchenとDockerを使用してCookbookのテストを高速化 #getchef #kitchenci #docker
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本稿は Kitchen-Docker or Kitchen-Dokken? Using Test Kitchen and Docker for fast cookbook testing (2018/3/6) の和訳です。
Chef社のTest Kitchenプロジェクトは、インフラストラクチャコードの高速な機能テストを可能にします。ここ数年、Dockerのようなコンテナ技術の登場により、devopsのエンジニアはこのフィードバックサイクルのスピードを上げることができました。コンテナの起動時間は、クローンを作成して完全なハイパーバイザで起動する必要があるVMイメージと比べて非常に高速です。
ただし、コンテナは軽量VMではないため、インフラストラクチャコードのテストにはいくつかの制限があります。特に、コンテナは一般に完全なinitプロセスを実行しないため、serviceのような低レベルのChefリソースをテストするには多少骨が折れます。さらに、OSベンダが提供するベースコンテナイメージは非常に小さく、しばしばカーネル、GNU coreutils、およびパッケージマネージャしか含まれていません。テストサイクルのたびに、実際のシステムをシミュレートするためのユーザランドをインストールする必要があるのはリソースの無駄です。
この問題を解決するTest Kitchenドライバを、2つのコミュニティがそれぞれのアプローチで開発しています。kitchen-dokkenとkitchen-dockerです。Kitchen-dokkenはChefと密接に結びついているので、ChefDKと一緒に出荷しています。kitchen-dockerはChefDKに同梱していませんが、これまで蓄積してきた貴重なユースケースがあります。
Kitchen-Dokken
Awesome Community ChefのSean O'MearaによるKitchen-Dokkenは、Chef Recipeのスピードとテストのために最適化されています。これは、既存のDockerイメージを使用し、bind mountを使用してChef Client自身やCookbookのようなデータをコンテナにコピーする必要なく共有することで、この目標を達成します。これにより、構成上の負担をかけることなく速度を大幅に向上させることができます。driver、provisioner、およびtransportの境界線があいまいなので、より"伝統的"なdriverから派生しています。現在、Chefでの使用を前提としているので、ChefDKの一部となっています。これはコンテナ内のPID1としてsystemdを使用して、serviceのようなリソースのテストを可能にします。
1つの課題は、bind mountはDocker-in-Dockerの状況において、このdriverを使用することが難しくする可能性があります。そのようなシナリオは、例えばGitLabのようなDockerベースのCIシステムが考えられます。2つのDockerの境界をまたいだmountを適切に設定しているかどうかを確認することは困難です。
Kitchen-Docker
主にもう一人のAwesome Community Chefである Noah Kantrowitz が管理しているKitchen-dockerは、他のdriverと同様にprovisionerに依存しません。つまり、Chef固有のものではありません。Chefでのプロビジョニング時、デフォルトでは他のdriverと同様にChef Clientをダウンロードしてインストールします。より複雑な設定(他のprovisonerを使用するなど)も可能です。ただしその場合はDockerへの慣れが必要です。Kitchen-dockerは、Docker Hubの最小限のOSディストリビューションコンテナを使用しますが、前記のように、多くの場合、追加の設定が必要になります。最後に、kitchen-dockerはコンテナ内のPID 1としてsshdを使用し、ネットワークのセットアップが簡単なSSH接続を介してインフラストラクチャコードを送信します。これによりbind mountは不要となります。しかし、この設計は、initシステムと通信ができるserviceのようなリソースをテストすることは不可能であることを意味します。
まとめ
簡単なテストが必要なChefユーザの場合は、kitchen-dokkenを使いましょう。
より複雑なテストのニーズがあるChefユーザ、またはkitchen-dokkenがサポートしていない機能が必要な場合は、kitchen-dockerをお試しください。これは、特にDockerベースのCIシステムと組み合わせて使用する場合に当てはまります。
あなたがAnsible/Puppet/非Chefユーザーの場合は、kitchen-dockerを使用してください。
どちらのdriverも、オーバーヘッドが低いというコンテナの特性のおかげ高速です。kitchen-dokkenはより多くの構成が設定済みのため、さらに高速に感じるでしょう。