Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crossplane導入で拓くKubernetesプラットフォーム開発の新たな可能性

 Crossplane導入で拓くKubernetesプラットフォーム開発の新たな可能性

CloudNative Days Winter 2025の登壇資料です。
https://event.cloudnativedays.jp/cndw2025/proposals/950

---
プラットフォーム開発に携わる皆さん、インフラ管理の自動化に限界を感じていませんか?

弊社では、Kubernetesでのプラットフォーム開発を進めるも、Golden Pathの提供を目指す中での障壁が多くありました。
そんな中、Kubernetesと連携して、インフラ管理を飛躍させるCrossplaneに出会いました。
本セッションでは、Crossplaneの導入前の課題から導入後に直面した課題まで、リアルな体験をお話しします。

コントロールプレーンへの過剰な負荷など、一筋縄ではいかないCrossplaneとの格闘の日々。
しかし、その先には今までにない新たな可能性が広がっており、Golden Pathの完成に向けた道筋が見えてきました。

本セッションを通して、Crossplaneを導入されていない方には導入のきっかけに、すでに導入されている方には悩みや喜びが共有できれば幸いです。
また、プラットフォームを利用する全ての方々に、水面下で進むプラットフォーム開発の努力を知っていただける機会となれば嬉しいです。
一緒にCrossplaneの輪を広げましょう!

Avatar for Yurika Nakajima

Yurika Nakajima

November 19, 2025
Tweet

Other Decks in Technology

