Способ сообщить модулю, что он перезапускается - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно сообщить Pod, перезапускается он или нет. Потому что в зависимости от ситуации мое приложение работает по-разному (приложение с отслеживанием состояния). Я бы не хотел создавать другой модуль, который запускает своего рода сторожевой таймер, а затем сообщает моему приложению, перезапускается оно или нет (после сбоя). Но, возможно, есть способ сделать это с помощью компонентов Kubernetes (Kubelet, ..).

1 Ответ

3 голосов
/ 29 мая 2020

Цитата из Kubernetes Docs:

  1. Процессы в контейнерах внутри подов также могут связываться с apiserver. Когда они это делают, они аутентифицируются как конкретная учетная запись службы (например, по умолчанию)

  2. RoleBinding или ClusterRoleBinding привязывает роль к субъектам. Субъектами могут быть группы, пользователи или ServiceAccounts.

  3. Роль RBA C или ClusterRole содержит правила, представляющие набор разрешений.

    Роль всегда устанавливает разрешения в определенном пространстве имен.

    ClusterRole, напротив, является ресурсом без пространства имен

Итак, Чтобы получить / просмотреть статус другого модуля, вы можете вызвать Kubernetes API из модуля, в котором запущен ваш код, с помощью serviceaccounts. Выполните следующие шаги, чтобы автоматически получить другой статус модуля из данного модуля без какой-либо внешней зависимости (из-за проблем с надежностью вы не должны полагаться на узлы)

Создайте сервисный аккаунт в своем модуле (модуль запроса) пространство имен

kubectl create sa pod-reader

Если оба модуля находятся в одном пространстве имен, создать роль, привязку ролей

Создать роль

kubectl create role pod-reader --verb=get,watch --resource=pods

Создать привязку ролей

kubectl create rolebinding pod-reader-binding --role=pod-reader --serviceaccount=<NAMESPACE>:pod-reader

Иначе, т. Е. Модули находятся в разных пространствах имен, создать кластерную роль, привязку кластера

Создать роль кластера

kubectl create clusterrole pod-reader --verb=get,watch --resource=pods

Создать привязку ролей

kubectl create clusterrolebinding pod-reader-binding --clusterrole=pod-reader --serviceaccount=<NAMESPACE>:pod-reader

Проверьте разрешения

kubectl auth can-i watch pods --as=system:serviceaccount:<NAMESPACE>:pod-reader

Теперь разверните модуль / (ваше приложение) с этим сервисным аккаунтом.

kubectl create <MY-POD> --image=<MY-CONTAINER-IMAGE> --serviceaccount=pod-reader

Это установит секретный токен сервисного аккаунта в вашем pod, который можно найти по адресу /var/run/secrets/kubernetes.io/serviceaccount/token. Ваше приложение может использовать этот токен для выполнения запросов GET к серверу Kubernetes API, чтобы получить статус модуля. См. Пример ниже (предполагается, что в вашем модуле установлена ​​утилита curl. Однако вы можете выполнить соответствующий вызов API из своего кода, передать заголовок, прочитав файл токена serviceaccount, установленный в вашем модуле).

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

curl https://kubernetes.default/api/v1/namespaces/<NAMESPACE>/pods/<NAME_OF_THE_OTHER_POD> -H "Authorization: Bearer ${TOKEN}" -k

curl https://kubernetes.default/api/v1/watch/namespaces/<NAMESPACE>/pods/<NAME_OF_THE_OTHER_POD>?timeoutSeconds=30 -H "Authorization: Bearer ${TOKEN}" -k

Ссылки:

  1. Kubernetes API

  2. serviceaccount

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...