Slide 1

Slide 1 text

Crossplane導入で拓く Kubernetesプラットフォーム開発の 新たな可能性 パナソニックコネクト株式会社 中島 悠里花(Yurika Nakajima) 2025.11.19

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 ©️ Panasonic Connect Co., Ltd. 2025 □話すこと • Crossplaneで、プラットフォーム開発におけるインフラ管理を どう変えられるか □話さないこと • Crossplaneの細かい仕様 • KubeCon+CloudNativeCon NA 2025のセッション • KubeCon + CloudNativeCon North America 2025: Crossplane - The Cloud Native Framework... 今日お話しすること

Slide 4

Slide 4 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 ©️ Panasonic Connect Co., Ltd. 2025 ソフトウェアベース事業 持続的な成長につながる 成長事業に経営資源を集中投下 ハードウェアベース事業 継続的に「収益を稼げる事業」に集中し 徹底したハードウェア専鋭化を図る パナソニック コネクトの事業戦略 事業の特性に合わせ、異なる成長戦略を描く

Slide 7

Slide 7 text

7 ©️ Panasonic Connect Co., Ltd. 2025 活用事例 物流現場向けのサービスをリリース ロボット制御プラットフォーム システム連携サービス

Slide 8

Slide 8 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

10 ©️ Panasonic Connect Co., Ltd. 2025 プラットフォームの提供価値 プロダクトチームがビジネス価値の創出に専念できる プロダクトチーム ✓ ビジネスロジックを開発 プラットフォームチーム ✓ プロダクトチームに共通の リソースとランタイムを提供 SaaS A ランタイム AKS 共通Azureサービス 共通K8sエコシステム SaaS B SaaS C Azure

Slide 11

Slide 11 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 12

Slide 12 text

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でデプロイ

Slide 13

Slide 13 text

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" …

Slide 14

Slide 14 text

14 ©️ Panasonic Connect Co., Ltd. 2025 ランタイム数の推移 ランタイム数の急増によって、チームのタスクを圧迫 0 5 10 15 20 25 30 2025.11 2024.12 2024.06

Slide 15

Slide 15 text

15 ©️ Panasonic Connect Co., Ltd. 2025 おてあげ!

Slide 16

Slide 16 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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" …

Slide 22

Slide 22 text

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“ …

Slide 23

Slide 23 text

23 ©️ Panasonic Connect Co., Ltd. 2025 簡単になった!

Slide 24

Slide 24 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 25

Slide 25 text

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%

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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%

Slide 28

Slide 28 text

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"

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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 チャンネルがおすすめ

Slide 31

Slide 31 text

1. 組織について 2. プラットフォームのコンセプト 3. Crossplane導入前の状況 4. Crossplaneでできたこと 5. 直面したカベ 6. まとめ Agenda

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

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.

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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%

Slide 38

Slide 38 text

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から の管理 インフラの自動化と管理

Slide 39

Slide 39 text

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