BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Airbnbはいかにして1,000名を越えるエンジニアのKubernetesワークフローを簡略化したか

Airbnbはいかにして1,000名を越えるエンジニアのKubernetesワークフローを簡略化したか

原文(投稿日:2019/03/08)へのリンク

AirbnbのインフラストラクチャエンジニアであるMelanie Cebula氏がQCon Londonで講演[スライドのPDF]し,250を越える重要なサービスの設定とKubernetesへのデプロイを並行して実施する1,000人以上のエンジニア(1日あたりの平均デプロイ数は500に及ぶ)をサポートするために,Airbnbが社内で使用しているツールと戦略について語った。実現のために重要な役割を果たしたのは,標準化された環境とネームスペースを使って,上位のプリミティブからKubernetes設定を抽象化し,生成するためのレイヤ(および可能な限りの自動検証)を設けたことだ。エンジニアの共通ワークフローの自動化や,すべての環境において同じツールを使うようにしたことにも大きな意味があった。

kube-genは,サービスのパラメータ(単一のYAMLファイルで定義する)を与えることで,必要とされる定型的な設定を追加した完全なKubernetesサービス構成を生成可能な,Airbnbの社内ツールである。それまで同社では,構成のファイル継承機構(Chef cookbookにあるような)を使用していたが,インフラストラクチャ障害の影響が連鎖するという問題が発生していた。そのため,目標のひとつは,サービス設定にYAMLテンプレートを使って,潜在的なミスによる影響範囲を縮小することにあった。

kube-genのもうひとつの大きな目標は,Kubernetesの構成やツールに関する複雑性を抽象化することで,長期間の学習カーブを必要とせずに,必要なレベルの独立性(標準化された環境名に基づいて自動生成される名前空間による保証を含む)を持って,エンジニアリングチームが自身のサービスのデプロイメントに関する所有権を所持することにあった。kube-genはAirbnb特有の状況に対処するものであるため,一般公開はされていないが,Cebula氏はオープンソースの代替製品としてhelm(パッケージ管理),kustomize(ファイル継承による構成設定),kapitan(テンプレートを使用した構成設定)などをあげている。


図: 独自のYAML形式で記述されたサービス設定ファイルをKubernetesで必要な設定ファイル(YAMLで定義された環境毎にひとつ)に変換した上で,Kubernetesクラスタに適用する(提供: Melanie Cebula, Aribnb)

等質で変更の容易な構成を進める上で,さらなる戦略として,コマンドひとつで可能なサービススケルトンリポジトリの作成,ビルド時およびデプロイ時における構成ファイルの検証(文法のみでなく,無効なプロジェクト名やオーナといった値に関する既知の問題について),(生成された)サービス構成のバージョン管理なども実施している。

新たに生成されたサービスのgitリポジトリには,適切なデフォルト値とグッドプラクティス(デフォルトでの自動スケールやドキュメント生成など)が自動的に入力された,アプリケーションとインフラストラクチャの定型ファイル(CI/CD用を含む)が含まれている。サービス構成のバージョニング(YAMLファイルの特定のフィールドを使用する)により,障害バージョンの管理(再度デプロイされないように) - kube-gen自体とサービス特有のものが含まれる - に加えて,異なるチャネルへの異なるバージョンの配布(stablebetaというように)も可能になる。


図: Airbnbで使用しているサービス構成YAMLの例,バージョン項目を含む(提供: Melanie Cebula, Airbnb)

Airbnbにはkという社内ツールもある。kはおもにkubectl用の独自ラッパで,kubectlの冗長な出力のフィルタリングを行う他,前述のkube-genツールのラッピング,Dockerイメージの生成とプッシュといった機能も備えている。このツールは,一般的なワークフローを自動化することにより,Kubernetesのツールの複雑さを抽象化して,エンジニアリング作業を単純化および標準化するために開発されたものだ。しかしCebula氏によれば,開発者とインフラストラクチャエンジニアが共通のことばで話をし,同じツールを使用することにより,コラボレーションを強化する効果もあった。

典型的なワークフローは,まずk generateでKubernetesファイルを生成し,k buildで構築したDockerイメージをレジストリにプッシュした上で,最後にk deployでKubernetesの名前空間の生成とKubernetesファイルの適用を行って,最終的なデプロイメント状態を待つ,というものである。環境(つまりローカルマシン,CI,ステージング,あるいは運用)に関わらず,サーバは同じ方法で構築され,デプロイされる。k diagnoseでの実行も可能である。このコマンドは,kubectl diagnosekubectl podeventsという,Airbnbが開発した2つのプラグインを使用する。起動しないコンテナの情報を収集し,関連するpodイベントを検出し,そのコンテナのログを取得するという,デプロイメントの問題をデバッグする場合の一般的な手順を自動化することが目標だ。

最後にCebula氏は,AirbnbのKubernetes導入に関する,いくつかの未解決の問題について言及した。特に,数千に及ぶ既存サービスのマイグレーションにおいては,もっとよいマルチクラスタサポートやスケール性が必要であること(サービスの中には数百のレプリカを使用するものもある),メモリを大量に使用するステートフルなサービスの扱い,すべての構成をカスタムコントローラを使ったGitOpsワークフローに移行すること,などが課題としてあげられていた。

この記事に星をつける

おすすめ度
スタイル

BT