08 сентября 2021

☸️ Первое знакомство с Kubernetes: публикация приложения в интернет

Телеграм @Andrey_Totshin
Продолжая знакомиться с Kubernetes, разберемся с проверкой работоспособности приложений (Health check probe) и рассмотрим объект Ingress, который позволит сделать приложения кластера доступными из интернета.
☸️ Первое знакомство с Kubernetes: публикация приложения в интернет

Хочешь уверенно проходить IT-интервью?

Готовься к IT-собеседованиям уверенно с AI-тренажёром T1!

Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.

💡 Почему Т1 тренажёр — это мастхэв?

  • Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше
  • Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
  • Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.

Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!

Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy


Мы уже знаем что оркестратор Kubernetes управляет подами. Кластеру нет разницы, доступно ли приложение внутри пода. Под запустился, и с точки зрения k8s все в порядке. Бывают ситуации, когда под запускается и со стороны k8s все работает, а со стороны пользователя приложение недоступно. Для решения таких проблем существуют проверки работоспособности (Health check probe).

Health check probe

Проверки работоспособности дают кластеру k8s понять, когда с нашим приложением что-то не так и нам нужно зафиксировать это в логах или перезапустить под. Есть два типа проверок: Liveness и Readiness.

Liveness

В этом случае мы определяем работоспособность контейнера. Узнать его состояние можно несколькими способами – это httpGet (запрос HTTP к приложению), tcpSocket (k8s попробует создать соединение на указанный порт вашего приложения) и gRPC (grpc-health-probe). Рассмотрим первые два варианта.

Для приложения с HTTP-сервером определение работоспособности через httpGet выглядит примерно так:

        livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
    

Делается HTTP-запрос к указанным URI и порту (в нашем случае это / на порте 8080). В случае успешного ответа вида 2xx, k8s считает приложение работоспособным. Другой ответ или отсутствие такового говорит о том, что контейнер отключен и его нужно перезапустить.

Разберем параметры:

  • initialDelaySeconds отвечает за задержку в секундах перед началом проверки. Нет такого приложения, которое стартует мгновенно.
  • periodSeconds отвечает за периодичность запуска проверки для защиты от перегрузки. В нашем случае проверка проводится каждые 3 секунды.

Если приложение не умеет обрабатывать HTTP-запросы, можно использовать проверку через tcpSoket:

        livenessProbe:
tcpSocket:
port: 8080

    

Если TCP-соединение будет успешным, k8s считает приложение работоспособным.

Readiness

С технической точки зрения эта проверка похожа на предыдущую. Разница в том, что если мы не проходим Liveness, то под с нашим приложением уходит в перезагрузку, а в случае с провалом Readiness он блокируется на Service. На приложение в этом случае не будет направляться трафик.

Практический кейс
Приложение нормально запустилось и прошло проверку Liveness, но затупило по соединению с БД. На фронтенде пользователи могут видеть устаревшую информацию.

Описать проверку Readiness можно так:

        readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 3
periodSeconds: 3


    

Внимательный читатель увидит, что разница только в одной строчке.

Проверки необходимы для своевременной сигнализации о проблемах и оперативного устранения поломок. Они добавляют стабильности развернутым в кластере Kubernetes приложениям.

Ingress

От проверок переходим к объекту Ingress, который организует сетевое взаимодействие с подами (как Service), но прокидывает трафик на доменное имя и позволяет добраться до приложения из Internet. Еще одна его функция – балансировка трафика, при этом в настройках можно указать правила маршрутизации на определенные Service.

Возможности настройки правил огромные – это материал не на одну статью. Мы коснемся Ingress только для публикации приложения из кластера k8s в Internet.
Схема работы Ingress.
Схема работы Ingress.

Ingress сверху мапится с доменным именем, а снизу – с Service, который обслуживает трафик для подов нашего приложения.

Описать YAML можно так:

        apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
          serviceName: app
          servicePort: 8080


    

Основные моменты:

  • host – ваше доменное имя.
  • serviceNameName Service, который обслуживает приложение.
  • servicePort – порт для сетевого взаимодействия.
Важный нюанс
В настройке записей DNS своего домене указывайте IP-адрес ноды кластера, на которой установлен Ingress. Этот IP должен быть виден из Internet.

В статьях цикла мы сделали следующее:

После публикации приложение в Internet с помощью Ingress архитектурная схема нашего кластера выглядит так:

☸️ Первое знакомство с Kubernetes: публикация приложения в интернет

Забрать файлы YAML можно по ссылке. В следующей статье мы разберемся с Helm (package manager for Kubernetes).

Комментарии

ВАКАНСИИ

Добавить вакансию
Golang-разработчик
Пермь, по итогам собеседования
Hotel Search Team Lead (Golang)
по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