Quake III Arena, Kubernetes (k3s) и Raspberry Pi

от автора

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

Вчера у себя в ленте я увидел этот твит от 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     <none>                            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 в работе можно увидеть/попробовать здесь.

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

ссылка на оригинал статьи https://habr.com/ru/company/flant/blog/532452/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *