Рубрики
Uncategorized

Kubernetes Livensy Probes — Примеры и общие ловушки

Kubernetes нарушил традиционные методы развертывания и стал очень популярным. Хотя это … Помечено кувнями, DevOps, контейнерами, Docker.

Зонды Kubernetes (серия 2 частей)

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

LICIONES -датчики проверьте, является ли стручок здоровым, и если стручок считается нездоровым, это запустит перезапуск; Это действие отличается от действия Прессы готовности, которые я обсуждал в своем предыдущем посте Анкет

Давайте посмотрим на компоненты зондов и погрузимся в то, как настроить и устранять устранение неполадок.

Датчики

Зонды — это проверки здоровья, которые выполняются Кубелетом.

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

  • initialdelayseconds : Время ждать после начала контейнера. (по умолчанию: 0)
  • Периодесные секунды : Частота выполнения зонда (по умолчанию: 10)
  • ВЕСТИКАКАКА : Время ждать ответа (по умолчанию: 1)
  • Успех: Количество успешных выполнений зондов для обозначения здорового контейнера (по умолчанию: 1) FASHURETHRESHOLD
  • : Количество неудачных выполнений зондов, чтобы отметить нездоровый контейнер (по умолчанию: 3)

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

Есть три типа зондов:

Exec rest

Exec grys выполняет команду внутри контейнера без оболочки. Статус выхода команды определяет здоровое состояние — ноль является здоровым; Все остальное нездоровое.

        livenessProbe:
          initialDelaySeconds: 1
          periodSeconds: 5
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 1
          exec:
            command:
            - cat
            - /etc/nginx/nginx.conf

TCP -зонд

Датчик TCP проверяет, может ли подключение TCP подключение на указанном порте. Открытый порт считается успешным, закрытый порт или сброс считается неудачным.

        livenessProbe:
          initialDelaySeconds: 1
          periodSeconds: 5
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 1
          tcpSocket:
            host:
            port: 80

Http -зонд

HTTP -зонд делает вызов HTTP, и код состояния определяет здоровое состояние между включением 200 и исключением 400, считается успешным. Любой код статуса, кроме упомянутого, считается нездоровым.

Вот HTTP -датчики для настройки дополнительных параметров.

  • хост : IP -адрес к подключению (по умолчанию: IP POD)
  • схема : HTTP -схема (по умолчанию: http)
  • Путь : Http path, чтобы вызвать
  • httpheaders : Любые пользовательские заголовки, которые вы хотите отправить.
  • Порт : Порт соединения.

Совет: Если требуется заголовок хоста, используйте Httphader.

Пример датчика HTTP.

        livenessProbe:
          initialDelaySeconds: 1
          periodSeconds: 2
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 1
          httpGet:
            host:
            scheme: HTTP
            path: /
            httpHeaders:
            - name: Host
              value: myapplication1.com
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

Датчики Lifine в Kubernetes

Kubelet выполняет датчики жизни, чтобы увидеть, нужен ли POD перезапуск. Например, допустим, у нас есть микросервис, записанный в Go, и у этого микросервиса есть некоторые ошибки в какой -то части кода, что вызывает замораживание во время выполнения. Чтобы избежать удара по ошибке, мы можем настроить датчик с Lifine, чтобы определить, находится ли микросервис в замороженном состоянии. Таким образом, контейнер для микросервиса будет перезапущен и будет приведен в нетронутое состояние.

Если ваше приложение изящно выходит при столкновении с такой проблемой, вам не обязательно нужно настроить зонды Lifine, но все равно могут быть ошибки, о которых вы не знаете. POD будет перезапущен в соответствии с политикой настройки/повторного запуска по умолчанию.

Общие ловушки для зондов с жизнеобеспечения

Зонды определяют только здоровье ответами зонда, и они не знают о динамике системы нашего микросервиса/приложения. Если по какой -либо причине ответы зонда откладываются на более чем Периодесные секунды время FASHURETHRESHOLD Микросервис/применение будет определяться нездоровым, а перезапуск стручка будет запускаться. Следовательно, важно настроить параметры на поведение приложения.

Каскадные неудачи

Похоже на поиск датчиков , Датчики Lifine также могут создать каскадный сбой, если вы неправильно настроите его. Если конечная точка здоровья имеет внешние зависимости или любое другое состояние, которое может предотвратить предоставление ответа, она может создать каскадный сбой; Следовательно, имеет первостепенное значение для настройки зонда с учетом этого поведения.

Крушение

Давайте предположим, что наше приложение должно время от времени читать большое количество данных в кеш; Независимость в это время также может вызвать ложное положительное, потому что зонд может потерпеть неудачу. В этом случае сбой зонда Lifine будет перезагрузить контейнер, и, скорее всего, он вступит в непрерывный цикл перезапусков. В таком сценарии зонд готовности может быть более подходящим для использования, POD будет удален только от сервиса для выполнения задач обслуживания, и как только он будет готов принять трафик, он может начать реагировать на зонды.

