【问题标题】:Airflow on kubernetes cannot fetch logsKubernetes 上的 Airflow 无法获取日志
【发布时间】:2020-09-06 04:45:30
【问题描述】:

我的气流服务作为 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 上 curl 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)中运行,则一切正常。

【问题讨论】:

  • 您正在使用来自哪个 pod 的kubectl exec bash?请描述您正在测试的确切内容。
  • 我尝试进入airflow pod,webserver和scheduler容器都一样,结果都一样。
  • 你用过什么指南,可以分享一下吗?我可以尝试重新创建您的集群和部署。您还可以确保两个 pod 上的 8793 端口都打开。
  • 集群已经配置好了,但是我在这里使用命令kubernetes.io/docs/tasks/access-application-cluster/…检查了端口,两个容器上的端口8080和8793都返回了

标签: logging kubernetes airflow kubernetes-pod


【解决方案1】:

Airflow 会在任务完成后删除 pod,会不会是 pod 丢失了,所以无法访问它们的日志?

尝试设置看看是不是这样 AIRFLOW__KUBERNETES__DELETE_WORKER_PODS=False

在 Kubernetes 上运行气流时,我建议使用远程日志记录(例如 s3),这样在删除 pod 时会保留日志。

【讨论】:

  • 感谢您的回复!但是,情况似乎并非如此,我设置了环境变量并验证了它在气流吊舱中,但问题仍然存在。在我看来,问题似乎出在气流吊舱和创建的吊舱之间的连接上,因为当气流在本地运行时,它一切正常。
  • 见这里 - github.com/helm/charts/tree/master/stable/… For production purposes, you will likely want to persist the logs externally (e.g. S3), which you have to set up yourself through configuration.
  • 如果 pod 启动失败,或者没有完成任务,日志是否仍会转到 S3/GCS 或其他存储?如果 pod 由于某种原因无法启动,那么如果日志仍然可以恢复以了解问题,那就太好了。
  • @alex 如果 pod 启动失败,那么显然不会有 pod 日志,但是,调度程序日志应该表明它无法启动 pod。
【解决方案2】:

我在这里概述了我们的 kubernetes 执行器日志解决方案(不需要日志卷 elasticsearch 或任何其他复杂的解决方案)。 https://szeevs.medium.com/handling-airflow-logs-with-kubernetes-executor-25c11ea831e4 我们的用例可能会有所不同,但您可以根据需要进行调整。

【讨论】:

    【解决方案3】:

    问题是来自 Airflow v1.10.10 的 KubernetesPodExecutor 如何尝试启动 pod 的错误。升级到 Airflow 2.0 解决了这个问题。

    【讨论】:

      【解决方案4】:

      创建持久卷并在其中存储日志可能会有所帮助。

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

      【讨论】:

        猜你喜欢
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多