Transcript

  1. 2 ©️ Panasonic Connect Co., Ltd. 2025 自己紹介 ◼ 名前

    • 中島 悠里花(Yurika Nakajima) ◼ 所属組織 • パナソニックコネクト株式会社 クラウドエンジニアリングセンター ◼ 経歴 • 2019.04 パナソニック株式会社 入社 • 2023.10~ 現職 ◼ 現在の業務 • リカーリングビジネスの強化のためのSaaSプラットフォームの構築 ◼ 住んでいるところ • 大阪府
  2. 3 ©️ Panasonic Connect Co., Ltd. 2025 □話すこと • Crossplaneで、プラットフォーム開発におけるインフラ管理を

    どう変えられるか □話さないこと • Crossplaneの細かい仕様 • KubeCon+CloudNativeCon NA 2025のセッション • KubeCon + CloudNativeCon North America 2025: Crossplane - The Cloud Native Framework... 今日お話しすること
  3. 5 ©️ Panasonic Connect Co., Ltd. 2025 パナソニック コネクト株式会社 パナソニックハウジングソリューションズ株式会社

    パナソニックエンターテインメント&コミュニケーション株式会社 パナソニックオートモーティブシステムズ株式会社 パナソニック インダストリー株式会社 パナソニックエナジー株式会社 パナソニックオペレーショナルエクセレンス株式会社 パナソニック ホールディングス株式会社 パナソニック株式会社 会社概要 パナソニック コネクト株式会社 Panasonic Connect Co., Ltd. サプライチェーン, 公共サービス, 生活インフラ, エンターテインメント分野向け機器・ ソフトウェアの開発/製造/販売/ プロフェッショナルサービスの提供 従業員数:約27,533名(2024年4月1日現在) 売上高:1兆2,028億円(2023年度) https://connect.panasonic.com グループ体制
  4. 6 ©️ Panasonic Connect Co., Ltd. 2025 ソフトウェアベース事業 持続的な成長につながる 成長事業に経営資源を集中投下

    ハードウェアベース事業 継続的に「収益を稼げる事業」に集中し 徹底したハードウェア専鋭化を図る パナソニック コネクトの事業戦略 事業の特性に合わせ、異なる成長戦略を描く
  5. 9 ©️ Panasonic Connect Co., Ltd. 2025 SaaS A ランタイム

    私たちの提供するプラットフォーム AzureとKubernetesを使ったマルチテナント型のプラットフォームを提供 AKS 共通Azureサービス 共通K8sエコシステム SaaS B ✓ テナント固有のリソースを提供 ✓ 同一クラスターに複数のSaaSアプリをデプロイ ✓ SaaSアプリは”ランタイム”(標準リソースのセット) 上に作成 ✓ テナント分離のためのKubernetesリソース ✓ DB等のAzureマネージドリソース ✓ テナント間で共通のリソースを提供 ✓ Kubernetesリソース(Argo CD, Gatekeeperな ど) ✓ Azureリソース(AKS, Front Door, WAFなど) SaaS C Azure
  6. 10 ©️ Panasonic Connect Co., Ltd. 2025 プラットフォームの提供価値 プロダクトチームがビジネス価値の創出に専念できる プロダクトチーム

    ✓ ビジネスロジックを開発 プラットフォームチーム ✓ プロダクトチームに共通の リソースとランタイムを提供 SaaS A ランタイム AKS 共通Azureサービス 共通K8sエコシステム SaaS B SaaS C Azure
  7. 12 ©️ Panasonic Connect Co., Ltd. 2025 これまでのランタイム作成・更新のながれ 1 Bicepのパラメーター入力

    2 Bicepのデプロイメント実行 3 Helmチャートのパラメーター入力 4 GitHubにプッシュ using './bicep/main_tenant.bicep’ param workspaceName = 'dummy-workspace' param runtimeName = 'dev' … $ az deployment sub create … workspace: name: "dummy-workspace" runtime: name: “dev" managementId: clientId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" tenantId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" … IaCファイル サポート リクエスト プロダクト 設計 IaC化 デプロイ プロダクト チーム プラットフォー ムチーム • Azureリソースは bicep(Azureが提供するIaC)でデプロイ • Kubernetesリソースは Helm Chartでデプロイ
  8. 13 ©️ Panasonic Connect Co., Ltd. 2025 どんな問題が起きたか 手作業が多く、ヒューマンエラーが多発 1.

    2か所に同じパラメーターを入力する → 変更がもれる 2. コマンドを実行して、設定を反映する → 実行忘れで、コードと実体が食い違う 3. たくさんあるリソースIDをコピー&ペースト → 誤ったIDをペーストする 1 Bicepのパラメーター入力 2 Bicepのデプロイメント実行 3 Helmチャートのパラメーター入力 4 GitHubにプッシュ using './bicep/main_tenant.bicep’ param workspaceName = 'dummy-workspace' param runtimeName = 'dev' … $ az deployment sub create … workspace: name: "dummy-workspace" runtime: name: “dev" managementId: clientId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" tenantId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" …
  9. 17 ©️ Panasonic Connect Co., Ltd. 2025 Crossplane とは Kubernetes以外のリソースを、Kubernetesのリソースとして扱えるようにする

    Providers | Upbound Marketplace … apiVersion: storage.azure.upbound.io/v1beta1 kind: Account metadata: annotations: meta.upbound.io/example-id: storage/v1beta1/datalakegen2path labels: testing.upbound.io/example-name: example name: dlgpexample spec: forProvider: accountKind: StorageV2 accountReplicationType: LRS accountTier: Standard isHnsEnabled: true location: West Europe resourceGroupNameSelector: matchLabels: testing.upbound.io/example-name: example 例:Storage account Announcing Crossplane’s CNCF Graduation
  10. 18 ©️ Panasonic Connect Co., Ltd. 2025 Composition 種類の異なるリソースをセットとして定義して抽象化できる。 さらに、それらのリソース間で情報を伝搬させることができる。

    Composite Resources · Crossplane v2.1 Resource Description 1 Composite Resource Definition (XRD) 複合リソースのManifestの 定義。CRDのようなもの 2 Composition XRDが作成されたときに実 行されるパイプラインの定 義。パイプラインは定期的 に実行され、reconciliationが 働く 3 Composite Resource (XR) XRDの定義に従い作成する リソース 4 Composed Resource XRを作成したことで作成さ れるリソース群 Composite Resource Definition (XRD) Composition Composite Resource (XR) Composed Resource A Composed Resource B Composed Resource C 1 2 3 4 4 4
  11. 19 ©️ Panasonic Connect Co., Ltd. 2025 Composition apiVersion: managedidentity.azure.m.upbound.io/v1beta1

    kind: UserAssignedIdentity metadata: name: id-xsa-sample-saas-microservices namespace: sample spec: … status: atProvider: clientId: 0057f12d-9ee5-4c1b-b0fb-1036b99a91fa id: /subscriptions/… location: japaneast name: id-xsa-sample-saas-microservices apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: 0057f12d-9ee5-4c1b-b0fb-1036b99a91fa labels: azure.workload.identity/use: "true" name: saas-microservices namespace: sample apiVersion: sample.net/v1 kind: XServiceAccount metadata: name: sample namespace: sample spec: userAssignedIdentity: location: "Japan east“ serviceAccount: name: saas-microservices Composite Resource (XR) Composed Resource annotations: azure.workload.identity/client-id: 0057f12d-9ee5-4c1b-b0fb-1036b99a91fa
  12. 20 ©️ Panasonic Connect Co., Ltd. 2025 Compositionのマニフェスト input: apiVersion:

    gotemplating.fn.crossplane.io/v1beta1 kind: GoTemplate source: Inline inline: template: | {{ $userAssignedIdentityName := "user-assigned-identity" }} apiVersion: managedidentity.azure.m.upbound.io/v1beta1 kind: UserAssignedIdentity … --- {{ $userAssignedIdentity := getComposedResource . $userAssignedIdentityName }} apiVersion: v1 kind: ServiceAccount metadata: name: sample namespace: sample labels: azure.workload.identity/use: "true" annotations: {{ setResourceNameAnnotation "service-account" }} azure.workload.identity/client-id: "{{ get $userAssignedIdentity.status.atProvider "clientId" }}"}}" gotemplating.fn.crossplane.io/ready: "True" apiVersion: apiextensions.crossplane.io/v1 kind: Composition metadata: name: xserviceaccount spec: compositeTypeRef: apiVersion: sample.net/v1 kind: XServiceAccount mode: Pipeline pipeline: - step: create-a-constraint functionRef: name: function-go-templating
  13. 21 ©️ Panasonic Connect Co., Ltd. 2025 再掲:どんな問題が起きたか 手作業が多く、ヒューマンエラーが多発 1.

    2か所に同じパラメーターを入力する → 変更がもれる 2. コマンドを実行して、設定を反映する → 実行忘れで、コードと実体が食い違う 3. たくさんあるリソースIDをコピー&ペースト → 誤ったIDをペーストする 1 Bicepのパラメーター入力 2 Bicepのデプロイメント実行 3 Helmチャートのパラメーター入力 4 GitHubにプッシュ using './bicep/main_tenant.bicep’ param workspaceName = 'dummy-workspace' param runtimeName = 'dev' … $ az deployment sub create … workspace: name: "dummy-workspace" runtime: name: “dev" managementId: clientId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" tenantId: "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" …
  14. 22 ©️ Panasonic Connect Co., Ltd. 2025 1. 2か所に同じパラメーターを入力する →

    ひとつのファイルに統一 2. コマンドを実行して、設定を反映する → すべてのリソースがGitと同期できる 3. たくさんあるリソースIDをコピー&ペースト → パラメーターは自動的に伝搬される Crossplane でできたこと すべてのリソースを宣言的に管理できた 1. 2か所に同じパラメーターを入力する → 2. コマンドを実行して、設定を反映する → 3. たくさんあるリソースIDをコピー&ペースト → 1 Helmチャートのパラメーター入力 2 GitHubにプッシュ workspace: name: "dummy-workspace" runtime: name: “dev“ …
  15. 25 ©️ Panasonic Connect Co., Ltd. 2025 kube-apiserver への過剰な負荷 Crossplane未インストールと比較すると、負荷が高い

    API Server CPU Usage Percentage (Average) API Server Memory Usage Percentage (Average) 6% 0% 18% 0% Crossplane インストール Crossplane 未インストール Crossplane インストール Crossplane 未インストール 6% 1%
  16. 26 ©️ Panasonic Connect Co., Ltd. 2025 パフォーマンス改善に向けた取り組み 不要なManaged Resourceの無効化が効果的

    1. Reconciliationのレート調整 1. ポーリングの間隔、同期の間隔を調整してみたものの、変化は見られなかった 2. デフォルト値が、一番調整された結果なのかも 2. 不要なManaged Resourceの無効化 1. Managed Resourceの例: accounts.storage.azure.m.upbound.io 2. デフォルトの設定では、大量のCRDが追加される 3. 使いたいCRDだけ追加することで、メモリ消費を抑制できる Disabling Unused Managed Resources · Crossplane v2.0 # デフォルト設定のとき $ kubectl get crd | grep -E "(azure¥.m¥.upbound¥.io|azure¥.upbound¥.io)" | wc -l 495 # 無効化したとき $ kubectl get crd | grep -E "(azure¥.m¥.upbound¥.io|azure¥.upbound¥.io)" | wc -l 36
  17. 27 ©️ Panasonic Connect Co., Ltd. 2025 パフォーマンス改善に向けた取り組み:結果 メモリ使用率が大きく改善 4.5%

    0% 10% 0% API Server CPU Usage Percentage (Average) API Server Memory Usage Percentage (Average) 6% 0% 18% 0% Crossplane インストール Crossplane 未インストール Crossplane インストール Crossplane 未インストール 6% 1% 6% 1%
  18. 28 ©️ Panasonic Connect Co., Ltd. 2025 「不要なManaged Resourceの無効化」注意点 Managed

    Resource は一度有効にすると無効にできない • Crossplaneをインストールするときは以下のパラメーターを追加して、デフォルトで無効 になるようにするのがオススメ $ helm install crossplane crossplane-stable/crossplane ¥ --namespace crossplane-system ¥ --create-namespace ¥ --set provider.defaultActivations={} • 使いたいリソースだけを有効化(ManagedResourceActivationPolicy を作る) apiVersion: apiextensions.crossplane.io/v1alpha1 kind: ManagedResourceActivationPolicy metadata: name: my-app-resources spec: activate: - "userassignedidentities.managedidentity.azure.m.upbound.io"
  19. 29 ©️ Panasonic Connect Co., Ltd. 2025 最新アップデート v2.1.0で、”XR circuit

    breaker”なるものが追加。 API Serverへの負荷抑制が期待できそう • XR circuit breaker: A circuit breaker was added to all Composite Resource (XR) controllers in #6777 to prevent reconciliation thrashing when controllers fight over composed resource state. This addresses a common cause of excessive resource (CPU) usage. • Each circuit breaker monitors reconciliation rates for their XR and opens ("breaks the circuit") when thresholds are exceeded (50 burst, 1 every 2s sustained). While open, it blocks most reconcile requests but allows one through every 30 seconds. The circuit stays open for 5 minutes, then automatically closes and returns to normal operation. If thrashing resumes, the circuit will open again. Release v2.1.0 · crossplane/crossplane • KubeCon+CloudNativeCon NA 2025でも取り上げられていた • KubeCon + CloudNativeCon North America 2025: Crossplane - The Cloud Native Framework... • デモリポジトリ:jbw976/demo-xp-circuit-breaker
  20. 30 ©️ Panasonic Connect Co., Ltd. 2025 最新情報へのアクセス v2.0のリリース以降、アップデートが活発に行われている 最新情報はGitHubのissueやSlackの確認がおすすめ

    • 公式ドキュメント • https://docs.crossplane.io/latest/ • GitHub • https://github.com/crossplane/crossplane • slack • https://slack.crossplane.io/ • 質問の投稿はまずは #general チャンネルがおすすめ
  21. 32 ©️ Panasonic Connect Co., Ltd. 2025 Next action セルフサービス化の推進

    • CrossplaneでほぼすべてをIaC化できたので、セルフサービス化に向けて大きく前進! • しかし、ユーザーの抽象的な要求を人の手でIaCのパラメータに変換する手間は残っている • ユーザーにゴールデンパスを提供し、デプロイまで自動化する仕組みを開発中 As-Is IaCファイル サポート リクエスト プロダクト 設計 IaC化 デプロイ プロダクト チーム プラットフォー ムチーム To-Be プロダクト 設計 ゴールデン パス選択 IaC化 デプロイ プロダクト チーム プログラム IaCファイル ゴールデンパス
  22. 33 ©️ Panasonic Connect Co., Ltd. 2025 Key takeaways •

    Crossplaneは、Kubernetes以外のリソースをKubernetesのリソースとし て扱えるようにすることで、Kubernetesが持つ強みをほかのリソースの 管理にも広げられる • CompositionがCrossplaneの真価を発揮させる • Crossplaneをインストールするときは、”provider.defaultActivations: []” を追加することでメモリ消費が抑制できる
  23. 35 ©️ Panasonic Connect Co., Ltd. 2025 Crossplane以外で作ったリソースを、Crossplaneの管理下に取り込む Managed Resources

    · Crossplane v2.0 apiVersion: operationalinsights.azure.m.upbound.io/v1beta1 kind: Workspace metadata: name: "log-workspace" namespace: sample spec: managementPolicies: - Observe forProvider: resourceGroupName: "rg-log" providerConfigRef: kind: ClusterProviderConfig name: azure-provisioning-wid-log Policy Description * Default policy. Crossplane has full control over a resource. Create If the external resource doesn’t exist, Crossplane creates it based on the managed resource settings. Delete Crossplane can delete the external resource when deleting the managed resource. LateInitialize Crossplane initializes some external resource settings not defined in the spec.forProvider of the managed resource. See the late initialization section for more details. Observe Crossplane only observes the resource and doesn’t make any changes. Used for observe only resources. Update Crossplane changes the external resource when changing the managed resource.
  24. 36 ©️ Panasonic Connect Co., Ltd. 2025 ラベルでリソースをフィルタリングする apiVersion: apiextensions.crossplane.io/v1

    kind: Composition metadata: name: xallowregistries spec: compositeTypeRef: apiVersion: sample.net/v1 kind: XAllowRegistries mode: Pipeline pipeline: - step: create-a-constraint functionRef: name: function-go-templating input: apiVersion: gotemplating.fn.crossplane.io/v1beta1 kind: GoTemplate source: Inline inline: template: | apiVersion: meta.gotemplating.fn.crossplane.io/v1alpha1 kind: ExtraResources requirements: acr: apiVersion: containerregistry.azure.m.upbound.io/v1beta1 kind: Registry {{- if .observed.composite.resource.spec.reference.containerRegistry.matchLabels }} matchLabels: {{- toYaml .observed.composite.resource.spec.reference.registry.matchLabels | nindent 6 }} {{- end }} --- apiVersion: constraints.gatekeeper.sh/v1beta1 kind: AllowRegistries metadata: name: "xarc-{{ .observed.composite.resource.metadata.name }}" annotations: {{ setResourceNameAnnotation "allow-registries-constraints" }} gotemplating.fn.crossplane.io/ready: "True" spec: match: {{- toYaml .observed.composite.resource.spec.allowRegistries.match | nindent 4 }} parameters: repos: {{- with .observed.composite.resource.spec.allowRegistries.parameters.repos }} {{- range . }} - {{ . }} {{- end }} {{- end }} {{- with .extraResources }} {{- $extraAcrs := index . "acr" }} {{- range $i, $extraAcr := $extraAcrs.items }} - {{ $extraAcr.resource.status.atProvider.loginServer }} {{- end }} {{- end }} Composition
  25. 37 ©️ Panasonic Connect Co., Ltd. 2025 kube-apiserverの負荷:SKU=Freeのとき API Server

    CPU Usage Percentage (Average) API Server Memory Usage Percentage (Average) API Server CPU Usage Percentage (Max) API Server Memory Usage Percentage (Max) 70% 20% 110% 20% 140% 140% 20% 20%
  26. 38 ©️ Panasonic Connect Co., Ltd. 2025 ツール比較 特徴/ツール Crossplane

    Azure Service Operator Terraform 概要 Kubernetes上でのリソース管理を 提供するオープンソースのツール AzureリソースをKubernetesから 管理するためのオペレーター インフラストラクチャをコードと して管理するためのツール 主な用途 マルチクラウド環境のリソース管 理 Azureリソースのデプロイと管理 インフラのプロビジョニングと管 理 プロビジョニングモデル Declarative(宣言的) Declarative(宣言的) Declarative(宣言的) 依存関係管理 可能(Compositionを使用) 可能(Kubernetesの依存関係を利 用) 可能(Terraformの依存関係解決 機能) クラウドプロバイダー マルチクラウド(AWS、GCP、 Azureなど) Azure専用 マルチクラウド(AWS、GCP、 Azureなど) Kubernetesとの統合 Kubernetesネイティブ Kubernetesネイティブ Kubernetesとの統合は可能だが、 主に独立して使用 状態管理 Kubernetesの状態管理を利用 Kubernetesの状態管理を利用 Terraformの状態ファイルを使用 コミュニティとサポート 活発なオープンソースコミュニ ティ Microsoftによるサポート 大規模なオープンソースコミュニ ティ 学習曲線 中程度(Kubernetesの知識が必 要) 低い(Azureに特化しているた め) 中程度(HCLの理解が必要) 使用例 マルチクラウド環境の統合管理 AzureリソースのKubernetesから の管理 インフラの自動化と管理
  27. 39 ©️ Panasonic Connect Co., Ltd. 2025 Namespace scopeに変える •

    2025年8月に、Crossplane v2がリリースされた。v2の大きなアップデートに、 namespace scopeのサポートがある • namespace scopeに変えたら、リソースの削除がハングアップするようになった • Azureリソースは消えているのに、Crossplane のリソースが消えないという状態 • Crossplane のリソースの状態を管理するリソースが、管理先のリソースよりも先に消え たことが原因。namespaceが”Terminating”になると、新しく作成できないため、処理が ハングアップしていた。 • 以下のIssueで議論されているエラーと、原因は同じ What’s New in v2? · Crossplane v2.0 ProviderConfigUsage does not work when deletion policy is set to Foreground · Issue #4661 · crossplane/crossplane Message: connect failed: cannot initialize the Terraform plugin SDK async external client: cannot get terraform setup: cannot track ProviderConfig usage: cannot apply ProviderConfigUsage: cannot create object: providerconfigusages.azure.m.upbound.io "abcdefgh-ijkl-mnop- qrst-uvwxyz012345" is forbidden: unable to create new content in namespace sample because it is being terminated