[英]Airflow using GCP. Unable to ping external IP Address within Airflow DAG
背景
问题
response = os.system("ping -c 1 " + ip_address)
),它返回 0,也就是 Active Network。这是 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)
对我有用的是删除响应部分。 这是代码:
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 的其他可能原因是防火墙规则配置错误。 要解决此问题,您必须:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.