KubernetesにおけるカスタムAPIを使用したコンテナチェックポイント

問題の声明

チャレンジ

Kubernetesでコンテナ化されたアプリケーションを実行している組織は、次のために実行中のコンテナの状態をキャプチャおよび保存する必要があります:

  • 災害復旧
  • アプリケーションの移行
  • デバッグ/トラブルシューティング
  • 状態の保存
  • 環境の再現

ただし、次のことに対して直接的で自動化された方法がありません:

  1. 必要に応じてコンテナのチェックポイントを作成する
  2. これらのチェックポイントを標準化された形式で保存する
  3. クラスタ全体で簡単にアクセス可能にする
  4. 標準インターフェースを介してチェックポイントをトリガーする

現在の制限事項

  • 手動のチェックポイント作成には直接クラスタアクセスが必要
  • チェックポイントの標準化された保存形式がない
  • コンテナレジストリとの統合が限られている
  • 自動化のためのプログラム的アクセスが不足している
  • containerdとストレージシステムの複雑な調整が必要

ソリューション

次を行うKubernetesサイドカーサービス

  1. REST APIを介してチェックポイント機能を公開
  2. 自動的にOCI準拠のイメージにチェックポイントを変換
  3. ECRにイメージを保存して簡単に配布
  4. 既存のKubernetesインフラストラクチャと統合
  5. 自動化のための標準化されたインターフェースを提供

これにより次のコアの問題が解決されます:

  • チェックポイントプロセスの自動化
  • チェックポイントストレージの標準化
  • チェックポイントをポータブルにする
  • プログラムアクセスを可能にする
  • 既存のワークフローとの統合を簡素化する

対象ユーザー:

  • DevOps チーム
  • プラットフォームエンジニア
  • アプリケーション開発者
  • サイト信頼性エンジニア(SRE)

フォレンジックコンテナのチェックポイントは、実行中のコンテナの状態を知らせずに状態のコピーを作成することを可能にする、Checkpoint/Restore In Userspace(CRIU)に基づいており、元のコンテナがそのことに気づかないまま、コンテナのコピーをサンドボックス環境で複数回分析および復元できます。フォレンジックコンテナのチェックポイントは、Kubernetes v1.25 でアルファ機能として導入されました。

本記事では、API を使用してコンテナのチェックポイントを取るために使用できるGolang コードを展開する方法について説明します。

このコードは、ポッド識別子を取得し、containerd からコンテナ ID を入力として使用し、その後、k8s.io ネームスペースの特定のコンテナを ctr コマンドを使用して containerd 内でチェックポイントします。

前提条件

  • Kubernetes クラスタ
  • ctrコマンドラインツールをインストールしてください。kubeletやワーカーノードでctrコマンドを実行できる場合は、そのまま使用してください。そうでない場合は、AMIをインストールまたは調整してctrを含めるようにしてください。
  • kubectlがクラスターと通信するように構成されていること
  • ローカルにDockerがインストールされていること
  • コンテナレジストリへのアクセス権(例:Docker Hub、ECR)
  • Nginx Ingress ControllerをインストールするためのHelm

ステップ0:GOを使用してコンテナーチェックポイントを作成するためのコード

以下の内容でcheckpoint_container.goという名前のファイルを作成してください:

Go

 

ステップ1:goモジュールを初期化する

Shell

 

go.modファイルを修正してください:

Go

 

次のコマンドを実行してください:

Shell

 

ステップ2:Dockerイメージをビルドして公開する

同じディレクトリにDockerfileを作成してください:

Dockerfile

 

このDockerfileは以下のことを行います:

  1. Goアプリケーションをコンパイルするためのビルドステージとしてgolang:1.20を使用します。
  2. 最終的なベースイメージとしてamazonlinux:2を使用します。
  3. AWS CLI、Docker(これにはcontainerdが含まれます)、skopeoをyumおよびamazon-linux-extrasを使用してインストールします。
  4. ビルドステージからコンパイルされたGoバイナリをコピーします。
Shell

 

<your-docker-repo>を実際のDockerリポジトリに置き換えてください。

ステップ3:RBACリソースを適用する

