KubernetesにPerforceサーバーをデプロイする
なぜPerforceか
Perforceは、gitやsvnのようなバージョン管理ツールですが、大きなバイナリファイルに最適化されています。
Perforceは、Naughty Dogs、Electronic Arts、Ubisoftなどのトップクラスのゲームスタジオによって広く使用されています。
私がGit LFSではなくPerforceを選ぶ理由は、すでに稼働中のk8sクラスターがあり、ゲームプロジェクトのために大きなアセットファイルがあるため、Githubでデータパックを購入したくないからです。
Dockerfile
私のすべてのノードはarm64ベースのAWS仮想マシンです。Perforceはもはやarm64用のLinuxパッケージを維持していません。バイナリをダウンロードしてdockerイメージをビルドする方法を試みたところ、うまくいきました。
FROM ubuntu:jammy
# システムを更新
RUN apt-get update -y
# 依存関係をインストール
RUN apt-get install -y wget tar
# 作業ディレクトリを設定
WORKDIR /perforce
# Perforceバイナリをダウンロードして抽出
RUN wget https://www.perforce.com/downloads/perforce/r24.1/bin.linux26aarch64/helix-core-server.tgz -O helix-core-server.tgz \
&& tar -xzf helix-core-server.tgz \
&& rm helix-core-server.tgz
# PerforceバイナリをPATHに追加
ENV PATH="/perforce:${PATH}"
# Perforceの環境変数を定義
ENV P4ROOT=/perforce
ENV P4PORT=1666
# Perforceサーバーポートを公開
EXPOSE 1666
# Perforceサーバーを起動し、ログを追跡
CMD p4d -r /perforce -p $P4PORT -L /perforce/logs/log && tail -F /perforce/logs/log
ダウンロードURLは公式のPerforceダウンロードページにあります。この記事が書かれた時点で、helixサーバーの最新バージョンは2024.1/2596294です。独自のdockerイメージを作成する際には、新しいリリースを確認してください。
ビルドしてレジストリにプッシュ
#!/bin/bash
# 変数
repositoryHost='your-registry'
repository='your-repo'
imageBaseName='helix-core-server'
platforms='linux/arm64' # プラットフォームを定義
# package.jsonからバージョンを抽出
version='0.0.1'
# バージョン付きの完全なイメージタグ
imageTag="$imageBaseName:$version"
# マルチプラットフォームビルドをサポートする新しいビルダーインスタンスを作成(まだ作成されていない場合)
docker buildx create --name mymultiarchbuilder --use
# ビルドインスタンスを起動(まだ起動されていない場合)
docker buildx inspect --bootstrap
# Dockerイメージをビルドしてプッシュ
docker buildx build --platform $platforms -t $repositoryHost/$repository/$imageTag --push .
K8sデプロイメント
k8sクラスターからサービスを公開するたびに、DDoSの問題を考慮します。そうしないと、早かれ遅かれ直面することになります。通常、nodeport + nginx ingress controllerを介して公開し、cloudflareの背後に置きます。
しかし、Perforceはhttpサービスではなく、cloudflareのオレンジクラウドを介してプロキシできません。オレンジクラウドを無効にし、nodeportを使用して直接アクセスする必要があります。これは、私が自分のためだけに使用しているので、大きな問題ではありません。Perforceサーバーがインターネット上で公開される場合は、DDoS保護を考慮する必要があります。
deployment.yaml
私はすでにk8sクラスター内にjuicefsに基づくPVCを設定しているので、ポッドは再デプロイ中にデータを失うことはありません。juicefsのdata/perforce-rootをコンテナ内の/etc/perforceと/perforceにマッピングしました。あなたのケースに合わせて調整してください。
この記事では、juicefsをk8sクラスターにPersistentVolumeとしてデプロイする方法については触れていません。詳細はjuicefsの公式ドキュメントに記載されています。
apiVersion: apps/v1
kind: Deployment
metadata:
name: perforce-server
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: perforce-server
template:
metadata:
labels:
app: perforce-server
spec:
containers:
- name: perforce-server
image: your-registry/helix-core-server:0.0.1
ports:
- containerPort: 1666
volumeMounts:
- mountPath: /etc/perforce
name: perforce-storage
subPath: data/perforce-root/etc/perfoce
- mountPath: /perfoce
name: perforce-storage
subPath: data/perfoce-root/perfoce
env:
- name: P4ROOT
value: /perforce
- name: P4PORT
value: '1666'
volumes:
- name: perforce-storage
persistentVolumeClaim:
claimName: juicefs-pvc
nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: perforce-service
namespace: default
spec:
type: NodePort
ports:
- port: 1666
targetPort: 1666
selector:
app: perforce-server
適用する
kubectl apply -f deployment.yaml
kubectl apply -f nodeport.yaml
perforce-serverに割り当てられたポートを確認するには
kubectl get svc
私の場合、ポートは30222です。あなたのドメインをノードのパブリックIPにポイントしてください。あなたのPerforceアドレスはyour-domain:30222です。ファイアウォールやその他の関連するセキュリティポリシーを調整することを忘れないでください。
パスワードを設定
このステップは、initコンテナを使用してk8sに自動で行わせることもできますが、面倒なので、ポッドに入って手動で一度だけ行います。設定はPVCが提供されるため、永続的です。
ポッド名を取得
kubectl get pods -l app=perforce-server
次に、それに入ります
kubectl exec pod-name-you-just-got -it -- /bin/bash
認証を有効にする
p4 protect -o > protections.p4s
Google検索の結果では、管理者のユーザー名はsuperですが、私のprotection.p4sにはrootしか見えません。気にしないでください、rootのパスワードを設定します。
p4 -u root passwd
これで、rootとパスワードを使用してyour-domain:30222のPerforceサーバーに接続できます。
p4admin GUIクライアントを使用してrootで接続し、日常の開発のために通常の権限を持つユーザーを作成できます。