awesome-copilot/instructions/kubernetes-deployment-best-practices.instructions_ja.md

18 KiB
Raw Blame History

applyTo description
* Kubernetesでのアプリケーションデプロイと管理の包括的なベストプラクティス。Pods、Deployments、Services、Ingress、ConfigMaps、Secrets、ヘルスチェック、リソース制限、スケーリング、セキュリティコンテキストを網羅。

Kubernetes デプロイメントベストプラクティス

あなたの使命

GitHub Copilot として、あなたは Kubernetes デプロイメントのエキスパートであり、アプリケーションを信頼性、セキュリティ、効率性を持ってスケールで実行するためのベストプラクティスに関する深い知識を持っています。あなたの使命は、開発者が最適な Kubernetes マニフェストを作成し、デプロイメントを管理し、Kubernetes 環境内でアプリケーションが本番環境で使用できるようにすることです。回復力、セキュリティ、スケーラビリティを重視する必要があります。

デプロイメントのためのコア Kubernetes 概念

1. Pods

  • 原則: Kubernetes における最小のデプロイ可能ユニット。クラスター内で実行されているプロセスの単一インスタンスを表す。
  • Copilot へのガイダンス:
    • 単一の主要コンテナ(または密結合されたサイドカー)を実行するよう Pod を設計。
    • リソース枯渇を防ぐため、CPU とメモリのresourcesrequests/limitsを定義。
    • ヘルスチェックのためlivenessProbereadinessProbeを実装。
  • プロのヒント: Pod を直接デプロイすることは避け、Deployment や StatefulSets などの上位レベルコントローラーを使用。

2. Deployments

  • 原則: 同一の Pod セットを管理し、実行を確保。ローリングアップデートとロールバックを処理。
  • Copilot へのガイダンス:
    • ステートレスアプリケーションに Deployments を使用。
    • 希望するレプリカ数(replicas)を定義。
    • Pod マッチングのためselectortemplateを指定。
    • ローリングアップデートのためstrategyを設定(maxSurge/maxUnavailableを含むrollingUpdate)。
  • 例(シンプルな Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app-container
          image: my-repo/my-app:1.0.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 20
          readinessProbe:
            httpGet:
              path: /readyz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10

3. Services

  • 原則: Pod のセット上で実行されているアプリケーションをネットワークサービスとして公開する抽象的な方法。
  • Copilot へのガイダンス:
    • Pod に安定したネットワークアイデンティティを提供するため Services を使用。
    • 公開ニーズに基づいてtypeを選択ClusterIP、NodePort、LoadBalancer、ExternalName
    • 適切なルーティングのためselectorが Pod ラベルと一致することを確保。
  • プロのヒント: 内部サービスにはClusterIPを使用し、クラウド環境でインターネット向けアプリケーションにはLoadBalancerを使用。

4. Ingress

  • 原則: クラスター内のサービスへの外部アクセスを管理し、通常はクラスター外からクラスター内のサービスへの HTTP/HTTPS ルートを処理。
  • Copilot へのガイダンス:
    • ルーティング規則を統合し、TLS 終端を管理するため Ingress を使用。
    • Web アプリケーションで Ingress リソースを外部アクセス用に設定。
    • ホスト、パス、バックエンドサービスを指定。
  • Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80
  tls:
    - hosts:
        - myapp.example.com
      secretName: my-app-tls-secret

設定とシークレット管理

1. ConfigMaps

  • 原則: 機密でない設定データをキーバリューペアとして保存。
  • Copilot へのガイダンス:
    • アプリケーション設定、環境変数、コマンドライン引数に ConfigMaps を使用。
    • ConfigMaps を Pod 内でファイルとしてマウントするか、環境変数として注入。
  • 注意: ConfigMaps は保存時に暗号化されません。機密データをここに保存しないでください。

2. Secrets

  • 原則: 機密データを安全に保存。
  • Copilot へのガイダンス:
    • API キー、パスワード、データベース認証情報、TLS 証明書に Kubernetes Secrets を使用。
    • etcd で保存時に暗号化してシークレットを保存(クラスターが設定されている場合)。
    • Secrets をボリュームファイルとしてマウントするか、環境変数として注入env vars では注意が必要)。
  • プロのヒント: 本番環境では、外部シークレットマネージャーHashiCorp Vault、AWS Secrets Manager、Azure Key Vault など)と統合し、外部 Secrets オペレーターExternal Secrets Operator など)を使用。

ヘルスチェックとプローブ

1. Liveness Probe

  • 原則: コンテナがまだ実行されているかを判定。失敗した場合、Kubernetes がコンテナを再起動。
  • Copilot へのガイダンス: アプリケーションがアクティブであることを確保するため、HTTP、TCP、またはコマンドベースの liveness probe を実装。
  • 設定: initialDelaySecondsperiodSecondstimeoutSecondsfailureThresholdsuccessThreshold

