Рубрики
Без рубрики

Самовосстановление приложений с Kubernetes и весенняя загрузка

Узнайте, как сплести Kubernetes, Docker и Boot вместе, чтобы создать приложения, которые самовосхитуются.

Автор оригинала: Daniel Barrigas.

1. Введение

В этом учебнике, мы будем говорить о Кубернетес ‘ы зонды и продемонстрировать, как мы можем использовать Актуатор ‘ы ЗдоровьеИндикатор иметь точное представление о состоянии нашей заявки.

Для целей этого учебника, мы собираемся взять на себя некоторые уже существующий опыт работы с Spring Boot Actuator , Kubernetes , и Docker .

2. Зонды Kubernetes

Кубернетес определяет два различных зонда, которые мы можем использовать, чтобы периодически проверять, работает ли все как ожидалось: живость и готовность .

2.1. Живость и готовность

ивовый прут Вся живость и готовность Зонды Кубелет может действовать, как только он обнаруживает, что что-то выключено и свести к минимуму время простоя нашего приложения.

Оба настроены одинаково, но они имеют различную семантику и Кубелет выполняет различные действия в зависимости от того, какой из них срабатывает:

  • ГотовностьГотовность проверяет, если наши Под готов начать прием трафика. Наша P od готов, когда все его контейнеры будут готовы
  • Liveness – Вопреки готовность , живость проверяет, если наши Под должны быть перезапущены. Он может подобрать случаи использования, когда наше приложение работает, но находится в состоянии, когда оно не в состоянии добиться прогресса; например, он находится в тупике

Мы настраиваем оба типа зондов на уровне контейнера:

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 2
      failureThreshold: 1
      successThreshold: 1
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20
      timeoutSeconds: 2
      failureThreshold: 1
      successThreshold: 1

Есть ряд полей, которые мы можем настроить, чтобы более точно контролировать поведение наших зондов:

  • первоначальныеДелайСекунды – После создания контейнера, ждать n секунд до начала зонда
  • периодВторыеКак часто этот зонд должен быть запущен , по умолчанию до 10 секунд; минимум 1 секунда
  • тайм-аутВторыеКак долго мы ждем до тайминга зонда, по умолчанию до 1 секунды; минимум снова 1 секунда
  • неудачаТресхолд – Попробуйте n раз, прежде чем отказаться . В случае готовность , наш стручок будет помечен как не готов, в то время как сдаваться в случае живость означает перезапуск Под . По умолчанию здесь 3 сбоя, при этом минимум 1
  • успехТресхолд – Это минимальное количество последовательных успехов для зонда, который будет считаться успешным после того, как . Он по умолчанию до 1 успеха и его минимум 1, а также

В этом случае мы выбрали tcp зонд, однако, Есть и другие типы зондов мы можем использовать, тоже.

2.2. Типы зондов

В зависимости от нашего случая использования, один тип зонда может оказаться более полезным, чем другой. Например, если наш контейнер является веб-сервером, используя http зонд может быть более надежным, чем tcp зонд.

К счастью, Кубернетес имеет три различных типа зондов, которые мы можем использовать:

  • ExecВыполняет Баш инструкции в нашем контейнерном . Например, проверьте наличие определенного файла. Если инструкция возвращает код сбоя, зонд выходит из строя
  • tcpSocket – Пытается создать tcp подключение к контейнеру с использованием указанного портового . Если не удается установить соединение, зонд выходит из строя
  • httpGetОтправляет запрос HTTP GET на сервер который работает в контейнере и слушается в указанном порту. Любой код больше или равен 200 и менее 400 указывает на успех

Важно отметить, что HTTP зонды имеют дополнительные поля, помимо тех, которые мы упоминали ранее:

  • принимающих – Хост-имя для подключения к IP нашей капсулы по умолчанию
  • схема – Схема, которая должна быть использована для подключения, HTTP или HTTPS , с дефолтом HTTP
  • путь – Путь к доступу на веб-сервере
  • httpHeaders – Пользовательские заготовки для настройки в запросе
  • портовые – Имя или номер порта для доступа в контейнере

3. Весенний актуатор и Kubernetes Самовосстановления возможностей

Теперь, когда у нас есть общее представление о том, Кубернетес может обнаружить, если наше приложение находится в нарушенном состоянии, давайте посмотрим, мы может взять преимущество Весенний Актуатор чтобы внимательно следить за не только на нашем приложении, но и на его зависимости!

Для целей этих примеров, мы собираемся полагаться на Minikube .

3.1. Актуатор и его медико-медицинскиеиндикаторы

Учитывая, что Весна имеет ряд ЗдоровьеИндикатор готовы к использованию, отражая состояние некоторых зависимостей нашего приложения от Кубернетес Зонды так же просто, как добавить Актуатор зависимость от нашей пом.xml:


    org.springframework.boot
    spring-boot-starter-actuator

