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