ユニット 5 / 11

Kubernetes: マニフェスト、Helm、AI を活用したオーケストレーション

利益:

  • Kubernetes の基本オブジェクト (ポッド、デプロイメント、サービス、ConfigMap、シークレット、名前空間) と宣言的哲学を理解し、人工知能用の確かなマニフェストを作成する能力
  • リソース制限、ヘルスチェック (プローブ)、固定イメージタグ、および狭い RBAC を使用して、マニフェストを本番環境に備え、安全に作成する機能
  • 実行前に正しいコンテキストを検証し、ドライラン/差分によるドライラン規律を適用する機能

1 つのコンテナを実行するのは簡単です。しかし、数百のコンテナを数十のサーバーに分散し、そのうちの 1 つがクラッシュすると自動的に再起動し、負荷が増加するとそれを複製し、ダウンタイムなしで更新するシステムを確立することはできるでしょうか?それがオーケストレーションであり、業界標準ツールは Kubernetes (略して K8s) です。これは、クラスター全体でコンテナーを自動的にデプロイ、スケーリング、管理するプラットフォームです。 Kubernetes は強力ですが複雑です。すべてはマニフェストと呼ばれる、インデントに依存する長い YAML ファイルによって定義されます。ここに AI が新鮮な風を吹き込みます。適切なコンテキストがあれば、これらのマニフェストを迅速に生成し、謎のエラーをデコードします。

しかし、Kubernetes では、マニフェストが間違っていると、サービス全体の立ち上げに失敗したり、正しくスケーリングされなかったり、脆弱性が残ったりすることを意味します。 AI が生成する各マニフェストを理解して検証することは、特に kubectl を適用する前に行う責任です。

Kubernetes コア オブジェクト

Kubernetes を監査するには、次の主な概念を理解しておく必要があります。

  • ポッド: 最小の作業単位。 1 つまたは複数のコンテナが含まれます。通常、Pod は直接使用されませんが、Pod を管理する親オブジェクトが使用されます。
  • デプロイメント: 実行するアプリケーションのコピー数、使用するイメージ、および更新方法を定義します。ポッドがクラッシュすると、自動的にポッドが再作成されます。
  • サービス: 固定ネットワーク アドレスとロード バランシングをポッドに提供します。ポッドが行き来しても、アクセスアドレスは変わりません。
  • ConfigMap と Secret: 構成値とシークレット情報を Pod から分離して保持します。 ConfigMap は明示的な設定用であり、Secret は機密値用です。
  • 名前空間: リソース (dev、prod など) を論理的に分割および分離する領域。
  • イングレス: HTTP トラフィックを外部からクラスター内のサービスに送信するルール セット。

Helm は Kubernetes の「パッケージ マネージャー」です。これを使用すると、繰り返し発生するマニフェスト (チャート) をテンプレート化し、1 つのコマンドで異なる環境に異なる値でインストールできます。 AI は生のマニフェストと Helm チャートの両方を生成します。

なぜこんなにたくさんのオブジェクトがあるのでしょうか?なぜなら、Kubernetes の中核となる哲学は宣言的であるためです。「システムを最終的にどのようにしたいか」(例: 「このアプリケーションのコピーを常に 3 つ実行する」など) を定義すると、Kubernetes は現在の状態を望ましい状態に継続的に近づけます。 Pod が停止すると、新しい Pod が作成されます。ノードがダウンすると、ワークロードが別のノードに移動されます。そのため、マニフェストは「実行」コマンドではなく、「このようにする」レシピです。この区別を理解することは、AI が生成するマニフェストを読むときに重要です。各ドメインは、システムの望ましい状態の一部を記述します。ドメインが間違っているということは、Kubernetes が間違った目標に向かって取り組んでいることを意味し、その目標は黙って永続的に強制されます。

ヒント: Kubernetes では、最も重要な安全なテスト ツールは kubectl apply --dry-run=server -f file.yaml です。これは、サーバーが受け入れるかどうか、および実際にマニフェストを適用せずに何をすべきかを示します。マニフェストを本番環境に適用する前に、必ずドライランと kubectl diff を実行してください。

