極致成本,如何基於容器計算服務 ACS 打造企業級幻獸帕魯私服 SaaS 服務?

作者:韓運韜(青熾)

《幻獸帕魯》是一款最近大熱的開放世界生存遊戲。據報道。上市不到一週,《幻獸帕魯》銷量已突破 700 萬份,成爲名副其實的現象級遊戲。根據遊戲數據庫網站 SteamDB 的數據顯示,《幻獸帕魯》Steam 同時在線人數最高達到 201 萬,成爲史上同時在線玩家數量最高的付費遊戲之一。

在遊戲中,玩家可以和隊友一起,收集神奇又可愛的生物“帕魯”,並與他們一道探索、建造和戰鬥。開發商 Pocketpair 提供了官方的私服方案,可以突破官方服務器的 4 人組侷限制,並推薦廣大玩家採用。本文將介紹如何使用容器計算服務 ACS,以私服服務商視角,打造低成本的企業級幻獸帕魯私服 SaaS 服務。

部署您的第一個容器化帕魯私服

阿里雲容器計算服務 ACS (Alibaba Cloud Container Compute Service) 是以 K8s 爲使用界面提供容器算力資源的雲計算服務,提供符合容器規範的算力資源。算力交付模式爲 Serverless 形態,您無需關注底層節點及集羣的運維管理。

使用 ACS,您可以以熟悉的 K8s 界面實現 SaaS 層業務邏輯,而不必過多學習雲產品 OpenAPI。

創建 ACS 集羣

進入容器計算服務控制檯,進入【集羣】菜單,點擊【創建集羣】。

按照要求配置合適的資源,注意勾選【使用 EIP 暴露 API Server】。

獲取 KubeConfig,連接集羣

待集羣創建完畢後,您可以進入集羣詳情頁,在【集羣信息】-【連接信息】中找到 KubeConfig 用於本地連接集羣,或直接點擊右上角【通過 CloudShell 管理集羣】打開 Web Terminal。

開始部署

先通過 kubectl 創建一個 namespace:palworld。

kubectl create ns palworld

通過 kubectl 在集羣中 apply 以下 yaml 內容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: palworld-cm
  namespace: palworld
data:
  PUID: "1000" # 服務器運行時的用戶的 UID
  PGID: "1000" # 服務器運行時的組的 GID
  PORT: "8211" # 遊戲本地客戶端連接的端口
  PLAYERS: "16" # 可同加入服務器的最大玩家數
  SERVER_PASSWORD: "worldofpals" # 服務器密碼
  MULTITHREADING: "true"
  RCON_ENABLED: "true"
  RCON_PORT: "25575" # RCON 連接端口
  TZ: UTC # 備份服務器時所使用的時間戳
  COMMUNITY: "false"  # 服務器是否顯示在社區服務器頁中
  SERVER_DESCRIPTION: ""
---
apiVersion: v1
kind: Secret
metadata:
  name: palworld-secrets
  namespace: palworld
type: Opaque
stringData:
  rconPassword: yourRconPassword
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: palworld-server
  name: palworld-server
  namespace: palworld
spec:
  ports:
  - name: server
    port: 8211
    protocol: UDP
    targetPort: server
  - name: query
    port: 27015
    protocol: UDP
    targetPort: query
  selector:
    app: palworld-server
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: palworld-server
  name: palworld-server
  namespace: palworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: palworld-server
  template:
    metadata:
      labels:
        app: palworld-server
        alibabacloud.com/instance-type: standard # ACS通用型實例
    spec:
      containers:
        - name: palworld-server
          image: thijsvanloef/palworld-server-docker
          imagePullPolicy: IfNotPresent
          resources:
            limits:
              cpu: 4
              memory: 16Gi
            requests:
              cpu: 4
              memory: 16Gi
          ports:
            - containerPort: 8211
              name: server
              protocol: UDP
            - containerPort: 27015
              name: query
              protocol: UDP
          env:
            - name: ADMIN_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: palworld-secrets
                  key: rconPassword
          envFrom:
            - configMapRef:
                name: palworld-cm
          volumeMounts:
            - mountPath: /palworld
              name: datadir
      volumes:
      - name: datadir
        persistentVolumeClaim:
          claimName: palworld-nas
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: palworld-nas
  namespace: palworld
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Pi
  storageClassName: alicloud-nas

在上例中,我們創建了:

  1. 帕魯私服所需的相關配置項
  2. 帕魯私服的 Deployment
    1. 這裏我們使用了社區提供的鏡像:thijsvanloef/palworld-server-docker
    2. 由於遊戲服務實例是有內存狀態的,所以我們 replicas 保持爲 1 即可
    3. 官方推薦的 4c16g 規格在入門場景中遠遠過剩,建議您將起步規格優化爲 4c8g 或更低,以節省成本。ACS 基於 Kubernetes 的使用界面,支持 cpu/memory 的 1:1~1:8 自由配比。相比於傳統方案,讓規格變配更簡單
  1. 帕魯私服所需的 PVC,以將遊戲的狀態持久化到外部
    1. 這裏我們使用了 alicloud-nas 存儲類,不要爲 10Pi 這個值感到害怕,NAS 是按量付費的,10Pi 只是表示最大容量
  1. 基於 LoadBalancer 的 Service
    1. 遊戲服務需要以 UDP 協議暴露出去

