
Вчера у себя в ленте я увидел этот твит от 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/
Добавить комментарий