ステップバイステップ: AI を使用したマニフェストの作成

  1. 用途と必要性について説明します。イメージ名、ポート、レプリカの数、リソース制限 (CPU/メモリ)。
  2. 導入 + サービスをリクエストします。通常、両方が同時に必要になります。
  3. 設定とシークレットを分離します。設定は ConfigMap に、機密値は Secret に。
  4. ヘルスチェックを追加します。 livenessProbe (ライブかどうか) と readinessProbe (トラフィックの準備ができているか) が重要です。
  5. リソース制限を設定します。リクエスト/制限がなければ、ポッドはノード全体を消費する可能性があります。
  6. `--dry-run` と `diff` で確認してから適用してください。最初はテスト名前空間です。

セキュリティ: Kubernetes 固有のリスク

  1. Secret は実際には Secret ではなく、単なる Base64 です。 Kubernetes Secret オブジェクトは、base64 で値をエンコードします。これは暗号化ではなく、簡単に復号化されます。真のプライバシーを確​​保するには、etcd 暗号化と外部ボールト (Vault、クラウド シークレット マネージャー) が必要です。シークレット マニフェストを Git に直接コミットしないでください (これには、Sealed Secrets/External Secrets などの解決策があります)。
  2. リソース制限を設定します。制限のないポッドでは、メモリ リークが発生してノード全体がクラッシュする可能性があります。
  3. 最小権限 (RBAC)。ロールベースのアクセス制御を使用すると、各サービス/ユーザーは必要な権限のみを持ちます。 AI は、大規模なクラスター管理者を与えることがあります。これを絞り込みます。
  4. 「latest」イメージタグは使用しないでください。どのバージョンが実行されているかが分からず、ロールバックすることもできません。
注意: kubectl delete または不適切な適用により、ライブ デプロイメントが破壊される可能性があります。コマンドを実行する前に、現在いる名前空間 (kubectl config current-context) を必ず確認してください。偶発的な作業は、生産環境においてよくある災害です。

生のマニフェストと Helm テーブルの比較

基準

生の YAML マニフェスト

ヘルムチャート

インストール

kubectl 適用 -f

ヘルムのインストール

マルチメディア (開発/製品)

コピーアンドペースト、エラーが発生しやすい

単一のグラフ、異なる値.yaml

バージョン/ロールバック

手で

ヘルムロールバックで簡単

学習曲線

低い

中程度

いつ

小規模な単一環境

マルチメディア、反復的なサービス

ミニケース3個

ケース 1 — クラッシュしたサービスの秘密。ポッドが常に再起動していました (CrashLoopBackOff)。チームはログとマニフェストを AI に渡しました。 AI は、readinessProbe が間違ったポートを参照していたため、ポッドが「準備完了」とはみなされなかったことを示しました。ポートを修正したところ、10分ほどでサービスが安定しました。この関係を手動で確立するには数時間かかる場合があります。

ケース 2 — 制限を設定しなかったため、結び目が壊れました。デプロイメントには制限がありませんでした。メモリリークによりポッドが肥大化してノード全体がクラッシュし、隣接するサービスもダウンしました。事件後、彼らはAIに「すべてのDeploymentに合理的なCPU/メモリのリクエストと制限を追加する」と指示させ、それを標準化した。 1 つの行が欠落していると、数時間のダウンタイムが発生します。

ケース 3 — 大規模な RBAC がキャプチャされました。調査中に、AI によって生成された ServiceAccount マニフェストがクラスター管理者のロールに関連付けられていることが判明しました。これは、サービスがクラスター全体を管理できることを意味します。チームは、名前空間内のポッドの読み取りのみに権限を絞り込みました。最小特権の原則により、セキュリティの脆弱性が解決されました。

コピー可能な 4 つのテンプレート

1) 導入 + サービスの作成:

Kubernetes のデプロイメントとサービスのマニフェストを作成します。アプリケーション: [AD]、イメージ: [イメージ: 修正版]、ポート: [X]、レプリカ: [N]。ルール:- CPU/メモリのリクエストと制限を追加します。- livenessProbe と readinessProbe を定義します。- ConfigMap から設定を読み取り、Secret オブジェクトからシークレットを読み取ります。 マニフェストに値を埋め込まず、プレースホルダーを使用してください。 - 画像タグ「:latest」は使用しないでください。説明付きで渡します。

2) マニフェストエラーの解決:

