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

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


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


  • quake-kube;
  • inlets-operator;
  • k3sup;
  • arkade.

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


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

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

  • «Полноценный Kubernetes с нуля на Raspberry Pi»;
  • «Приключения с домашним Kubernetes-кластером».
Источник: https://habr.com/ru/company/flant/blog/532452/


Интересные статьи

Интересные статьи

Can I just once again state my love for [WireGuard] and hope it gets merged soon? Maybe the code isn't perfect, but I've skimmed it, and compared to the horrors that are OpenVPN and IPS...
На прошлую статью, где мы рассмотрели три оператора PostgreSQL для Kubernetes (Stolon, Crunchy Data и Zalando), поделились своим выбором и опытом эксплуатации, — поступила отличная об...
В современном мире Kubernetes-облаков, так или иначе, приходится сталкиваться с ошибками в программном обеспечении, которые допустил не ты и не твой коллега, но решать их придется тебе. Данная ст...
Привет Хабр. Raspberry Pi наверное есть дома почти у каждого, и рискну предположить, что у многих она валяется без дела. А ведь Raspberry это не только ценный мех, но и вполне мощный fanless-к...
В апреле ко мне постучались организаторы Слёрм — курсов по Kubernetes — потестировать и рассказать своё впечатление: Дмитрий, Слёрм — это трехдневный интенсив по Kubernetes, плотное учебное ...