Автор оригинала: 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 .