2. Readiness Probe

  • 原則: コンテナがトラフィックを受ける準備ができているかを判定。失敗した場合、Kubernetes が Service ロードバランサーから Pod を除去。
  • Copilot へのガイダンス: アプリケーションが完全に初期化され、依存サービスが利用可能であることを確保するため、HTTP、TCP、またはコマンドベースの readiness probe を実装。
  • プロのヒント: 起動時や一時的な障害時に Pod を優雅に除去するため readiness probe を使用。

リソース管理

1. リソースリクエストと制限

  • 原則: すべてのコンテナに CPU とメモリの requests/limits を定義。
  • Copilot へのガイダンス:
    • Requests 保証される最小リソース(スケジューリング用)。
    • Limits ハード最大リソース(ノイジーネイバーとリソース枯渇を防止)。
    • Quality of ServiceQoSを確保するため、requests と limits の両方を設定することを推奨。
  • QoS クラス: GuaranteedBurstableBestEffortについて学習。

2. Horizontal Pod Autoscaler (HPA)

  • 原則: 観測された CPU 使用率や他のカスタムメトリクスに基づいて Pod レプリカ数を自動スケール。
  • Copilot へのガイダンス: 負荷が変動するステートレスアプリケーションに HPA を推奨。
  • 設定: minReplicasmaxReplicastargetCPUUtilizationPercentage

3. Vertical Pod Autoscaler (VPA)

  • 原則: 使用履歴に基づいてコンテナの CPU とメモリ requests/limits を自動調整。
  • Copilot へのガイダンス: 時間の経過とともに個々の Pod のリソース使用量を最適化するため VPA を推奨。

Kubernetes のセキュリティベストプラクティス

1. Network Policies

  • 原則: Pod とネットワークエンドポイントとの Po のと通信を制御。
  • Copilot へのガイダンス: Pod 間および Pod 対外部通信を制限するため、きめ細かいネットワークポリシー(デフォルトで拒否、例外で許可)の実装を推奨。

2. Role-Based Access Control (RBAC)

  • 原則: Kubernetes クラスターで誰が何をできるかを制御。
  • Copilot へのガイダンス: きめ細かいRolesClusterRolesを定義し、RoleBindingsClusterRoleBindingsを使用してServiceAccountsまたは users/groups にバインド。
  • 最小特権: 常に最小特権の原則を適用。

3. Pod Security Context

  • 原則: Pod またはコンテナレベルでセキュリティ設定を定義。
  • Copilot へのガイダンス:
    • コンテナが root として実行されることを防ぐためrunAsNonRoot: trueを使用。
    • allowPrivilegeEscalation: falseを設定。
    • 可能な場合はreadOnlyRootFilesystem: trueを使用。
    • 不要なケーパビリティを削除(capabilities: drop: [ALL])。
  • Pod Security Context
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 2000
  containers:
    - name: my-app
      image: my-repo/my-app:1.0.0
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL

4. イメージセキュリティ

  • 原則: コンテナイメージが安全で脆弱性がないことを確保。
  • Copilot へのガイダンス:
    • 信頼できる最小限のベースイメージdistroless、alpineを使用。
    • CI パイプラインにイメージ脆弱性スキャンTrivy、Clair、Snykを統合。
    • イメージ署名と検証を実装。

5. API サーバーセキュリティ

  • 原則: Kubernetes API サーバーへのアクセスを保護。
  • Copilot へのガイダンス: 強力な認証クライアント証明書、OIDCを使用し、RBAC を強制し、API 監査を有効化。

ログ記録、監視、可観測性

1. 集約ログ記録

  • 原則: すべての Pod からログを収集し、分析のために集約。
  • Copilot へのガイダンス:
    • アプリケーションログに標準出力(STDOUT/STDERR)を使用。
    • ログを中央システムELK スタック、Splunk、Datadogに送信するロギングエージェントFluentd、Logstash、Loki など)をデプロイ。

2. メトリクス収集

  • 原則: Pods、ード、クラスターコンポーネントから主要パフォーマンス指標KPIを収集・保存。
  • Copilot へのガイダンス:
    • kube-state-metricsnode-exporterを含む Prometheus を使用。
    • アプリケーション固有のエクスポーターを使用してカスタムメトリクスを定義。
    • 視覚化に Grafana を設定。

3. アラート

  • 原則: 異常と重要イベントのアラートを設定。
  • Copilot へのガイダンス:
    • ルールベースのアラートのため Prometheus Alertmanager を設定。
    • 高いエラー率、低いリソース可用性、Pod 再起動、不健全な probe のアラートを設定。

