繁体   English   中英

Airflow 使用 GCP。 无法在 Airflow DAG 内 ping 外部 IP 地址

[英]Airflow using GCP. Unable to ping external IP Address within Airflow DAG

背景

  • 我使用 Google Cloud Platform 中的 Composer 环境创建了一个 Airflow 网络服务器。 即3个节点,composer-1.10.0-airflow-1.10.6镜像版本,机器类型n1-standard-1。
  • 我还没有为此环境配置任何网络。
  • Airflow 适用于简单的测试 DAG,即:

气流网络服务器

问题

  • 我编写了一个 ping_ip DAG 来确定物理机(即我的笔记本电脑)是否连接到互联网。 (代码: https://pastebin.com/FSBPNnkP
  • 我测试了 python 用于在本地 ping 机器(通过response = os.system("ping -c 1 " + ip_address) ),它返回 0,也就是 Active Network。
  • 当我将此代码移动到 Airflow DAG 时,代码运行良好,但这次为相同的 IP 地址返回 256。

这是 pastebin 中的 DAG 代码: https://pastebin.com/FSBPNnkP

以下是上面粘贴的触发 DAG 的 Airflow 日志:

[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 的网络问题。
  • 有人知道如何从 GCP 管理的 Airflow 服务中 ping 外部 IP 吗?
  • 最终目标是创建一个 DAG,提示物理机运行 python 脚本。 我认为这个过程应该从一个简单的子 DAG 开始,它检查机器是否连接到互联网。 如果我以错误的方式解决这个问题,请让我知道。

对我有用的是删除响应部分。 这是代码:

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())

让我发表一下我的看法。

Composer 默认使用包含允许 ICMP 协议 (ping) 的防火墙规则的default网络。 所以,我认为应该联系任何公共的 IP,例如,当安装 PYPI 包时,您通常不会配置任何特殊的东西,PYPI 存储库是可以访问的。

一台可以上网的机器并不一定意味着它有一个公共的 IP,例如它可以在 NAT 或任何其他网络配置下(网络不是我的专长)。 为了确保您指定Internet连接的公共地址,可以使用https://WWW.MYIP.com/ ,您将在其中看到ZA12A3079E14CED14CED46E 69BA52B8A90B2122122122AZ(EG 189.22AZ) 0.30),如果你得到类似的东西,你将需要使用公共的。

如果您使用的是主机 IP,它可能在本地工作,因为 IP 可以从您所在的同一专用网络访问,流量不会流出网络。 但是对于上传 DAG 的 Composer,节点完全在本地网络之外。

我没有发现 ping 代码 256 可能意味着什么,但如果您使用正确的公共 IP,您可以尝试使用 -W 增加响应的超时时间,可能只需要更多时间才能到达 IP。

Composer 创建的 VM 不太可能安装“ping”。 这些是标准图像。 我认为您基本上是在调用 Linux “ping”命令,它失败了,因为它没有安装在节点/虚拟机中。 所以你需要改变你的实现以另一种方式“ping”服务器。

您可以 SSH 到 Composer 节点 VM 并安装“ping”,然后重新运行 DAG。 但即使它有效,我也不认为它是一个干净的解决方案,它也不会扩展。 但是对于飞行员来说这样做是可以的。

最后,如果您的目标是执行 Python 脚本,您是否想过在 DAG 中使用Python 运算符 如果您想以某种方式将 Python 脚本的执行与 DAG 本身分离,另一种方法是使用 PubSub + CloudFunction 组合。

无法访问外部 IP 的其他可能原因是防火墙规则配置错误。 要解决此问题,您必须:

  • 定义出口防火墙规则以启用对目标 IP 的 ping 并将防火墙规则附加到“标签”。
  • 确保将相同的“标签”附加到为 Composer 创建的 VM/节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM