TT Lab
はじめる
学ぶ 学習パス コース

CNPA — クラウドネイティブプラットフォームエンジニアリングアソシエイト

プラットフォームを製品として見るとはどういうことか

TT Labで続きを見る

一言でいうと

プラットフォームエンジニアリングの目標は、ツールをたくさんそろえることではなく、ストリームアラインドチームの認知負荷(cognitive load)を下げることです。そのため、プラットフォームはプロジェクトではなく製品であり、ユーザーは他の開発チームで、成功メトリクスはデプロイ回数ではなく自発的な採用率です。

なぜ必要なのか

「You build it, you run it」が流行するにつれて、多くの組織が運用の責任を開発チームに押しつけました。意図は良かったのですが、結果はこうなりました。開発者1人が知っておくべきことが爆発的に増えたのです。言語とフレームワーク、ドメインロジック、さらにその上にKubernetes、Helm、Terraform、CIの文法、Secret管理、オブザーバビリティスタック、ネットワークポリシー、コスト最適化までが加わります。

これをTeam Topologiesでは、認知負荷の超過と呼びます。認知負荷には3つの種類があります。

種類 内容 対応
内在的(intrinsic) 言語やデータ構造のような基礎スキル 教育と採用で対応します
外在的(extraneous) YAMLを8つ順番に書く手順 プラットフォームがなくすべき対象です
学習関連的(germane) ドメインの問題そのもの ここに頭を使わせる必要があります

プラットフォームエンジニアリングは、外在的負荷を吸収して、学習関連的負荷に使う余裕を作る仕事です。そのため、「私たちのプラットフォームはうまくいっているか」の答えは、ツールの数ではなく、「開発者がドメインの問題にどれだけ時間を使えているか」です。

どう動くのか

製品としてのプラットフォーム

プラットフォームをプロジェクトとして扱うと、次のように進みます。要件を集めて6か月かけて作り、デプロイし、チームを解散します。製品として扱うと、違ってきます。

最も重要な判別式が1つあります。それは強制していないのに人々が使っているかどうかです。社内規定で強制して100%にしたプラットフォームは、採用率ではなく準拠率を測ったことになります。準拠率が高く満足度が低ければ、そのプラットフォームは失敗しつつあるのに、メトリクスがそれを隠します。

Team Topologiesの4つのチームタイプ

CNPAはこの分類を直接問います。

チームタイプ 役割
Stream-aligned 1つの価値の流れ(製品・機能・ユーザージャーニー)に最後まで責任を持ちます。組織の大多数を占めるべきです
Platform ストリームアラインドチームがセルフサービスで使える内部サービスを提供します
Enabling 他のチームの能力ギャップを一時的に埋めます。常駐せず、去ります
Complicated-subsystem 専門知識が深く必要な部分(ビデオコーデック、決済精算、数学エンジン)を担当します

さらに、インタラクションの方式が3つあります。Collaboration(一時的に密着して一緒に発見する)、X-as-a-Service(境界が明確な利用関係)、Facilitating(教えたら手を引く)です。プラットフォームチームの正常な状態はX-as-a-Serviceです。プラットフォームチームがすべてのストリームチームと常時Collaborationを行っているなら、それはプラットフォームがまだセルフサービスになっていないというサインです。

DevOps・SRE・プラットフォームエンジニアリング

この3つは競合する概念ではなく、焦点が違います。

重なる部分は大きいです。プラットフォームもSLOを持つべきですし(SREの手法)、プラットフォームチームも自分たちのプラットフォームを自ら運用する必要があります(DevOpsの原則)。分かれるのは「誰のために最適化するのか」という点で、SREはエンドユーザーの体験を、プラットフォームエンジニアは社内開発者の体験を最適化します。

現場での姿

筆者の7ノードのホームラボが、この話の縮図です。Cilium 1.20 eBPF CNI、MetalLB L2(10.0.0.200-215)、Harborレジストリ(10.0.0.202)、Gitea(10.0.0.200)、Argo CD(10.0.0.201)、kube-prometheus-stackとGrafana(10.0.0.203)、CloudNativePG、GPU OperatorによるGPU 4枚、KubeVirt、csi-driver-nfsがそろっています。スタックを並べるだけなら、立派なプラットフォームに見えます。

ところが、各コンポーネントを立ち上げる過程で出てきたトラブルの一覧こそが、本当のプラットフォームの価値を示しています。Gateway APIにはCRDのv1.6.1が必要で、v1.2ではコントローラーが起動を拒否しました。KubeVirtはコンポーネントの状態がすべてAllComponentsReadyなのにVMが起動せず、原因はvirt-launcher Podのボリュームマウント漏れでした。containerDiskの経路に欠陥があり、DataVolume(PVC)の経路で回避する必要がありました。

これらの知識はすべて外在的認知負荷です。サービスを作ろうとする開発者が知る理由のないものばかりです。プラットフォームチームの仕事は、これらの落とし穴を一度ずつ踏んでから、その結果を「ゴールデンパス1本」にまとめ、ほかの人が二度と踏まないようにすることです。また、「状態がReady」と「実際に動く」は別の命題だという教訓を同じクラスターで3度目に確認したという記録は、プラットフォームが提供すべきものがインストールではなく検証済みの経路であることも意味しています。

続けて読むこと

次の理論レッスンでは、プラットフォームの成熟度の段階と、内部開発者プラットフォーム(IDP)の構成要素を整理します。その次のモジュールでは、Kubernetes APIをプラットフォームAPIに拡張する方法を、実際のクラスターでCRD・CR・ResourceQuota・RBACを使って自分で作ってみます。