Воздушный поток с использованием GCP. Невозможно пропинговать внешний IP-адрес в Airflow DAG - PullRequest
4 голосов
/ 28 апреля 2020

Фон

  • Я создал веб-сервер Airflow, используя среду Composer в Google Cloud Platform. то есть 3 узла, composer -1.10.0-версия воздушного потока-1.10.6, тип машины n1-standard-1.
  • Я еще не настроил ни одной сети для этой среды.
  • Airflow отлично работает для простых тестовых групп доступности баз данных, например:

Airflow webserver

Проблема

  • Я написал группу DAG ping_ip для определения, подключена ли физическая машина (т.е. мой ноутбук) к inte rnet. (Код: https://pastebin.com/FSBPNnkP)
  • Я проверил python, используемый для локальной проверки связи с машиной (через response = os.system("ping -c 1 " + ip_address)), и он возвратил 0, иначе Active Network.
  • Когда я переместил этот код в DAG Airflow, код работал нормально, но на этот раз вернул 256 для того же IP-адреса.

Вот код DAG в вставке: https://pastebin.com/FSBPNnkP

Вот журналы воздушного потока для сработавшего DAG, вставленные выше:

[2020-04-28 07:59:35,671] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[2020-04-28 07:59:35,673] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip [2020-04-28 07:59:35,672] {logging_mixin.py:112} INFO - Network Error.
[2020-04-28 07:59:35,674] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip [2020-04-28 07:59:35,672] {python_operator.py:114} INFO - Done. Returned value was: ('Network Error.', 256)
  • Я полагаю, у меня проблемы с сетью для внешних IP-адресов на моем сервере.
  • Кто-нибудь знает, как пропинговать внешний IP из службы Airflow, управляемой GCP?
  • Конечная цель - создать группу обеспечения доступности баз данных, которая предлагает физической машине выполнить сценарий python. Я думал, что этот процесс должен начаться с простой вспомогательной группы DAG, которая проверяет, подключен ли компьютер к inte rnet. Если я пойду неправильно, пожалуйста, дай мне знать.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Что сработало для меня, так это удаление части ответа. Вот код:

import os
def ping_ip():
    ip_address = "8.8.8.8"  # My laptop IP
    response = os.system("ping -c 1 " + ip_address)

    if response == 0:
        pingstatus = "Network Active."
    else:
        pingstatus = "Network Error."
    print("\n *** Network status for IP Address=%s is : ***" % ip_address)
    print(pingstatus)

    return pingstatus

print(ping_ip())
0 голосов
/ 07 мая 2020

Виртуальные машины, созданные с помощью Composer, вряд ли имеют установленный ping. Это стандартные изображения. Я думаю, что вы в основном вызываете команду Linux "ping", и она терпит неудачу, потому что она не установлена ​​в узле / vm. Поэтому вам нужно изменить свою реализацию, чтобы «пинговать» сервер другим способом.

Вы можете S SH к виртуальным машинам узла Composer, установить ping и затем повторно запустить DAG. Но даже если это сработает, я не буду считать это чистым решением, и оно не будет масштабироваться. Но это можно сделать для пилота.

Наконец, если ваша цель - выполнить сценарий Python, вы подумали об использовании оператора Python из DAG? , Если вы хотите каким-то образом отделить выполнение сценария Python от самой группы обеспечения доступности баз данных, альтернативой является использование комбинации PubSub + CloudFunction.

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

  • Определить выходное правило брандмауэра, чтобы разрешить ping к вашему IP-адресу назначения и присоединить правило брандмауэра к «тегу».
  • Убедитесь, что вы присоединяете то же самое «тег» к виртуальным машинам / узлам, созданным для Composer.
0 голосов
/ 07 мая 2020

Позвольте мне высказать свое мнение.

Composer по умолчанию использует сеть default, которая содержит правило брандмауэра, разрешающее протокол ICMP (ping). Итак, я думаю, что любой publi c IP должен быть доступен, например, когда установлены пакеты PYPI, вы обычно не настраиваете ничего особенного, доступны репозитории PYPI.

Машина с Inte rnet доступ не обязательно означает, что он имеет общедоступный c IP, например, он может быть под NAT или любой другой конфигурацией сети (сеть не является моей компетенцией). Чтобы убедиться, что вы указываете адрес publi c вашего соединения Inte rnet, вы можете использовать такие инструменты, как https://www.myip.com/, где вы увидите IP Publi c (например, 189.226.116.31) и ваш IP-адрес хоста (например, 10.0.0.30), если вы получаете что-то похожее, вам нужно будет использовать publi c.

Если вы используете IP-адрес хоста, возможно, он работает локально, так как этот IP-адрес доступен из той же частной сети, в которой вы находитесь, трафик c не выходит за пределы сети. Но в случае Composer, когда ваша группа DAG была загружена, узлы полностью находятся за пределами вашей локальной сети.

Я не нашел значения пинг-кода 256, но если вы используете правильный publi c IP, вы можете попытаться увеличить время ожидания ответа с помощью -W, вероятно, он принимает только больше времени, чтобы выйти на IP.

...