[Перевод] Quake III Arena, Kubernetes (k3s) и Raspberry Pi

Прим. перев.: казалось бы, еще недавно сочетание из заголовка казалось невозможным безумием. Мир не стоит на месте, и это безумие стало не просто возможным, а даже по-настоящему простым в реализации. Подтверждение читайте ниже в переводе соответствующей инструкции от Johan Siebens — облачного архитектора из Бельгии.

h1gfbhlx3wbg5alyyvgozns6lha.jpeg

Вчера у себя в ленте я увидел этот твит от Chris Campbell:


Ох, воспоминания… Quake III Arena — один из моих самых любимых шутеров от первого лица.

В прошлом я потратил (и потерял) немало времени, играя в эту динамичную игру с друзьями и врагами. Теперь, благодаря проекту QuakeKube от Capital One Tech, для нее открыт мир контейнеров и Kubernetes.

QuakeKube представляет собой Kubernetes’ированную версию QuakeJS. Для этого в соответствующем deployment’е запускается выделенный сервер Quake 3, к которому клиенты подключаются через QuakeJS в браузере.


Конечно, мне не терпелось испробовать этот проект, особенно после того, как в документации увидел следующее:

Контейнерные образы кросс-компилируются с помощью Docker Buildx и могут запускаться на железе с различными архитектурами и операционными системами. В настоящее время доступны версии под linux/amd64 и linux/arm64.


Поддержка ARM64! Класс, значит я могу запустить Quake на одном из своих Raspberry Pi! (Прим. перев.: далее в статье будет рассмотрен вариант установки k3s на Raspberry Pi, а если вас интересует обычный [vanilla] Kubernetes — об этом мы недавно писали.)

Что ж, давайте постреляем!


Основную часть работы уже проделали другие энтузиасты, поэтому при наличии соответствующих инструментов и готового плана для запуска игры потребуется всего несколько минут.

Требования


  • Raspberry Pi с Ubuntu 20.04 с поддержкой ARM64;
  • k3sup — легковесная утилита для автоматической установки и настройки k3s на любой локальной или удаленной виртуальной машине;
  • arkade — простой CLI на Golang со строго определяемыми флагами, позволяющий легко и непринужденно устанавливать чарты и приложения в кластер;
  • kubectl;
  • учетная запись в DigitalOcean и API-токен.


Установка и настройка


Прежде всего установите k3s на Raspberry Pi с ARM64-совместимой операционной системой вроде Ubuntu 20.04:

$ k3sup install --ip 192.168.0.52 --user ubuntu --k3s-extra-args '--no-deploy servicelb --no-deploy traefik'


После установки k3s на Raspberry Pi k3sup также загружает необходимый файл kubeconfig в текущий рабочий каталог. Настройте kubectl на использование этого конфига:

$ export KUBECONFIG=$(pwd)/kubeconfig


Теперь с помощью arcade установите inlets-operator:

$ arkade install inlets-operator --provider digitalocean --token-file ~/do-api-token


Inlets-operator создаст так называемый inlets exit-node в DigitalOcean, т.е. обеспечит публичный IP-адрес для сервисов LoadBalancer закрытого кластера k3s.

Для этого будет достаточно OSS-версии inlets, поскольку клиенты подключаются к серверу через QuakeJS в браузере с websocket’ами. Если нужна поддержка TLS и т.п., рекомендую обратить внимание на PRO-версию.

Наконец, возьмите YAML-файл QuakeKube из репозитория проекта на GitHub и внесите в него соответствующие изменения. Сервис необходимо заменить на LoadBalancer (вместо NodePort). Также можно настроить параметры самой игры по своему желанию.

Пример YAML-конфигурации для QuakeKube:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: quakejs
spec:
  selector:
    matchLabels:
      run: quakejs
  replicas: 1
  template:
    metadata:
      labels:
        run: quakejs
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '8080'
    spec:
      containers:
      - command:
        - q3
        - server
        - --config=/config/config.yaml
        - --content-server=http://localhost:9090
        - --agree-eula
        image: docker.io/criticalstack/quake:v1.0.5
        name: server
        ports:
        - containerPort: 8080
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 5
        volumeMounts:
        - name: quake3-server-config
          mountPath: /config
        - name: quake3-content
          mountPath: /assets
      - command:
        - q3
        - content
        - --seed-content-url=http://content.quakejs.com
        image: docker.io/criticalstack/quake:v1.0.5
        name: content-server
        ports:
        - containerPort: 9090
        volumeMounts:
        - name: quake3-content
          mountPath: /assets
      volumes:
        - name: quake3-server-config
          configMap:
            name: quake3-server-config
        - name: quake3-content
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: quakejs
spec:
  type: LoadBalancer
  selector:
    run: quakejs
  ports:
    - port: 80
      targetPort: 8080
      name: http
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: quake3-server-config
data:
  config.yaml: |
    fragLimit: 25
    timeLimit: 15m
    bot:
      minPlayers: 3
    game:
      motd: "Welcome to Critical Stack"
      type: FreeForAll
      forceRespawn: false
      inactivity: 10m
      quadFactor: 3
      weaponRespawn: 3
    server:
      hostname: "quakekube"
      maxClients: 12
      password: "changeme"
    commands:
      - addbot sarge 2
    maps:
    - name: q3dm7
      type: FreeForAll
      timeLimit: 10m
    - name: q3dm17
      type: FreeForAll
    - name: q3wctf1
      type: CaptureTheFlag
      captureLimit: 8
    - name: q3tourney2
      type: Tournament
    - name: q3wctf3
      type: CaptureTheFlag
      captureLimit: 8
    - name: ztn3tourney1
      type: Tournament


Запуск


Примените этот манифест к кластеру k3s:


$ kubectl apply -f example.yaml 
deployment.apps/quakejs created
service/quakejs created
configmap/quake3-server-config created


Дождитесь, пока все pod’ы станут running, а inlets-operator создаст свой exit-node:


$ kubectl get pods,service
NAME                                         READY   STATUS    RESTARTS   AGE
pod/inlets-operator-76fb794578-s2fg4         1/1     Running   0          147m
pod/quakejs-tunnel-client-6f7c986dfc-mdt5w   1/1     Running   0          50s
pod/quakejs-786cc496b-g7b7n                  2/2     Running   0          80s

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP                       PORT(S)        AGE
service/kubernetes   ClusterIP      10.43.0.1                                 443/TCP        152m
service/quakejs      LoadBalancer   10.43.46.33   143.110.174.204,143.110.174.204   80:32116/TCP   80s


И все! Запускайте любимый браузер, загружайте приложение и начинайте палить во все стороны!

Полезные ссылки


P.S. от переводчика


Демонстрацию QuakeJS в работе можно увидеть/попробовать здесь.

Читайте также в нашем блоге:

© Habrahabr.ru