Перезапустите модули в развертывании A, когда развертывание B изменится - PullRequest
0 голосов
/ 12 октября 2019

Зависание развертывания унаследованного приложения, которое я не контролирую на k8s, для которого требуется список IP-адресов в командной строке, причем эти IP-адреса являются модулями в развертывании B, например ::

./legacy_app -s 10.1.0.1 10.1.0.2 10.2.0.2 - вызовРазвертывание этого приложения A

(IP-адреса собираются путем запроса конечной точки .../pods API k8s во время запуска модуля)

Когда изменяется развертывание B (масштабируется / уменьшается, перезапуск модуля,и т. д.), список IP-адресов изменяется, и мне нужно перезапустить стручки в развертывании A, чтобы повторно запросить у API правильный список IP-адресов.

Как мне этого добиться, в идеале используя стандартные примитивы k8s?

Что я пробовал до сих пор:

  • приложение, которое вызывает watch наразвертывание B и при обнаружении события MODIFIED обновляет метку при развертывании A, вызывая перезапуск. Это своего рода работает, но требует, чтобы наблюдатель сделал паузу на несколько секунд, прежде чем перезапустить развертывание A - без паузы список IP-адресов часто не обновляется к моменту перезапуска развертывания A, что приводит к неполному списку. Однако чем дольше он приостанавливается, тем больше данных я теряю. Это добавляет немного больше операционной сложности, чем мне нравится.

Что я собираюсь попробовать дальше:

  • замена pid 1 при развертывании A на цикл мониторинга, который (повторно) запускает старое приложение сновый список IP-адресов, когда список меняется.

  • Могу ли я обновить configMap или метку при развертывании модулей, содержащих список IP-адресов, и каким-то образом использовать это, чтобы сигнализировать о необходимости перезагрузки?

Есть ли лучший способ? Зайдя в k8s, я ожидал, что будут какие-то ловушки / часы, на которые я мог бы подписаться, и запустим команду типа «перезапустить все модули в развертывании», но эта функция, похоже, не существует.

Я явно новичок в k8s, любой вклад очень ценится.

k8s 1.14 на AWS EKS

1 Ответ

1 голос
/ 14 октября 2019

Я решил решить эту проблему с помощью сценария ввода bash перед развертыванием A, много псевдокода:

#!/bin/bash

get_deployment_B_ips() {
    echo $(curl https://$K8S_API/api/v1/namespaces/my_namespace/pods/ | \
           jq -r '[.items[] | select(.metadata.labels.app=="deployment-B") | select(.status.phase=="Running")] | map(.status.podIP + ":9125") |  join(" ")')
}

while true; do
CURRENT_LIST=$(get_deployment_B_ips)

  if [[ "$IP_LIST" == "$CURRENT_LIST" ]]; then
    sleep 5
  else
   # restart the process with new IP LIST
  fi
done

Пока это прекрасно работает, но в будущем я собираюсь прочитать оподробности реализации операторов k8s, и посмотрите, могут ли они предоставить более четкое решение, чем это.

Отметив это как ответ на мой вопрос, если только не будет найдено лучшее решение.

...