kubernetes 上的 Airflow 无法获取日志
Airflow on kubernetes cannot fetch logs
我的气流服务 运行 作为 kubernetes 部署,有两个容器,一个用于 webserver
,一个用于 scheduler
。
我正在 运行 使用带有 in_cluster=True
参数的 KubernetesPodOperator 执行任务,运行 很好,我什至可以 kubectl logs pod-name
显示所有日志。
但是,airflow-webserver
无法获取日志:
*** Log file does not exist: /tmp/logs/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log
*** Fetching from: http://pod-name-7dffbdf877-6mhrn:8793/log/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log
*** Failed to fetch log file from worker. HTTPConnectionPool(host='pod-name-7dffbdf877-6mhrn', port=8793): Max retries exceeded with url: /log/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fef6e00df10>: Failed to establish a new connection: [Errno 111] Connection refused'))
似乎 pod 无法连接到端口 8793 上的气流日志记录服务。如果我 kubectl exec bash
进入容器,我可以在端口 8080 上卷曲 localhost,但不能在 80 和 8793 上卷曲。
Kubernetes 部署:
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-name
namespace: airflow
spec:
replicas: 1
selector:
matchLabels:
app: pod-name
template:
metadata:
labels:
app: pod-name
spec:
restartPolicy: Always
volumes:
- name: airflow-cfg
configMap:
name: airflow.cfg
- name: dags
emptyDir: {}
containers:
- name: airflow-scheduler
args:
- airflow
- scheduler
image: registry.personal.io:5000/image/path
imagePullPolicy: Always
volumeMounts:
- name: dags
mountPath: /airflow_dags
- name: airflow-cfg
mountPath: /home/airflow/airflow.cfg
subPath: airflow.cfg
env:
- name: EXECUTOR
value: Local
- name: LOAD_EX
value: "n"
- name: FORWARDED_ALLOW_IPS
value: "*"
ports:
- containerPort: 8793
- containerPort: 8080
- name: airflow-webserver
args:
- airflow
- webserver
- --pid
- /tmp/airflow-webserver.pid
image: registry.personal.io:5000/image/path
imagePullPolicy: Always
volumeMounts:
- name: dags
mountPath: /airflow_dags
- name: airflow-cfg
mountPath: /home/airflow/airflow.cfg
subPath: airflow.cfg
ports:
- containerPort: 8793
- containerPort: 8080
env:
- name: EXECUTOR
value: Local
- name: LOAD_EX
value: "n"
- name: FORWARDED_ALLOW_IPS
value: "*"
注意:如果在开发环境(本地而不是 kubernetes)中气流是 运行,那么一切都完美无缺。
Airflow 在任务完成后删除 pods,可能是 pods 丢失了所以它无法访问他们的日志吗?
试试set看看是不是这样
AIRFLOW__KUBERNETES__DELETE_WORKER_PODS=False
当 Kubernetes 上的 运行 airflow 时,我建议使用远程日志记录(例如 s3),这样当 pods 被删除时日志会被保留。
我在这里概述了我们针对 kubernetes 执行程序日志的解决方案(不需要日志卷 elasticsearch 或任何其他复杂的解决方案)。 https://szeevs.medium.com/handling-airflow-logs-with-kubernetes-executor-25c11ea831e4
我们的用例可能略有不同,但您可以根据需要进行调整。
问题是 Airflow v1.10.10 中的 KubernetesPodExecutor 如何尝试启动 pods 的错误。升级到 Airflow 2.0 解决了这个问题。
创建持久卷并在其上存储日志可能会有所帮助。
--
kind: PersistentVolume
apiVersion: v1
metadata:
name: testlog-volume
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 2Gi
hostPath:
path: /opt/airflow/logs/
storageClassName: standard
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: testlog-volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: standard
如果你使用helm chart来部署airflow,你可以使用
--set executor=KubernetesExecutor --set logs.persistence.enabled=true --set logs.persistence.existingClaim=testlog-volume
我的气流服务 运行 作为 kubernetes 部署,有两个容器,一个用于 webserver
,一个用于 scheduler
。
我正在 运行 使用带有 in_cluster=True
参数的 KubernetesPodOperator 执行任务,运行 很好,我什至可以 kubectl logs pod-name
显示所有日志。
但是,airflow-webserver
无法获取日志:
*** Log file does not exist: /tmp/logs/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log
*** Fetching from: http://pod-name-7dffbdf877-6mhrn:8793/log/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log
*** Failed to fetch log file from worker. HTTPConnectionPool(host='pod-name-7dffbdf877-6mhrn', port=8793): Max retries exceeded with url: /log/dag_name/task_name/2020-05-19T23:17:33.455051+00:00/1.log (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fef6e00df10>: Failed to establish a new connection: [Errno 111] Connection refused'))
似乎 pod 无法连接到端口 8793 上的气流日志记录服务。如果我 kubectl exec bash
进入容器,我可以在端口 8080 上卷曲 localhost,但不能在 80 和 8793 上卷曲。
Kubernetes 部署:
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-name
namespace: airflow
spec:
replicas: 1
selector:
matchLabels:
app: pod-name
template:
metadata:
labels:
app: pod-name
spec:
restartPolicy: Always
volumes:
- name: airflow-cfg
configMap:
name: airflow.cfg
- name: dags
emptyDir: {}
containers:
- name: airflow-scheduler
args:
- airflow
- scheduler
image: registry.personal.io:5000/image/path
imagePullPolicy: Always
volumeMounts:
- name: dags
mountPath: /airflow_dags
- name: airflow-cfg
mountPath: /home/airflow/airflow.cfg
subPath: airflow.cfg
env:
- name: EXECUTOR
value: Local
- name: LOAD_EX
value: "n"
- name: FORWARDED_ALLOW_IPS
value: "*"
ports:
- containerPort: 8793
- containerPort: 8080
- name: airflow-webserver
args:
- airflow
- webserver
- --pid
- /tmp/airflow-webserver.pid
image: registry.personal.io:5000/image/path
imagePullPolicy: Always
volumeMounts:
- name: dags
mountPath: /airflow_dags
- name: airflow-cfg
mountPath: /home/airflow/airflow.cfg
subPath: airflow.cfg
ports:
- containerPort: 8793
- containerPort: 8080
env:
- name: EXECUTOR
value: Local
- name: LOAD_EX
value: "n"
- name: FORWARDED_ALLOW_IPS
value: "*"
注意:如果在开发环境(本地而不是 kubernetes)中气流是 运行,那么一切都完美无缺。
Airflow 在任务完成后删除 pods,可能是 pods 丢失了所以它无法访问他们的日志吗?
试试set看看是不是这样
AIRFLOW__KUBERNETES__DELETE_WORKER_PODS=False
当 Kubernetes 上的 运行 airflow 时,我建议使用远程日志记录(例如 s3),这样当 pods 被删除时日志会被保留。
我在这里概述了我们针对 kubernetes 执行程序日志的解决方案(不需要日志卷 elasticsearch 或任何其他复杂的解决方案)。 https://szeevs.medium.com/handling-airflow-logs-with-kubernetes-executor-25c11ea831e4 我们的用例可能略有不同,但您可以根据需要进行调整。
问题是 Airflow v1.10.10 中的 KubernetesPodExecutor 如何尝试启动 pods 的错误。升级到 Airflow 2.0 解决了这个问题。
创建持久卷并在其上存储日志可能会有所帮助。
--
kind: PersistentVolume
apiVersion: v1
metadata:
name: testlog-volume
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 2Gi
hostPath:
path: /opt/airflow/logs/
storageClassName: standard
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: testlog-volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: standard
如果你使用helm chart来部署airflow,你可以使用
--set executor=KubernetesExecutor --set logs.persistence.enabled=true --set logs.persistence.existingClaim=testlog-volume