現在のポッドは [CrashLoopBackOff / Pending / ImagePullBackOff] 状態です。次のマニフェストと「kubectl description」の出力に従って、考えられる根本原因を可能性の高い順にリストし、それぞれに対して verify コマンドを発行します。マニフェスト: [YAML] 説明: [OUTPUT]

3) セキュリティ/完全性チェック:

この Kubernetes マニフェストを確認してください: リソース制限が欠落していないか、prob が欠落していないか、:latest タグはないか、広すぎる RBAC/権限はないか、マニフェストにシークレットは埋め込まれているか?調査結果を重要な順に、修正を加えて書きます。マニフェスト: [YAML]

4) Helm チャートへの変換:

次の生のマニフェストを再利用可能な Helm チャートに変換します。どの値をvalues.yaml (イメージ、レプリカ、ソース、環境) に出力する必要がありますか?チャート構造とサンプル値を表示する.yaml.Manifests: [YAML]

弱いプロンプト / 強いプロンプト

弱者: 「アプリケーション用に Kubernetes YAML を作成します。」

結果: :latest タグを使用したプローブなし、制限なしのデプロイメント、シークレット プレーンの埋め込み。本番環境では不安定で壊れやすい。

Strong: 「Kubernetes デプロイメント + サービスを書き込みます。イメージ myapp:1.4.2、3 レプリカ、8080 ポート。CPU 100m ~ 500m、メモリ 128Mi ~ 512Mi でリクエスト/制限を追加します。/healthz に liveness プローブ、/ready に readiness プローブを置きます。Secret オブジェクトから Secret を読み取り、マニフェストに埋め込まないでください。説明付きで渡します。」

違い: 2 番目のプロンプト バージョンでは、スケール、リソース制限、ヘルス チェック、およびシークレット ルールが提供されます。出力は本番環境に近く、安全です。

よくある間違い

  • リソース制限を設定していません。単一のポッドがノード全体を消費する可能性があります。
  • ヘルスチェック (プローブ) を追加しません。 Kubernetes は、クラッシュしたポッドまたは準備ができていないポッドを検出できません。
  • `:latest` タグ。どのバージョンが実行されているかが不明瞭になり、ロールバックできなくなります。
  • シークレットを Git に直接コミットします。 Base64 は暗号化ではありません。誰もがそれを解決します。
  • 間違ったコンテキスト/名前空間でコマンドを実行します。本番環境でクラッシュする最も一般的な方法。
  • `--dry-run`/`diff` をスキップします。実装前に何が起こるかわかりません。

要約すると

Kubernetes は、クラスター全体でコンテナーを自動的にデプロイ、スケーリング、最適化する強力だが複雑なオーケストレーターです。すべてはマニフェスト YAML によって定義され、Helm がテンプレート化します。 AI は、デプロイメント/サービス マニフェストと Helm チャートを迅速に作成し、謎のバグを解決します。ただし、リソース制限、ヘルス チェック、不変のイメージ タグ、狭い RBAC、および秘密のセキュリティ ルールを明示的に要求する必要があります。 --dry-run、diff、および正しいコンテキストのチェックは、本番環境のクラッシュを防ぐ習慣です。

アプリケーションタスク

「デプロイ + サービス生成」テンプレートを使用して、AI にサンプル アプリケーションのマニフェストを生成させます。次に、(1) 「セキュリティ/健全性チェック」テンプレートを使用して、リソース制限、プローブ、:latest、およびシークレットをチェックします。 (2) 可能であればテスト クラスター/minikube で kubectl apply --dry-run=server を実行し、出力を読み取ります。 (3) 欠けていると思われる 2 つの最も重要な安全性/堅牢性の項目に注意してください。

チェックリスト

  • [ ] イメージのバージョン、レプリカの数、ポートおよびリソースの制限をリクエストに追加しました。
  • [ ] liveness プローブと readiness プローブをマニフェストに追加しました。
  • [ ] 画像タグが修正されました。 :latest は使用しませんでした。
  • [ ] シークレットはマニフェストに埋め込まれていません。私は Secret オブジェクト/外部ボールトを使用しました。
  • [ ] RBAC/権限を最小限の権限に絞り込みました。
  • [ ] 適用する前に、正しいコンテキストにいること、および --dry-run/diff の出力を確認しました。