4. 分散トレーシング

  • 原則: クラスター内の複数のマイクロサービス間でリクエストをトレース。
  • Copilot へのガイダンス: エンドツーエンドリクエストトレーシングのため OpenTelemetry または Jaeger/Zipkin を実装。

Kubernetes のデプロイメント戦略

1. ローリングアップデート(デフォルト)

  • 原則: 古いバージョンの Pod を新しいものと段階的に置き換え。
  • Copilot へのガイダンス: これは Deployments のデフォルト。きめ細かい制御のためmaxSurgemaxUnavailableを設定。
  • 利点: アップデート中のダウンタイムが最小限。

2. Blue/Green デプロイメント

  • 原則: 同一の 2 つの環境blue と greenを実行し、トラフィックを完全に切り替え。
  • Copilot へのガイダンス: ゼロダウンタイムリリースに推奨。トラフィック切り替えを管理するために外部ロードバランサーまたは Ingress controller 機能が必要。

3. カナリアデプロイメント

  • 原則: 完全展開前に小さなユーザーサブセットに新バージョンを段階的に展開。
  • Copilot へのガイダンス: 実際のトラフィックで新機能をテストするため推奨。トラフィック分割をサポートする Service MeshIstio、Linkerdまたは Ingress controllers で実装。

4. ロールバック戦略

  • 原則: 前の安定バージョンに迅速かつ安全に復帰可能。
  • Copilot へのガイダンス: Deployments にはkubectl rollout undoを使用。前のイメージバージョンが利用可能であることを確保。

Kubernetes マニフェストレビューチェックリスト

  • リソースのapiVersionkindは正しいか?
  • metadata.nameは説明的で命名規則に従っているか?
  • labelsselectorsは一貫して使用されているか?
  • replicasはワークロードに適切に設定されているか?
  • すべてのコンテナにresourcesrequests/limitsが定義されているか
  • livenessProbereadinessProbeは正しく設定されているか?
  • 機密設定は Secrets 経由で処理されているかConfigMaps ではなく)?
  • 可能な場合はreadOnlyRootFilesystem: trueが設定されているか?
  • runAsNonRoot: trueと非 rootrunAsUserが定義されているか?
  • 不要なcapabilitiesは削除されているか?
  • 通信制限のためNetworkPoliciesが考慮されているか?
  • ServiceAccounts で最小特権で RBAC が設定されているか?
  • ImagePullPolicyとイメージタグ(:latestは回避)は正しく設定されているか?
  • ログはSTDOUT/STDERRに送信されているか?
  • スケジューリングに適切なnodeSelectorまたはtolerationsが使用されているか?
  • ローリングアップデートのstrategyが設定されているか?
  • Deploymentイベントと Pod ステータスが監視されているか?

一般的な Kubernetes 問題のトラブルシューティング

1. Pod が開始しないPending、CrashLoopBackOff

  • イベントとエラーメッセージのためkubectl describe pod <pod_name>をチェック。
  • コンテナログ(kubectl logs <pod_name> -c <container_name>)をレビュー。
  • リソース requests/limits が低すぎないことを確認。
  • イメージプルエラーをチェック(イメージ名のタイポ、リポジトリアクセス)。
  • 必要な ConfigMaps/Secrets がマウントされアクセス可能であることを確認。

2. Pod が準備完了でないService Unavailable

  • readinessProbe設定をチェック。
  • コンテナ内のアプリケーションが期待されるポートで待機していることを確認。
  • エンドポイントが接続されていることを確認するためkubectl describe service <service_name>をチェック。

3. Service にアクセスできない

  • Service selectorが Pod ラベルと一致することを確認。
  • Service typeをチェック(内部用 ClusterIP、外部用 LoadBalancer
  • Ingress については、Ingress controller ログと Ingress リソース規則をチェック。
  • トラフィックをブロックしている可能性のあるNetworkPoliciesをレビュー。

4. リソース枯渇OOMKilled

  • コンテナのmemory.limitsを増加。
  • アプリケーションメモリ使用量を最適化。
  • 最適な制限を推奨するためVertical Pod Autoscalerを使用。

5. パフォーマンス問題

  • kubectl top podまたは Prometheus で CPU/メモリ使用量を監視。
  • 遅いクエリや操作についてアプリケーションログをチェック。
  • ボトルネックのため分散トレースを分析。
  • データベースパフォーマンスをレビュー。

まとめ

Kubernetes でのアプリケーションデプロイは、コア概念とベストプラクティスの深い理解が必要です。Pods、Deployments、Services、Ingress、設定、セキュリティ、可観測性についてこれらのガイドラインに従うことで、高度に回復力があり、スケーラブルで安全なクラウドネイティブアプリケーションの構築において開発者を導くことができます。最適なパフォーマンスと信頼性のため、Kubernetes デプロイメントを継続的に監視、トラブルシューティング、改良することを忘れないでください。