rbac.yamlという名前のファイルを作成してください:

YAML

 

RBACリソースを適用してください:

Shell

 

ステップ4: Kubernetes Deploymentの作成

deployment.yamlというファイルを作成してください:

YAML

 

デプロイメントを適用してください:

Shell

 

deployment.yamlで以下を更新してください:

YAML

ステップ5: Kubernetes Service

service.yamlというファイルを作成してください:

YAML

 

サービスを適用してください:

Shell

 

ステップ6: Ngnix Ingress Controllerのインストール

Shell

 

ステップ7: Ingressリソースの作成

ingress.yamlというファイルを作成してください:

YAML

 

Ingressを適用してください:

Shell

 

ステップ8: APIのテスト

Shell

 

Shell

 

<EXTERNAL-IP>を実際の外部IPアドレスに置き換えてください。

追加の考慮事項

  1. セキュリティ
    • TLS証明書の設定によるHTTPSの実装
    • APIに認証を追加
  2. モニタリング。APIとチェックポイントプロセスのためにログ記録とモニタリングをセットアップしてください。
  3. リソース管理。サイドカーコンテナのリソース要求と制限を構成してください。
  4. エラー処理。Goアプリケーションで堅牢なエラー処理を実装してください。
  5. テスト。本番環境にデプロイする前に、非本番環境でセットアップを徹底的にテストしてください。
  6. ドキュメンテーション。チェックポイントAPIの使用方法について明確なドキュメントを維持してください。

結論

このセットアップでは、チェックポイントコンテナをKubernetesのサイドカーとしてデプロイし、クラスター外部からアクセス可能なAPIを介してその機能を公開します。これは、Kubernetes環境でコンテナのチェックポイントを管理する柔軟なソリューションを提供します。

AWS/EKS固有の

ステップ7: AWSロードバランサーコントローラーをインストールする

Nginx Ingress Controllerではなく、AWSロードバランサーコントローラーを使用します。このコントローラーはIngressリソース用のALBを作成および管理します。

1. EKSチャートリポジトリをHelmに追加します:

Shell

 

2. AWSロードバランサーコントローラーをインストールします:

Shell

 

<your-cluster-name>をEKSクラスター名に置き換えてください。

注意: AWSロードバランサーコントローラーに必要なIAM権限が設定されていることを確認してください。詳細なIAMポリシーについては、AWSのドキュメントを参照してください。

ステップ8: Ingressリソースを作成する

ingress.yamlというファイルを作成します:

YAML

 

Ingressを適用します:

Shell

 

ステップ9: APIをテストする

1. ALBのDNS名を取得します:

Shell

 

ALBのDNS名であるADDRESSフィールドを探します。

2. テストリクエストを送信します:

Shell

 

ステップ1で取得したALBのDNS名である<ALB-DNS-NAME>を実際のALBのDNS名に置き換えてください。

AWS ALBに関する追加の考慮事項

1. セキュリティグループ。ALBには自動的にセキュリティグループが作成されます。ポート80(およびHTTPSをセットアップした場合はポート443)でのインバウンドトラフィックを許可するようにしてください。

2. SSL/TLS:HTTPSを有効にするには、次の注釈をIngressに追加できます:

YAML

 

3. アクセスログ。次を追加することで、ALBのアクセスログを有効にできます:

YAML

 

4. WAF 統合。ALBでAWS WAFを使用したい場合は、次を追加できます:

YAML

 

5. 認証。適切なALB Ingress Controllerの注釈を使用して、Amazon CognitoまたはOIDCを使用して認証を設定できます。

これらの変更により、Nginxの代わりにAWSアプリケーションロードバランサーを使用したIngressが設定されます。ALB Ingress Controllerは、Ingressリソースに基づいてALBを自動的にプロビジョニングおよび構成します。

結論

EKSクラスターにALBを作成および管理するための必要なIAM権限があることを確認してください。通常、適切な権限を持つIAMポリシーとサービスアカウントを作成する必要があります。

このセットアップでは、AWSのネイティブなロードバランシングソリューションが使用され、他のAWSサービスとの統合が円滑であり、AWS環境でより費用対効果が高いことになります。

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api