ストーリー
田
田中VPoE
サーベイで「KubernetesのマニフェストがYAML地獄」という声が多かった。開発者がKubernetesの詳細を知らなくても、安全にサービスをデプロイできる抽象化レイヤーを作ろう
あなた
開発者はDeployment、Service、Ingress、HPA、PDB、NetworkPolicy…全部書いているんですか?
あ
田
田中VPoE
そうだ。1つのマイクロサービスをデプロイするのに、6-8個のYAMLファイルが必要で、合計500行を超える。しかもチームごとに書き方がバラバラ。セキュリティ設定の漏れやベストプラクティスからの逸脱が頻発している
あなた
開発者は「アプリをデプロイしたい」だけなのに、インフラの知識が大量に必要になっている。まさに認知負荷の問題ですね
あ
田
田中VPoE
それを解決するのが「プラットフォーム抽象化」だ。開発者が指定するのは「何をデプロイしたいか」だけ。「どうデプロイするか」はプラットフォームが決める
抽象化のアプローチ
抽象化レベルの比較
| アプローチ | 抽象化レベル | メリット | デメリット |
|---|
| 生のKubernetes YAML | なし | 完全なコントロール | 認知負荷が高い |
| Helmチャート | 低 | パラメータ化、再利用性 | テンプレートが複雑化しやすい |
| Kustomize | 低 | ベースの上書き、パッチ | 大規模では管理が煩雑 |
| CRD + Operator | 中 | Kubernetesネイティブ | 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 Request | CPU Limit | Memory Request | Memory Limit | 想定ワークロード |
|---|
| small | 100m | 500m | 128Mi | 512Mi | 軽量API、バッチ処理 |
| medium | 250m | 1000m | 256Mi | 1Gi | 標準的なAPIサービス |
| large | 500m | 2000m | 512Mi | 2Gi | 高負荷API、データ処理 |
| xlarge | 1000m | 4000m | 1Gi | 4Gi | 特殊ワークロード(要承認) |
自動適用されるベストプラクティス
| 設定 | 内容 | 理由 |
|---|
| securityContext.runAsNonRoot | true | 特権コンテナの防止 |
| securityContext.readOnlyRootFilesystem | true | ファイルシステム改ざん防止 |
| resources.requests = resources.limits | CPU以外 | QoSクラスの保証 |
| topologySpreadConstraints | ゾーン分散 | 高可用性 |
| terminationGracePeriodSeconds | 30 | グレースフルシャットダウン |
| podDisruptionBudget | maxUnavailable: 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 Sizing | small/medium/large/xlargeでリソースを簡易指定 |
| 自動適用 | セキュリティ、ネットワーク、監視の設定を自動生成 |
| マルチ環境 | 環境ごとの差分をプラットフォームが自動調整 |
チェックリスト
次のステップへ
次は「GitOpsによるデリバリー自動化」を学びます。Gitをシングルソースオブトゥルースとしたデプロイフローを設計しましょう。
推定読了時間: 30分