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