K8sのみでのデプロイ
Info
このガイドは、すでにK8sを使用した経験があるユーザー向けです。この記事では、K8sクラスタの構築方法やkubectlなどのコマンドの使い方については紹介していません。また、記事中にはK8sの専門用語が含まれている可能性があり、一定の基礎知識が必要です。
この記事では、K8sクラスタ内でGZCTFをデプロイする方法に焦点を当てています。GZCTF自体の設定チュートリアルについては、クイックスタートを参照してください。
デプロイに関する注意事項
- GZCTFは複数のインスタンスをデプロイすることをサポートしていますが、テストの結果、現時点では最も安定しているのは、単一のインスタンスをデプロイし、データベースが同一のノードに存在するデプロイ方法です。そのため、この記事では単一インスタンスのデプロイを例に説明します。
- マルチインスタンスデプロイメントの場合、すべてのインスタンスはファイルの一貫性と書き込みの同時実行性を確保するためにS3/Object Storageを使用する必要があります(#365を参照してください)。さらに、マルチインスタンス間のキャッシュの一貫性を確保するためにRedisをデプロイする必要があります。両方を設定するには、appsettings を参照してください。Azure / AWS / Minio などの複数のストレージプロバイダーがサポートされています。
- 複数のインスタンスをデプロイする場合、ロードバランサーはsticky sessionを設定する必要があります。そうしないと、websocketを使用してリアルタイムデータを取得することができません。
- もし面倒なら、単一インスタンスをデプロイしましょう!
- クラスタ内でGZCTFをデプロイすることを選択した場合、一定の程度のPod数が必要であることに注意してください。
-
インストール時に
--kube-controller-manager-arg=node-cidr-mask-size=16を指定してください。デフォルトのCIDRは/24で、最大255個のPodをサポートします。インストール後にこの設定を変更することはできません。 -
maxPodsの値を適切に調整してください。そうしないと、Podの数が上限に達してスケジュールできなくなる可能性があります。
-
GZCTFのデプロイ
-
ネームスペースと設定ファイルの作成
-
ローカルPVの作成(複数のインスタンスで共有ストレージが必要な場合は、設定を自分で変更してください)
-
GZCTFのDeploymentを作成
-
ServiceとIngressの作成
-
Traefikの追加設定
GZCTFがXFFを通じてユーザーの実際のIPを正常に取得できるようにするためには、Traefikが正確にXFFヘッダーを追加できるようにする必要があります。以下の内容は必ずしも最新であり、すべてのバージョンのTraefikに適用できるわけではないことに注意してください。ここではhelm valuesの例を示していますが、最新の設定方法を自分で調べてください。
デプロイのヒント
- GZCTFが初期化時に自動的に管理者アカウントを作成するようにするには、
GZCTF_ADMIN_PASSWORD環境変数を渡すことを忘れないでください。そうしないと、管理者アカウントを手動で作成する必要があります。 - システムログ画面でデバッグし、ユーザーの実際のIPを正常に取得できるかどうかを確認してください。できない場合は、Traefikの設定が正しいかどうかを確認してください。
- モニタリングが必要な場合は、PrometheusとGrafanaを自分でデプロイし、TraefikのPrometheusサポートを有効にしてください。また、node exporterを使用してチャレンジコンテナのリソース使用状況を監視することができます。
- 設定ファイルの変更に基づいてGZCTFのデプロイを自動更新する必要がある場合は、Reloaderを参照してください。
- クラスタ内で、クラスタ構成ファイルの
serverフィールドにhttps://kubernetes.default.svc.cluster.local:443を使用できます。