Установка локального Кубернетес кластера

27 Jun 2023 время чтения 3 мин kubernetes

Про кубернетес сейчас слышно везде. K8S это круто, ускоряет разработку, помогает строить микро сервисы да вообще что это решение всех проблем, одним словом панацея.

Конечно это не так, и чтобы понять какие достоинства и недостатки есть у данной технологии нужно запускать, пробовать разные подходы, экспериментировать. Но как начать? Есть много разных предложений для готового кластера как GKE, Amazon EKS, Managed Kubernetes от DO, Yandex Managed Service for Kubernetes итп.

Все эти сервисы несомненно удобные, но имеют не совсем понятную ценовую политику с которой нужно разобраться прежде чем начать эксплуатацию кластера.

К счастью есть также много предложений для локального развертывания кластера. Например, minikube, k3d, kind.

Я покажу вам как развертывать кластер с помощью k3d. С моей точки зрения, это самый экономный, по ресурсам, вариант так как использует облегченный дистрибутив кубернетеса под названием k3s. Так же у k3d есть возможность декларации всех настроек в конфигурационном файле. Такого функционала я не наблюдал в других инструментах и считаю его одним из важнейших для современных приложений.

Установка

K3D написан в golang из-за чего инсталляция происходит простым способом. Качаем бинарный файл и добавляем его в директорию которая есть в нашей переменной PATH. На официальной странице k3d для этого есть script инсталляции.

wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

Настройка

Чтобы запустить новый кластер нужна всего лишь одна команда.

k3d cluster create my-cluster

Таким образом у вас будет кластер с которым уже можно работать. Но как я уже говорил k3d отличается тем что есть возможность запускать кластеры с помощью конфигурационного файла.

Для этого используется yaml манифест который похож на описание ресурсов в кубернетесе. Создайте файл с названием cluster.yaml со следующим содержанием.

# cluster.yaml
---
apiVersion: k3d.io/v1alpha4
kind: Simple
metadata:
  name: multi-node-cluster
servers: 1
agents: 2
image: docker.io/rancher/k3s:v1.24.4-k3s1
volumes:
  - volume: "${PWD}/custom-resources:/var/lib/rancher/k3s/server/manifests/custom-charts"
    nodeFilters:
      - server:0

Обратите внимание на строку с томом который подключается внутрь кластера. Создадим эту папку чтобы мы могли использовать нашу конфигурацию и снова запускаем создание кластера.

mkdir custom-resources

# стираем первый кластер который мы создали в этой статье.
k3d cluster delete my-cluster

# запускаем новый используя при этом наш конфигурационный файл.
k3d cluster create -c cluster.yaml

Теперь у вас есть кластер, который состоит уже из нескольких узлов. Но теперь для разработки нам нужны какие-то сервисы как БД. Как раз для этого мы и создали пупку custom-resources.

K3S всегда наблюдает за папкой /var/lib/rancher/k3s/server/manifests/ и если находит в ней манифесты описывающие ресурсы непременно применяет их в кластер.

Создадим например вот такой манифест. И положим его в папку custom-resources

# database.yml
---
kind: Namespace
apiVersion: v1
metadata:
  name: database
  labels:
    name: database
---
kind: Pod
apiVersion: v1
metadata:
  name: database
  namespace: database
  labels:
    name: database
spec:
  containers:
    - name: mariadb
      image: mariadb
      ports:
        - containerPort: 3366
      env:
        - name: MARIADB_ROOT_PASSWORD
          value: "very-secure"

Вот как это выглядит

После того как мы положили файл в папку custom-resources БД сразу была поднята. Так можно делать с любыми ресурсами кубернетеса. Дополнительно можно декларировать helm charts таким же образом.

Итог

Как видите старт такого локального кластера почти не занимает время. Если вы работает с кластером то k3d можно использовать чтобы с легкостью заменить docker-compose. Есть еще много возможностей управлять кластером через конфигурационный файл.

Запустив этот файл в гит всегда будет актуальная версия локального окружения.