LESSON 30分

ストーリー

田中VPoE
サーベイで「KubernetesのマニフェストがYAML地獄」という声が多かった。開発者がKubernetesの詳細を知らなくても、安全にサービスをデプロイできる抽象化レイヤーを作ろう
あなた
開発者はDeployment、Service、Ingress、HPA、PDB、NetworkPolicy…全部書いているんですか?
田中VPoE
そうだ。1つのマイクロサービスをデプロイするのに、6-8個のYAMLファイルが必要で、合計500行を超える。しかもチームごとに書き方がバラバラ。セキュリティ設定の漏れやベストプラクティスからの逸脱が頻発している
あなた
開発者は「アプリをデプロイしたい」だけなのに、インフラの知識が大量に必要になっている。まさに認知負荷の問題ですね
田中VPoE
それを解決するのが「プラットフォーム抽象化」だ。開発者が指定するのは「何をデプロイしたいか」だけ。「どうデプロイするか」はプラットフォームが決める

抽象化のアプローチ

抽象化レベルの比較

アプローチ抽象化レベルメリットデメリット
生のKubernetes YAMLなし完全なコントロール認知負荷が高い
Helmチャートパラメータ化、再利用性テンプレートが複雑化しやすい
Kustomizeベースの上書き、パッチ大規模では管理が煩雑
CRD + OperatorKubernetesネイティブOperator開発コスト
OAM(Open Application Model)アプリケーション中心の抽象化エコシステムが発展途上
PaaS的抽象化最高開発者は設定ファイル1つカスタマイズ性の制限

推奨: アプリケーションCRDによる抽象化

# 開発者が書くもの: Application CRD(約30行)
apiVersion: platform.cloudops.io/v1
kind: Application
metadata:
  name: payment-service
  namespace: payment-team
spec:
  # アプリケーション情報
  image: registry.cloudops.io/payment-service
  port: 3000

  # スケーリング
  replicas:
    min: 2
    max: 10
    targetCPU: 70

  # リソース(T-shirt sizing)
  size: medium    # small | medium | large

  # 環境変数
  env:
    - name: DATABASE_URL
      secretRef: payment-db-credentials
    - name: REDIS_URL
      configMapRef: payment-redis-config

  # ヘルスチェック
  health:
    path: /health
    port: 3000

  # 公開設定
  ingress:
    host: payment.api.cloudops.io
    tls: true

  # 監視
  monitoring:
    enabled: true
    slo: 99.9

プラットフォームが自動生成するもの

Application CRD → プラットフォームが自動生成:

1. Deployment
   ├── リソースリクエスト/リミット(sizeから算出)
   ├── セキュリティコンテキスト(自動適用)
   ├── アンチアフィニティ(自動設定)
   └── プローブ設定(healthから生成)

2. Service
   ├── ClusterIP Service
   └── ポート設定

3. HorizontalPodAutoscaler
   ├── minReplicas / maxReplicas
   └── ターゲットCPU使用率

4. PodDisruptionBudget
   └── maxUnavailable: 1(自動設定)

5. Ingress / VirtualService
   ├── ホスト設定
   ├── TLS設定(cert-manager連携)
   └── レート制限

6. NetworkPolicy
   ├── デフォルトdeny
   └── 必要なポートのみ許可

7. ServiceMonitor(Prometheus)
   ├── メトリクスエンドポイント
   └── SLO設定

8. Datadogモニター
   ├── エラー率アラート
   ├── レイテンシアラート
   └── SLOトラッカー

T-shirt Sizingによるリソース抽象化

サイズ定義

サイズCPU RequestCPU LimitMemory RequestMemory Limit想定ワークロード
small100m500m128Mi512Mi軽量API、バッチ処理
medium250m1000m256Mi1Gi標準的なAPIサービス
large500m2000m512Mi2Gi高負荷API、データ処理
xlarge1000m4000m1Gi4Gi特殊ワークロード(要承認)

自動適用されるベストプラクティス

設定内容理由
securityContext.runAsNonRoottrue特権コンテナの防止
securityContext.readOnlyRootFilesystemtrueファイルシステム改ざん防止
resources.requests = resources.limitsCPU以外QoSクラスの保証
topologySpreadConstraintsゾーン分散高可用性
terminationGracePeriodSeconds30グレースフルシャットダウン
podDisruptionBudgetmaxUnavailable: 1ローリングアップデート時の可用性

「開発者に『SecurityContextを正しく設定してください』と言うのではなく、プラットフォームが自動で正しい設定を適用する。これがガードレールの考え方だ」 — 田中VPoE


マルチ環境管理

環境ごとの自動調整

環境ごとの差分管理:

development:
  replicas: { min: 1, max: 1 }
  size: small(強制ダウンサイズ)
  ingress: { host: payment.dev.cloudops.io }
  monitoring: { alerting: false }

staging:
  replicas: { min: 2, max: 5 }
  size: spec通り
  ingress: { host: payment.stg.cloudops.io }
  monitoring: { alerting: slack_only }

production:
  replicas: { min: 2, max: spec通り }
  size: spec通り
  ingress: { host: payment.api.cloudops.io }
  monitoring: { alerting: pagerduty + slack }
  pdb: { maxUnavailable: 1 }(強制適用)

まとめ

ポイント内容
抽象化のアプローチApplication CRDにより、500行→30行に削減
T-shirt Sizingsmall/medium/large/xlargeでリソースを簡易指定
自動適用セキュリティ、ネットワーク、監視の設定を自動生成
マルチ環境環境ごとの差分をプラットフォームが自動調整

チェックリスト

  • Kubernetes抽象化のアプローチを比較できる
  • Application CRDの設計パターンを理解した
  • T-shirt Sizingのリソース管理を説明できる
  • マルチ環境管理の自動調整パターンを理解した

次のステップへ

次は「GitOpsによるデリバリー自動化」を学びます。Gitをシングルソースオブトゥルースとしたデプロイフローを設計しましょう。


推定読了時間: 30分