3.2. Пример живости

Начнем с приложения, которое будет загрузки нормально и, после 30 секунд будет переходный сломанные государственные .

Мы будем подражать разбитое состояние к создание системы HealthIndicator который проверяет, если булеан переменная истинное . Мы инициализируем переменную для истинное , а затем мы запланим задачу, чтобы изменить его на ложные через 30 секунд:

@Component
public class CustomHealthIndicator implements HealthIndicator {

    private boolean isHealthy = true;

    public CustomHealthIndicator() {
        ScheduledExecutorService scheduled =
          Executors.newSingleThreadScheduledExecutor();
        scheduled.schedule(() -> {
            isHealthy = false;
        }, 30, TimeUnit.SECONDS);
    }

    @Override
    public Health health() {
        return isHealthy ? Health.up().build() : Health.down().build();
    }
}

С нашими ЗдоровьеИндикатор на месте, мы должны докеризировать наше приложение:

FROM openjdk:8-jdk-alpine
RUN mkdir -p /usr/opt/service
COPY target/*.jar /usr/opt/service/service.jar
EXPOSE 8080
ENTRYPOINT exec java -jar /usr/opt/service/service.jar

Далее мы создаем нашу Кубернетес шаблон:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: liveness-example
spec:
  ...
    spec:
      containers:
      - name: liveness-example
        image: dbdock/liveness-example:1.0.0
        ...
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          timeoutSeconds: 2
          periodSeconds: 3
          failureThreshold: 1
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 20
          timeoutSeconds: 2
          periodSeconds: 8
          failureThreshold: 1

Мы используем httpGet зонд, указывающий на Актуатор конечной точки здоровья. Любые изменения в состоянии приложения (и его зависимостях) будут отражены в работе нашего развертывания.

После развертывания нашего приложения в Кубернетес , мы сможем увидеть оба зонда в действии: примерно через 30 секунд, наши Под будут помечены как не готовые и удалены от вращения; несколько секунд спустя, Под перезапускается.

Мы видим события нашей Под выполнение кубектл описать стручок живость-пример :

Warning  Unhealthy 3s (x2 over 7s)   kubelet, minikube  Readiness probe failed: HTTP probe failed ...
Warning  Unhealthy 1s                kubelet, minikube  Liveness probe failed: HTTP probe failed ...
Normal   Killing   0s                kubelet, minikube  Killing container with id ...

3.3. Пример готовности

В предыдущем примере мы видели, как мы могли бы использовать ЗдоровьеИндикатор чтобы отразить состояние нашего приложения на здоровье Кубернетес развёртывание.

Давайте использовать его на другой случай использования: предположим, что наше приложение потребности немного время до это способны получать трафик . Например, он должен загрузить файл в память и проверить его содержимое.

Это хороший пример того, когда мы можем воспользоваться готовность зонд.

Давайте изменим ЗдоровьеИндикатор и Кубернетес шаблон из предыдущего примера и адаптировать их к этому примеру использования:

@Component
public class CustomHealthIndicator implements HealthIndicator {

    private boolean isHealthy = false;

    public CustomHealthIndicator() {
        ScheduledExecutorService scheduled =
          Executors.newSingleThreadScheduledExecutor();
        scheduled.schedule(() -> {
            isHealthy = true;
        }, 40, TimeUnit.SECONDS);
    }

    @Override
    public Health health() {
        return isHealthy ? Health.up().build() : Health.down().build();
    }
}

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: readiness-example
spec:
  ...
    spec:
      containers:
      - name: readiness-example
        image: dbdock/readiness-example:1.0.0
        ...
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 40
          timeoutSeconds: 2
          periodSeconds: 3
          failureThreshold: 2
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 100
          timeoutSeconds: 2
          periodSeconds: 8
          failureThreshold: 1

Хотя похожи, Есть несколько изменений в конфигурации зондов, которые мы должны отметить:

  • Так как мы знаем, что нашему приложению нужно около 40 секунд, чтобы стать готовым к получению трафика, мы увеличили первоначальныеДелайСекунды нашего готовность зонд до 40 секунд
  • Аналогичным образом, мы увеличили первоначальныеДелайСекунды нашего живость зонд до 100 секунд, чтобы избежать преждевременной смерти Кубернеты

Если он еще не закончился после 40 секунд, он по-прежнему имеет около 60 секунд, чтобы закончить. После этого наши живость зонд будет удар и перезапустить стручок.

4. Заключение

В этой статье мы говорили об Кубернетес зонды и как мы можем использовать весны Актуатор для улучшения мониторинга состояния здоровья нашего приложения.

Полную реализацию этих примеров можно найти более на Github .