В этой главе мы подготовим кластер Kubernetes, Container Registry и локальное окружение для развертывания приложений.

Развертывание кластера

Выберите, каким образом будет развернут Kubernetes:

Установка и запуск minikube

Установим/обновим minikube, следуя инструкциям проекта. Убедимся, что у нас используется самая свежая версия minikube, доступная по приведённой ссылке.

Порт 80 должен быть свободен.

Создаём новый Kubernetes-кластер с minikube:

minikube delete  # удалим существующий minikube-кластер (если он есть)
minikube start --driver=docker --namespace werf-guided-rails

Если утилита kubectl всё ещё не установлена, то установим её, следуя инструкциям.

Теперь проверим работоспособность нового кластера Kubernetes:

kubectl get --all-namespaces pod  # должно показать список всех Pod'ов, запущенных в кластере

Если все Pod’ы из полученного списка находятся в состояниях Running или Completed (4-й столбец), а в 3-м столбце (в выражениях вроде 1/1) цифра слева от / равна цифре справа (т.е. контейнеры Pod’а успешно запустились) — кластер Kubernetes запущен и работает. Если не все Pod’ы успешно запустились, то подождите и снова выполните команду выше для получения статуса всех Pod’ов.

Установка NGINX Ingress Controller

Устанавливаем NGINX Ingress Controller:

minikube addons enable ingress

Немного подождём, после чего убедимся, что Ingress Controller успешно запустился:

kubectl -n ingress-nginx get pod

Сделаем NGINX Ingress Controller доступным на 80-м порту после запуска minikube tunnel:

kubectl expose service -n ingress-nginx ingress-nginx-controller --name ingress-nginx-controller-lb --type LoadBalancer --port 80 --target-port http

Важно проверить, что в нашей системе не занят 80-й порт. Следующая команда должна выдать пустой результат:

netstat -anb | grep :80

В случае если порт занят, то результат будет подобным:

TCP     0.0.0.0:80        0.0.0.0:0       LISTENING
TCP     [::]:80           [::]:0          LISTENING

— в этом случае необходимо найти и остановить запущенный сервер.

Теперь нам надо не забывать держать запущенным minikube tunnel в отдельном окне PowerShell. Это необходимо для доступа с нашего хоста к ресурсам в кластере через Ingress:

minikube tunnel --cleanup=true

Обновление файла hosts

Для доступа к приложению мы будем использовать домен example.com. Для этого обновим файл hosts (в PowerShell от администратора):

Add-Content "C:\Windows\System32\drivers\etc\hosts" "`n127.0.0.1 example.com kubernetes-basics-app.example.com"

Установка и запуск minikube

Установим/обновим minikube, следуя инструкциям проекта. Убедимся, что у нас используется самая свежая версия minikube, доступная по приведённой ссылке.

Порт 80 должен быть свободен.

Создаём новый Kubernetes-кластер с minikube:

minikube delete  # удалим существующий minikube-кластер (если он есть)
minikube start --driver=hyperkit --namespace werf-guided-rails

Если утилита kubectl всё ещё не установлена, то установим её, следуя инструкциям.

Теперь проверим работоспособность нового кластера Kubernetes:

kubectl get --all-namespaces pod  # должно показать список всех Pod'ов, запущенных в кластере

Если все Pod’ы из полученного списка находятся в состояниях Running или Completed (4-й столбец), а в 3-м столбце (в выражениях вроде 1/1) цифра слева от / равна цифре справа (т.е. контейнеры Pod’а успешно запустились) — кластер Kubernetes запущен и работает. Если не все Pod’ы успешно запустились, то подождите и снова выполните команду выше для получения статуса всех Pod’ов.

Установка NGINX Ingress Controller

Устанавливаем NGINX Ingress Controller:

minikube addons enable ingress

Немного подождём, после чего убедимся, что Ingress Controller успешно запустился:

kubectl -n ingress-nginx get pod

Обновление файла hosts

Для доступа к приложению мы будем использовать домен example.com. Для этого обновим файл hosts:

echo "$(minikube ip) example.com kubernetes-basics-app.example.com" | sudo tee -a /etc/hosts

Установка и запуск minikube

Установим/обновим minikube, следуя инструкциям проекта. Убедимся, что у нас используется самая свежая версия minikube, доступная по приведённой ссылке.

Порт 80 должен быть свободен.

Создаём новый Kubernetes-кластер с minikube:

minikube delete  # удалим существующий minikube-кластер (если он есть)
minikube start --driver=docker --namespace werf-guided-rails

Если утилита kubectl всё ещё не установлена, то установим её, следуя инструкциям.

Теперь проверим работоспособность нового кластера Kubernetes:

kubectl get --all-namespaces pod  # должно показать список всех Pod'ов, запущенных в кластере

Если все Pod’ы из полученного списка находятся в состояниях Running или Completed (4-й столбец), а в 3-м столбце (в выражениях вроде 1/1) цифра слева от / равна цифре справа (т.е. контейнеры Pod’а успешно запустились) — кластер Kubernetes запущен и работает. Если не все Pod’ы успешно запустились, то подождите и снова выполните команду выше для получения статуса всех Pod’ов.

Установка NGINX Ingress Controller

Устанавливаем NGINX Ingress Controller:

minikube addons enable ingress

Немного подождём, после чего убедимся, что Ingress Controller успешно запустился:

kubectl -n ingress-nginx get pod

Обновление файла hosts

Для доступа к приложению мы будем использовать домен example.com. Для этого обновим файл hosts:

echo "$(minikube ip) example.com kubernetes-basics-app.example.com" | sudo tee -a /etc/hosts

Проверка

Для проверки работоспособности необходимо открыть страницу в браузере или использовать сurl в консоли:

curl http://example.com

Если всё работает как надо, то NGINX Ingress Controller вернёт ошибку 404:

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

Если у вас уже поднято приложение, на которое смотрит Ingress с доменом example.com, то вместо ошибки 404 вы получите ответ от своего приложения.

Настройка Container Registry

Далее мы будем использовать Docker Hub Container Registry, но для этого руководства подойдет и любой другой Registry с TLS и аутентификацией (GitHub Container Registry, GitLab Container Registry, …).

Регистрируемся на Docker Hub, после чего создаём приватный репозиторий с именем werf-guided-rails, в котором будем хранить собираемые образы.

С помощью docker login получаем доступ с текущего компьютера к новому репозиторию, вводя логин и пароль от нашего пользователя на Docker Hub:

$ docker login
Username: <имя пользователя Docker Hub>
Password: <пароль пользователя Docker Hub>
Login Succeeded

Создаём Secret в кластере, который поможет получить доступ к новому репозиторию уже нашим будущим приложениям:

kubectl create namespace werf-guided-rails  # namespace для Secret'а ещё не существует, создадим его
kubectl create secret docker-registry registrysecret \
  --docker-server='https://index.docker.io/v1/' \
  --docker-username='<имя пользователя Docker Hub>' \
  --docker-password='<пароль пользователя Docker Hub>'

Стоит обратить внимание на опцию --docker-server, параметр которой должен соответствовать адресу используемого регистри. К примеру, для GitHub Container Registry необходимо иcпользовать ghcr.io, а для Docker Hub можно обойтись без опции, использовать значение по умолчание.

Теперь окружение для работы готово.