高い開発者体験を実現する開発環境の仕組み
Kubernetesには、何かを実行するとそれに連動して必要な操作が自動実行される「コントローラーパターン」と呼ばれる仕組みがある。その実行部分を担うのが、Kubernetesクラスター内で動作するコントローラー群だ。
早川氏は、それぞれの役割を図で説明した。たとえばユーザーがデプロイを実行すると、データストア(etcd)にデプロイメントリソースが保存される。これを受けて、コントローラー群のひとつであるDeployment ControllerはReplicaSetリソースを作成、データストアに保存。それを検知したReplicaSet ControllerがPodを新規作成。さらにそれを検知したkube-schedulerがPodの配置先を決定して、Podが起動する。Kubernetesには、状態を観測しながら指定の状態になるようプロセスを繰り返すReconciliation Loopというロジックがあり、これらがうまく連係することで自動実行の仕掛けが完成する。
Kubernetesにはさまざまなリソースが標準で用意されているが、すべてのユーザーのニーズに一致するものが揃っているわけではない。そこで登場するのが、CRD(Custom Resource Definitions)とカスタムコントローラーだ。カスタムリソースをCRDで定義し、その状態をチェックして指定の操作を実行するカスタムコントローラーを実装することにより、Kubernetesの機能を拡張できるというわけだ。
ヤフーのカスタムコントローラー活用事例
ヤフーではこのカスタムコントローラーを活用して、同社固有の要件に応える、高い開発者体験を実現するKubernetesベースのアプリケーション実行環境を構築している。早川氏は同社の開発環境の特徴を3つ紹介した。
- セルフサービスで利用開始
- アプリケーション実行までの手間の簡素化
- マルチテナント&スケーラブル
1つめは、開発者がセルフサービスで利用開始できる点だ。開発者はブラウザ画面でNamespaceを作成すれば、アクセス権が自動設定され、自分の所属するチームのみが使えるNamespaceをすぐに利用可能になる。具体的には、Namespaceを作成するとAPIが呼び出され、Git管理されているマニフェストのレポジトリにNamespaceが作成され、CIツールからクラスターに反映される。そして、それを検知したカスタムコントローラーが権限管理システム(Athenz)に権限情報を登録、権限制御が働くようになる。Namespaceで別チームやプロジェクトの情報を取得しようとしても、Forbiddenが返ってくる。
2つめは、デプロイに関する手間の簡素化だ。簡単なコマンドまたはカスタムリソースからアプリケーションをデプロイするとカスタムコントローラーが発動し、DNSサーバーにレコードを登録。エンドポイントにURLを自動的に払い出すという仕組みだ。そして3つめは、マルチテナントとスケーラビリティの実現だ。同社では、1つのメタクラスターが複数のKubernetesクラスターを束ねる、超大規模なアプリケーション実行基盤を構築している。メタクラスターはアプリケーションのデプロイ指示を受けると、適切なクラスター上でアプリケーションを起動する。ユーザーはクラスターを意識することなく、アプリケーションにアクセスできる。
このほか、アプリケーションIDの自動設定も提供している。アプリケーションがデプロイされると、アプリケーションを一意に識別可能なクライアント証明書がPodに自動設定され、それに対応するアプリケーションアカウントがカスタムコントローラーによってAthenz上に登録される。KubernetesのSecretを管理しなくても外部システムにアクセスするための認証情報を自動的に設定できると早川氏は説明する。