HomeArchiveFeedShelf

在Kubernetes中部署Perforce服务器

为什么选择Perforce

Perforce是一种版本控制工具,类似于git和svn,但针对大型二进制文件进行了优化。

Perforce被顶级游戏工作室广泛使用,如Naughty Dogs、Electronic Arts和Ubisoft。

对我来说,我选择Perforce而不是Git LFS的原因是我已经有一个正在运行的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

下载链接可以在官方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控制器来暴露它们,并将它们放在cloudflare后面。

然而,Perforce不是HTTP服务,无法通过cloudflare的橙色云进行代理。我必须禁用橙色云,直接使用nodeport访问它们。这不是大问题,因为我只是为自己使用。如果Perforce服务器将公开在互联网上,你必须考虑DDoS保护。

deployment.yaml

我已经在我的k8s集群中基于juicefs设置了PVC,因此在重新部署期间pod不会丢失任何数据。我将juicefs中的data/perforce-root映射到容器内的/etc/perforce/perforce。确保根据你的情况进行调整。

本文不讨论如何将juicefs作为PersistentVolume部署到你的k8s集群中。详细信息请参阅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

检查k8s为perforce-server分配的端口

kubectl get svc

在我的情况下,端口是30222。将你的域名指向节点的公共IP。你的Perforce地址是your-domain:30222。记得调整你的防火墙或其他相关安全策略。

设置密码

虽然你可以使用init容器和一些技巧来完成这一步,让k8s为你处理,但这很繁琐,所以我只是进入pod并手动完成这一步,因为设置将是持久的,因为pod是通过PVC提供的。

获取pod名称

kubectl get pods -l app=perforce-server

然后进入它

kubectl exec pod-name-you-just-got -it -- /bin/bash

启用授权

p4 protect -o > protections.p4s

在谷歌搜索结果中,管理员的用户名是super,但在我的protection.p4s中我只看到一个root。没关系,只需为root设置密码

p4 -u root passwd

现在你可以使用root和密码连接到Perforce服务器,地址是your-domain:30222

你可以使用p4admin GUI客户端以root身份连接,并创建具有正常权限的用户以进行日常开发。

参考

@2024-05-18 16:20