Конечные точки Lifence на нашем микросервисе. — эти зонды будут нажимать — должны проверить абсолютные минимальные требования, которые показывают, что приложение работает. Таким образом, проверки долгов, проверяются, и POD не будет перезапущен, и мы гарантируем, что трафик сервисного трафика как это должно.

Пример: пример развертывания NGINX

Мы будем развернуть NGINX в качестве приложения. Ниже приведена конфигурация развертывания и сервиса.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-probes
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        livenessProbe:
          initialDelaySeconds: 1
          periodSeconds: 2
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 1
          httpGet:
            host:
            scheme: HTTP
            path: /
            httpHeaders:
            - name: Host
              value: myapplication1.com
            port: 80

Напишите эту конфигурацию в файл с именем k8s-probes-deployment.yaml и примените его с Kubectl Apply -f K8S-Probes-Deployment.yaml командование

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  ports:
  - name: nginx-http-port
    port: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: NodePort

Кроме того, напишите эту конфигурацию в файл с именем k8s-probes-svc.yaml и примените ее с помощью этой команды:

kubectl apply -f k8s-probes-svc.yaml

Устранение неполадок датчиков

Нет конкретной конечной точки для датчика Livine, и мы должны использовать kubectl опишите стручки Команда, чтобы увидеть события и текущее состояние.

kubectl get pods

Здесь мы видим, что наш стручок находится в состоянии бега, и он готов принять трафик.

NAME                         READY   STATUS    RESTARTS   AGE
k8s-probes-7d979f58c-vd2rv   1/1     Running   0          6s

Давайте проверим примененную конфигурацию.

 kubectl describe pods k8s-probes-7d979f58c-vd2rv | grep Liveness

Здесь мы можем увидеть параметры, которые мы настроили.

    Liveness:       http-get http://:80/ delay=5s timeout=1s period=5s #success=1 #failure=1

Давайте посмотрим на события:

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  45s   default-scheduler  Successfully assigned default/k8s-probes-7d979f58c-vd2rv to k8s-probes
  Normal  Pulling    44s   kubelet            Pulling image "nginx"
  Normal  Pulled     43s   kubelet            Successfully pulled image "nginx" in 1.117208685s
  Normal  Created    43s   kubelet            Created container nginx
  Normal  Started    43s   kubelet            Started container nginx

Как видите, нет никаких признаков неудачи и успеха; Для условий успеха не будет записано события.

Теперь давайте изменим livineprobe.httpget.path на «/do-not-encists» и посмотрим на статус капсута.

kubectl get pods

После изменения пути зонды Lifence потерпят неудачу, а контейнер будет перезапущен.

NAME                          READY   STATUS    RESTARTS   AGE
k8s-probes-595bcfdf57-428jt   1/1     Running   4          74s

Мы видим, что контейнер был перезапущен четыре раза.

Давайте посмотрим на события.

...
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  53s                default-scheduler  Successfully assigned default/k8s-probes-595bcfdf57-428jt to k8s-probes
  Normal   Pulled     50s                kubelet            Successfully pulled image "nginx" in 1.078926208s
  Normal   Pulled     42s                kubelet            Successfully pulled image "nginx" in 978.826238ms
  Normal   Pulled     32s                kubelet            Successfully pulled image "nginx" in 971.627126ms
  Normal   Pulling    23s (x4 over 51s)  kubelet            Pulling image "nginx"
  Normal   Pulled     22s                kubelet            Successfully pulled image "nginx" in 985.155098ms
  Normal   Created    22s (x4 over 50s)  kubelet            Created container nginx
  Normal   Started    22s (x4 over 50s)  kubelet            Started container nginx
  Warning  Unhealthy  13s (x4 over 43s)  kubelet            Liveness probe failed: HTTP probe failed with statuscode: 404
  Normal   Killing    13s (x4 over 43s)  kubelet            Container nginx failed liveness probe, will be restarted
  Warning  BackOff    13s                kubelet            Back-off restarting failed container

Как вы можете видеть выше, «Не удалось датчик Livensy: http -зонд не удался с кодом состояния: 404», указывает на неудачу зонда с кодом HTTP 404; Код состояния также поможет в устранении неполадок. Сразу после этого Kubelet сообщает нам, что он перезагрузит контейнер.

Вывод

Kubernetes Lifine Probes — это спасатели, когда наше приложение находится в неопределенном состоянии; Они возвращают приложение в нетронутое условие, перезапустив контейнер. Тем не менее, очень важно, чтобы их нужно настроить правильно. Конечно, нет единого правильного пути; Все зависит от вашего приложения и от того, как вы хотите, чтобы Kubernetes действовал в каждом конкретном сценарии неудачи. Установите значения соответственно и проверьте значения с помощью сценариев живого случая.

Дальнейшее чтение

Фотография Марио Карузо на Неспособный

Зонды Kubernetes (серия 2 частей)

Оригинал: «https://dev.to/loft/kubernetes-liveness-probes-examples-common-pitfalls-4mll»