Developers Summit 2023 Winterでの発表資料です。
Copyright (C) 2020 Yahoo Japan Corporation. All Rights Reserved.©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesとカスタムコントローラーを活用したプラットフォーム開発・運用の勘所ヤフー株式会社 テクノロジーグループ システム統括本部 クラウドプラットフォーム本部第12代黒帯 〜クラウドスタック〜早川 博 @hhiroshell
View Slide
©︎2023 Yahoo Japan Corporation All rights reserved.自己紹介• ヤフー株式会社(2020年2月〜)• プライベートクラウド開発チーム• 第12代黒帯〜クラウドスタック〜• 書籍執筆 & レビュー、各所での登壇発表などしてます• 分割キーボードはいいぞ早川 博 / @hhiroshellDIYキーボードたち。↑Cornelius→ Corne← BMEK
©︎2023 Yahoo Japan Corporation All rights reserved.目次1. いまPlatform Engineeringがアツい2. Platform Engineeringの重要パーツとしてのKubernetes3. ヤフーでの活用事例4. Kubernetesを使ってプラットフォーム開発を始めよう
©︎2023 Yahoo Japan Corporation All rights reserved.ITシステム開発の歴史• リリースの高頻度化と円滑な改善サイクルの確立を目指して進化モノリシックシステム継続的デリバリー (2012〜)デプロイメント・パイプラインによる迅速かつ高頻度なリリースとフィードバックMicroservices (2014〜)システムを疎結合な小規模アプリ群で構成しアップデートを容易にクラウドインフラとIaCインフラ管理にソフトウェア・エンジニアリングのプラクティスを導入し、調達の迅速化と変更容易性を実現DevOps (2009〜)開発者と運用者の協力体制とそれを支えるツール群※ 時系列の順序には諸説あります
©︎2023 Yahoo Japan Corporation All rights reserved.ITシステム開発の歴史• アプリケーション開発者(Dev)は幸せになったのか…?• 高頻度のリリースとそれに耐える品質を実現するプラクティスにより、心理的安心感を持って開発に当たれるようになった• 高機能かつUXに優れ、スケーラブルで安定的に稼働するシステムが実現できるようになり、結果として開発者の評価に…(※)※ 個人の見解を含みます
©︎2023 Yahoo Japan Corporation All rights reserved.近年のアプリケーション開発者が抱えている課題• 開発者の責任範囲や習得すべきスキル/ツールが増加しているモノリシックシステム継続的デリバリー (2012〜)デプロイメント・パイプラインによる迅速かつ高頻度なリリースとフィードバックMicroservices (2014〜)システムを疎結合な小規模アプリ群で構成しアップデートを容易にクラウドインフラとIaCインフラ管理にソフトウェア・エンジニアリングのプラクティスを導入し、調達の迅速化と変更容易性を実現DevOps (2009〜)開発者と運用者の協力体制とそれを支えるツール群※ 時系列の順序には諸説あります
©︎2023 Yahoo Japan Corporation All rights reserved.近年のアプリケーション開発者が抱えている課題• 責任範囲の拡大と、大量のスキル/ツールの習得に悩まされている• 運用、監視へのコミットと、マイクロサービス化による運用、監視の複雑化• デプロイメント・パイプラインの構築とメンテナンス• 組織によってはクラウド周りの面倒を見たり• 開発に集中できず効率が悪い• スーパーマン以外は活躍しにくい / スーパーマンの頑張りに依存するようになり時間を奪ってしまう
©︎2023 Yahoo Japan Corporation All rights reserved.Platform Engineering• 開発者の効率性と開発体験を高める方法として、”Platform Engineering”が期待されるように• 2022年のGartner Hype Cycleに登場• Innovation Trigger(黎明期)フェーズ※ Cloud-NativeはSlope of Enlightenment(啓発機)フェーズここhttps://twitter.com/TheMarkONeill/status/1557531379746881536
©︎2023 Yahoo Japan Corporation All rights reserved.依存コンポーネントの設定Platform Engineeringとは?• 自社の開発者たちが開発に集中できるようにするための基盤(IDP: Internal Developer Platform)を提供する取り組み1. システム開発で発生する基本的な作業を、セルフサービスで、少ない労力で(舗装された道路を進むように)実施できる2. 専任チームが “プロダクト” として提供する• 明確なミッションを持って、顧客(開発者)のリアルな課題を解決する実行環境の準備ビルドとデプロイ権限設定監視系のセットアップ
©︎2023 Yahoo Japan Corporation All rights reserved.Platform Engineeringとは?• 具体的には例えばどういうこと?• 開発者が必要とする開発、実行環境を、セルフサービスで簡単に入手できる• 実行環境にデプロイしたら自動的に運用ポリシーが適用されるようにする• アプリケーションのビルドと同時に一定品質以上のチューニング設定をおこなうツールが利用できる• IDPを使うためのドキュメント群が整備されている• 専任チームによるサポートを受けられる• ...etc※ あくまで一例です。実際には組織ごとの具体的な課題に当てはまる取り組みが必要です
©︎2023 Yahoo Japan Corporation All rights reserved.パブリッククラウドとの違い• パブリッククラウドだけでは組織固有の課題や要件に応えるのは難しい• 例えば、組織固有のポリシーに準拠した権限をデフォルトで従業員に設定したくても、始めからそれが用意されているわけではない• 権限を自動設定する機能が提供されることはありうるが、それを使って自組織に適用するのはユーザーの責任パブリッククラウドの機能群IDPプラットフォームチーム開発者使用提供使用
©︎2023 Yahoo Japan Corporation All rights reserved.CloudNativeとPlatform Engineering• CloudNativeなテクノロジー群はIDPを実現するためのパーツとして重要な役割を担う• Kubernetesを中心とした様々なミドルウェアと強固なOSSエコシステムhttps://landscape.cncf.io/card-mode?project=graduatedCNCF Graduated Projects
©︎2023 Yahoo Japan Corporation All rights reserved.CloudNativeとPlatform Engineering• とりわけKubernetesは、組織固有の要件を実装するためのベースとして活躍1. 様々なワークロードを安定的に動かすための基本機能• セルフヒーリング、ローリングアップデート、スケーラビリティ...2. 使いやすく整備された拡張ポイント• カスタムコントローラー、Admission Webhook...3. API Servicerを中心とした一貫性のある使用感• kubectlでKRM(Kubernetes Resource Model)リソースを操作する、という一貫した体験
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesの拡張ポイント• Kubernetesには、機能拡張されること想定して多数の拡張ポイントが設けられている• カスタムコントローラー• Aggregation Layer• Admission / Mutating Webhook• Authentication / Authorization Webhook• Scheduler• Device Plugin• Network Plugin
©︎2023 Yahoo Japan Corporation All rights reserved.本セッションで話すこと• Kubernetesには、機能拡張されること想定して多数の拡張ポイントが設けられている• カスタムコントローラー• Aggregation Layer• Admission / Mutating Webhook• Authentication / Authorization Webhook• Scheduler• Device Plugin• Network Pluginこれについて話します
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• Deploymentを適用するといい感じにPod(とコンテナ)が起動するAPIServerWorker NodePodWorker NodePod> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• コントローラー群がそれぞれ仕事を果たした結果Podが起動するAPIServerWorker NodeWorker Node{ } Deploymentetcd> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• コントローラー群がそれぞれ仕事を果たした結果Podが起動するAPIServerWorker NodeWorker Node{ } Deployment{ } ReplicaSetController ManagerDeploymentControlleretcd> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• コントローラー群がそれぞれ仕事を果たした結果Podが起動するAPIServerWorker NodeWorker Node{ } Deployment{ } ReplicaSet{ } PodController ManagerDeploymentControllerReplicaSetControlleretcd> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• コントローラー群がそれぞれ仕事を果たした結果Podが起動するAPIServerWorker NodeWorker Node{ } Deployment{ } ReplicaSet{ } PodController ManagerDeploymentControllerReplicaSetControllerkube-scheduleretcd> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Kubernetesのコントローラーパターン• コントローラー群がそれぞれ仕事を果たした結果Podが起動するAPIServerWorker NodekkubeletPodcreate / editWorker NodekkubeletPodcreate / edit{ } Deployment{ } ReplicaSet{ } PodController ManagerDeploymentControllerReplicaSetControllerkube-schedulerwatchetcd> kubectl applyDeployment
©︎2023 Yahoo Japan Corporation All rights reserved.Reconciliation Loopの基本1. 指定された「望ましい状態(Desired State)」を取得する2. 「実際の状態(Actual State)」を観測する3. 「実際の状態」を「望ましい状態」に一致するように変更する4. 1〜3 を繰り返すControllerreadread & writeDesiredStateExternal World(Actual State)(1) (2), (3)(4)Modifies
©︎2023 Yahoo Japan Corporation All rights reserved.KubernetesにおけるReconciliation Loop• 「望ましい状態」をKubernetesリソースとして記述し、API Serverで管理する• API Serverに保存したり、CRUD操作を行ったりする• 「実際の状態」は何でもよい。例えば:• 所定の内容のKubernetesリソースがAPI Serverにあること• 所定の状態でPodが起動していること• 外部システムに所定の設定が行われていること
©︎2023 Yahoo Japan Corporation All rights reserved.Reconciliation Loopに着目したKubernetesのアーキテクチャ• コントローラー群がそれぞれ仕事を果たした結果Podが起動するDeployment Controllerreadread & writeModifiesAPIServeretcdReplicaSet Controllerkube schedulerkubeletkubeletkubelet{ } Deployment{ } ReplicaSet{ } PodPod
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラーによるKubernetesの拡張• カスタムコントローラー:• Reconciliation Loopを新たに実装することで、元々備わっていない機能をKubernetesに追加するもの• CRD (Custom Resource Definition) と カスタムコントローラーによって実現Hoge ControllerModifiesAPIServeretcdFuga Controller{ } Hoge{ } FugaExternal World(Actual State)
©︎2023 Yahoo Japan Corporation All rights reserved.Hoge ControllerModifiesAPIServeretcdFuga Controller{ } Hoge{ } FugaExternal World(Actual State)カスタムコントローラーによるKubernetesの拡張• CRD (Custom Resource Definition):• カスタムリソースのフォーマットを定義するKubernetesリソース• CRDをKubernetesに適用すると、カスタムリソースをAPI Serverで管理できるようになる独自フォーマットのmanifestを操作できるようになる
©︎2023 Yahoo Japan Corporation All rights reserved.Hoge ControllerModifiesAPIServeretcdFuga Controller{ } Hoge{ } FugaExternal World(Actual State)カスタムコントローラーによるKubernetesの拡張• カスタムコントローラー• 新たに実装したコントローラー• Go言語でcontroller-runtimeというフレームワークを使って実装するのが基本• 多くの場合Kubernetesクラスター内にデプロイして動かす新たに実装したコントローラー
©︎2023 Yahoo Japan Corporation All rights reserved.本セクションで話すこと• ヤフーではカスタムコントローラーを活用して、弊社固有の要件に応えたり、高い開発者体験を実現するプラットフォームを構築しています• このセクションではその一部を紹介します
©︎2023 Yahoo Japan Corporation All rights reserved.ヤフーでの実践例 – Kubernetesベースのアプリケーション実行環境• セルフサービスで利用開始• 開発者がGUIでNamespaceを作成すると、アクセス権が自動設定され安全に利用可能になる• 少ない手間でWebアプリケーションを実行• アプリをデプロイするとURLが自動的に払い出され、すぐにアクセス可能になる• アプリにクライアント証明書が自動注入され、Secret管理の必要なく他システムにアクセスできる• マルチテナント & スケーラブル• ヤフーの多数のサービスを少数のクラスターで実行他にも色々ありますが一部ご紹介します > <
©︎2023 Yahoo Japan Corporation All rights reserved.ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• セルフサービスのNamespace払い出しと権限設定• GUIからNamespaceを作成• 自分が属さないプロジェクトのNamespaceに対しては操作できない# 関係ないNamespaceに対する操作(CLIのコンテキストは設定しておく)$ sapctl –n another-project get appError from server (Forbidden): apps.fleet.zlab.co.jp is forbidden: User ”hhiros...Super Awesome Private Cloud Console my-projectNamespace新規作成Namespace名:
©︎2023 Yahoo Japan Corporation All rights reserved.ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• アプリのデプロイからアクセスまで• 簡単なコマンドまたはカスタムリソースからアプリをデプロイ• アプリが起動すると自動的にURLが払い出され、すぐにアクセス可能$ sapctl create app hello-world--image=example-registry/sample/helloworld-go:latest--port=8080$ sapctl get app hello-worldNAME ENDPOINT READY REASON AGEhello-world https://hello-world.sandbox.app.dev.yahoo.co.jp True 6m4s$ curl https://hello-world.sandbox.app.dev.yahoo.co.jpHello World!
©︎2023 Yahoo Japan Corporation All rights reserved.ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• カスタムコントローラーによる自動権限設定の仕組みNamespaceAPICIAPIServerGit{ } NamespaceetcdKubernetesクラスターNamespaceNamespace作成操作Namespaceをクラスターに作成開発者
©︎2023 Yahoo Japan Corporation All rights reserved.権限管理システム (Athenz)ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• カスタムコントローラーによる自動権限設定の仕組みNamespaceAPICIAPIServerGit{ } Namespace{ } AthenzPolicyClaimAthenz Policy Operatorns-controllerpolicy-controlleretcdKubernetesクラスターAthenz PolicyNamespaceNamespace作成操作Namespaceをクラスターに作成開発者権限情報の登録
©︎2023 Yahoo Japan Corporation All rights reserved.権限管理システム (Athenz)ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• カスタムコントローラーによる自動権限設定の仕組みNamespaceAPICIAPIServerGit{ } Namespace{ } AthenzPolicyClaimAthenz Policy Operatorns-controllerpolicy-controlleretcdKubernetesクラスターAthenz PolicyNamespaceNamespace作成操作Namespaceをクラスターに作成Namespace内のリソースに対する操作開発者権限情報の登録権限のチェック
©︎2023 Yahoo Japan Corporation All rights reserved.ヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• アプリケーションデプロイ時のエンドポイント自動設定の仕組み{ } AppetcdAPIServerアプリをデプロイ開発者App
©︎2023 Yahoo Japan Corporation All rights reserved.Appヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• アプリケーションデプロイ時のエンドポイント自動設定の仕組みDNS Server{ } App{ } AppBindingapp operatorapp-controllerab-controlleretcd{ } DNSRegistrationRequest drr-controllerAPIServerアプリをデプロイDNSレコードの登録開発者
©︎2023 Yahoo Japan Corporation All rights reserved.Appヤフーでの実践例 - Kubernetesベースのアプリケーション実行環境• アプリケーションデプロイ時のエンドポイント自動設定の仕組みDNS Server{ } App{ } AppBindingapp operatorapp-controllerab-controlleretcdIngressController{ } DNSRegistrationRequestPodPodPoddrr-controllerAPIServerアプリをデプロイDNSレコードの登録開発者アプリのユーザー名前解決リクエスト
©︎2023 Yahoo Japan Corporation All rights reserved.その他の取り組み• マルチテナント & スケーラビリティ• 複数のKubernetesクラスターを組み合わせた、超大規模なアプリ実行基盤の実現• 複数のKubernetesクラスターを束ねるメタクラスターを設け、メタクラスターにアプリの起動を指示すると、適切なクラスター上でアプリが立ち上がる仕組みアプリをデプロイ適切なクラスターでアプリを起動アプリにアクセスコントローラー開発者 エンドユーザーApp
©︎2023 Yahoo Japan Corporation All rights reserved.コントローラーその他の取り組み• アプリケーション・アイデンティティの自動設定• アプリケーションを一意に識別可能なクライアント証明書をPodに自動注入し、さらにAthenz上にそれに対応するアプリケーションアカウントを作成• KubernetesのSecretを使わずに外部システムへの認証情報が自動設定される※ https://github.com/AthenZ/athenz/blob/master/docs/copper_argos.mdAPIServerPodZZZシステム証明書の注入アプリケーションアカウントを登録クライアント証明書と共に外部システムにリクエスト認証・認可✓ XXXクラスターのYYYアプリのアクセスを許可アプリへのアクセス権を設定ZZZシステム管理者開発者アプリをデプロイApp
©︎2023 Yahoo Japan Corporation All rights reserved.このセクションで話すこと• ここではカスタムコントローラー開発をおこなう際の、設計の考え方やプロジェクトの進め方について話します• 実装作業の観点ではcontroller-runtimeと呼ばれるフレームワークがデファクトになっていて、これを使いこなす必要があります。これについてはすでに良質な資料があるのでそちらを参考にしてください(本スライドの最後に参考文献を掲載してあります)
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラー開発の進め方• カスタムコントローラー開発の全体の流れコントローラーとカスタムリソースの構成を決めるカスタムリソースの仕様を決めるコントローラー毎に詳しい挙動を決める設計コントローラーの実装・テストリリースコントローラーをひとつずつ実装・テスト・リリースしていく設計へのフィードバック
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラーの設計の進め方• コントローラーとカスタムリソースの構成を決める• 作りたい機能を実現できるようにコントローラーとカスタムリソースを作る単位を決めていく• 下のような図を書きながら試行錯誤{ } Namespace{ } AthenzPolicyClaimAthenz Policy Operatorns-controllerpolicy-controlleretcd• ひとつのコントローラーに機能を詰め込みすぎないように注意External World(Actual State)
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラーの設計の進め方• カスタムリソースの仕様を決める• 実際にmanifest(yamlファイル)を書きながらフィールド構成を考えていく• specとstatusがある。statusはコントローラーからリソースに対するActualStateの状態などを記録するのに利用できる$ kubectl get athenzpolicyclaimNAMESPACE NAME SYNCHRONIZEDmy-project-test my-project-test-claim True• kubectl get したときに表示する項目もいい感じにしておくと運用時に便利kind: AthenzPolicyClaimspec:policySetVersion: user-namespace-template-1_1_0status:synchronized: True
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラーの設計の進め方• コントローラー毎に詳しい挙動を整理する• ns-controllerの動作イベント コントローラーの動作Namespaceリソースが新規作成された 子のAthenzPolicyClaimリソースを作成するxxxフィールド、yyyフィールドの値は…Namespaceリソースのxxxが変更された 子のAthnezPolicyClaimのxxxをNamespaceに合わせて変更するNamespaceリソースが削除された 子のAthenzPolicyClaimを削除するAthenzPolicyClaimリソースが削除された AthenzPolicyClaimリソースを再作成するAthenzPolicyClaimリソースが変更された 親のNamespaceリソースの内容に合わせてAthenzPolicyClaimリソースを元に戻す• policy-controllerの動作イベント コントローラーの動作... ...
©︎2023 Yahoo Japan Corporation All rights reserved.カスタムコントローラーの設計の進め方• コントローラーの挙動を決めるときのコツ• Actual Stateに変更があったときの動作も忘れない• 各表(前ページ)が大きくなり過ぎるようなら、コントローラーの役割が多すぎないか見直す• 前ページの各表はそのままテストケースにもなる{ } Namespace{ } AthenzPolicyClaimAthenz Policy Operatorns-controllerpolicy-controlleretcdExternal World(Actual State)ここが変更されたらpolicy-controllerがもとに戻す
©︎2023 Yahoo Japan Corporation All rights reserved.コントローラーの実装• 1つのバイナリに複数のコントローラーが含まれることがほとんど• コントローラーを1つずつ実装していく• それぞれのコントローラーは互いに独立したReconciliation Loopを担当するので、別々に実装を進められる• Athenz Policy Operatorの例では、policy-controllerができ上がった時点で、権限情報をmanifestで管理できるようになる{ } AthenzPolicyClaimAthenz Policy Operatorpolicy-controlleretcdExternal World(Actual State)権限の管理をmanifestでできるようになった!カスタムリソースを直接適用APIServer
©︎2023 Yahoo Japan Corporation All rights reserved.コントローラー単位で開発を進めるメリット• コントローラー単位で開発すると、小さな独立した単位で漸進的に開発を進めていける• 意味のある小さな単位でリリースして、早めにフィードバックを得られる• 複数チームで分担できる• スクラムチームの動き方にうまくはまる※ MVP - not “bike to car” (https://www.linkedin.com/pulse/mvp-bike-car-fred-voorhorst/)
©︎2023 Yahoo Japan Corporation All rights reserved.ここまでのまとめ• カスタムコントローラー開発の全体の流れコントローラーとカスタムリソースの構成を決めるカスタムリソースの仕様を決めるコントローラー毎に詳しい挙動を決める設計コントローラーの実装・テストリリースコントローラーをひとつずつ実装・テスト・リリースしていく設計へのフィードバック
©︎2023 Yahoo Japan Corporation All rights reserved.おわりに• 開発者の生産性と開発体験を高めるための “Platform Engineering” が注目されている• KubernetesはInternal Developer Platform構築のための重要パーツ• Kubernetesをカスタムコントローラーで拡張することで、高度な要件を実現するIDPが構築できる• カスタムコントローラー開発やっていきましょう!
©︎2023 Yahoo Japan Corporation All rights reserved.宣伝• サイバーエージェントさん主催のイベントにて、本日紹介したアプリケーション実行基盤についての発表があります。今日よりもっと詳しい話が気になる方は、ぜひご参加ください!「CA.infra #1 - Kubernetes as a Service」・ 2023/03/02(木) 19:00〜 オンライン開催・ https://cyberagent.connpass.com/event/272843/
©︎2023 Yahoo Japan Corporation All rights reserved.
©︎2023 Yahoo Japan Corporation All rights reserved.参考文献 – Platform Engineeringについて• What is platform engineering? (Platform Engineering Org)• https://platformengineering.org/blog/what-is-platform-engineering• What Is Platform Engineering? (Gartner)• https://www.gartner.com/en/articles/what-is-platform-engineering• From Kubernetes to PaaS to … Err, What’s Next? - Daniel Bryant, Ambassador Labs• https://www.youtube.com/watch?v=btUYeOa7JPI• 役に立つプラットフォームを作ろう– プラットフォームエンジニアが知っておくべき「プロダクト」の考え方• https://speakerdeck.com/jacopen/yi-nili-tupuratutohuomuwozuo-rou-puratutohuomuenziniagazhi-tuteokubeki-purodakuto-falsekao-efang• 世界に誇れるプラットフォームチームをつくる• https://speakerdeck.com/jacopen/shi-jie-nikua-rerupuratutohuomutimuwotukuru
©︎2023 Yahoo Japan Corporation All rights reserved.参考文献 – カスタムコントローラーの開発について• The Kubebuilder Book• https://book.kubebuilder.io/• つくって学ぶKubebuilder• https://zoetrope.github.io/kubebuilder-training/• Kubernetesオペレータのアンチパターン & ベストプラクティス• https://speakerdeck.com/zoetrope/kubernetesoperetafalseantipatan-besutopurakuteisu