當 Pod palworld-server 的狀態爲 Running,玩家就可以通過《幻獸帕魯》遊戲客戶端與小夥伴愉快的聯機啦:

當然,以上只是單個私服實例的部署示例,在商業化場景中,您可能需要將上述 YAMl 封裝爲 Helm Chart 以簡化部署步驟(這裏有個社區的參考案例 [ 1] ),或嘗試阿里雲開源的 OpenKruiseGame [ 2] 來實現更高級的運維能力。

ACS 如何極致降本

作爲 SaaS 化私服服務商,我們需要儘可能的壓低資源成本。在私服 SaaS 的商業模式中,雲資源佔據成本的主要部分,如何儘可能降低雲資源成本,成爲了業務成功的關鍵。

Serverless K8s,無需關心資源碎片

作爲 SaaS 服務商,我們不可避免地會根據不同用戶的需求提供不同等級的服務。也就是說,我們將同時運行着大小不一的各種規格實例。

如下圖右側所示,在標準的 Kubernetes 方案中,對於大規格實例(如支持 20 人以上),可能將直接佔滿一臺 4c32g 的機器;而對於小規格實例和中規格實例,在一個 4c32g 的 Node 上運行必然會產生一些資源碎片,無形中消耗着成本。

而在 ACS 中,我們無需關心節點概念和背後的調度細節。如下圖左側所示,ACS 會爲每個不同規格的實例分配對應的資源,用戶只需按量付費,不用擔心資源碎片產生的浪費。

全棧 Serverless,不只是計算

除了計算資源本身,我們在上例中使用的網絡和存儲資源默認也是 Serverless 化的。

上例中,我們創建了 type: LoadBalancer 的 Service 資源,該資源將默認創建對應的按量付費的阿里雲 CLB 實例。當沒有玩家使用私服時,CLB 實例將不產生費用。

上例中,我們還使用 alicloud-nas 存儲類創建了 PVC 資源,當 PV 產生時,該資源將默認創建按量付費的阿里雲 NAS 實例。按量付費的 NAS 實例將按照實際的存儲量進行扣費,對於遊戲私服這種存儲量低的場景將極具成本優勢。

遊戲業務具有明顯的峯谷特徵,SaaS 廠商完全可以基於業務屬性對私服實例進行開服、停服以節省成本。

例如,在業務上巡檢私服實例,當發現玩家數保持爲 0 的五分鐘後,將私服實例副本數縮 0。此時對應的 ACS Pod 將不進行計費,CLB 由於服務停止也幾乎不產生流量費用,只有 NAS 實例將爲該私服的持久化數據收記少量費用。

同時,可以在業務上要求用戶需主動觸發開服操作(可以在用戶“獲取服務器信息”的時候觸發),此時將對應實例副本數置爲 1。

通過這種業務設計,結合容器計算服務 ACS 的全棧 Serverless 特性,將爲 SaaS 服務商大幅降低成本。而 ACS 本身所支持的 K8s 操作界面也爲業務縮放提供了便利。

任務型工作負載大幅降本

私服 SaaS 服務商可能對不同的用戶提供不同的差異化方案。如果服務商希望通過提供較低 SLA 保障的方案挖掘下沉市場,或是需要通過免費版拉新,則可以充分利用容器計算服務 ACS 的任務型工作負載進一步大幅降低成本。

在上例中,我們使用了 ACS 的默認實例類型:通用型實例去創建 palworld-server 工作負載。即爲 spec.template.labels 加上了如下標籤:

alibabacloud.com/instance-type: standard

通用型實例也是 ACS 默認的 Pod 實例類型,適合大部分延遲敏感型工作負載。在大多數場景中,通用型工作負載能夠取得性能與經濟性的平衡。

而對於延遲不敏感、性能不敏感的場景,我們可以使用 ACS 任務型實例大幅降本:

alibabacloud.com/instance-type: best-effort

與通用型、獨享型實例相比,使用任務型實例可以節省相當可觀的資源成本。任務型實例使用的 vCPU 與宿主機節點的物理 CPU 並不是嚴格綁定的,實例進程在運行過程中會被隨機調度到任何空閒的 vCPU 超線程上,不同類型實例的 vCPU 會分時共享物理 CPU 資源,在宿主機節點低負載時,任務型實例可以獲得較好的算力性能,在高負載時可能會出現 CPU 算力受限的情況。

通常來說,在相同規格的情況下,受操作系統調度算法影響,任務型實例整體生命週期內的 CPU 算力基準低於通用型實例。下圖展示了一個視頻轉碼應用,在通用型和任務型實例類型下的運行時間情況對比。

🔔 注意: ACS 對任務型實例的運行時長有限制。在邀測期間,單個實例的最大運行時長爲 24 小時。

寫在最後

以上就是容器計算服務 ACS 在私服 SaaS 服務商場景的使用案例。ACS 目前正處於邀測階段,歡迎您申請試用體驗, 我們會在 5 個工作日左右短信通知您申請結果,感謝您的支持與關注!

歡迎試用體驗 ACS:https://survey.aliyun.com/apps/zhiliao/cI5zaVVCs

相關鏈接:

[1] 社區的參考案例

https://github.com/thijsvanloef/palworld-server-docker/blob/main/charts/palworld/README.md

[2] OpenKruiseGame

https://openkruise.io/zh/kruisegame/introduction/

點擊此處,申請試用 ACS。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章