如何在使用istio的kubernetes集群中部署airflow

问题描述 投票:0回答:1

我正在尝试使用 Istio 在 Kubernetes 上部署 Airflow。这是我的 VirtualService 配置:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myapp-virtualservice
  namespace: mynamespace
spec:
  hosts:
  - "myapp.example.com"
  gateways:
  - mygateway
  http:
  - match: 
    - uri:
        prefix: /api/v1/
    route: 
    - destination: 
        host: backend-service
        port:
          number: 8000
  - match:
    - uri:
        prefix: /airflow/home/
    rewrite:
      uri: /home
    route:
    - destination:
        host: airflow-service
        port:
          number: 8080
  
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: frontend-service
        port:
          number: 443

因此,当我访问 https://myapp.example.com/airflow/home/ 时,它会到达 Pod 中的 Airflow Web 服务器,我可以看到此日志:

10.196.182.95 - - [20/Mar/2024:15:51:39 +0530]“GET /home HTTP/1.1”302 319“-”“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36 (KHTML,如 Gecko)Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"

但随后它尝试根据标题位置重定向到登录页面:

https://myapp.example.com/login/?next=https%3A%2F%2Fmyapp.example.com%2Fhome
但我认为它找不到它。所以,然后它重定向到
https://myapp.example.com/404?next=https:%2F%2Fmyapp.example.com%2Fhome
,就是这样。我根本无法访问气流 UI,总是收到 404 错误。

这种情况下如何修复重定向?

这是我的网络服务器的airflow.cfg:

[webserver]
base_url = https://myapp.example.com/airflow/
web_server_host = 0.0.0.0
web_server_port = 8080
web_server_worker_timeout = 1200
enable_proxy_fix = True
web_server_ssl_cert = /airflow/cert/tls.crt
web_server_ssl_key =  /airflow/cert/tls.key

我尝试在没有 istio 的情况下访问网络服务器:

kubectl port-forward svc/airflow-service 8080:8080

并且我能够在我的机器上本地访问 localhost:8080 上的 Airlfow UI 和登录页面,因此看来 Airflow 设置正确,但 istio 可能有问题。有什么想法吗?

kubernetes airflow google-kubernetes-engine istio
1个回答
0
投票

你有:

 Internet
    |
 [Istio Ingress]
    |
 VirtualService
    |----------------|
    |  /api/v1/      |-----> [backend-service:8000]
    |  /airflow/home/|-----> [airflow-service:8080]
    |  /             |-----> [frontend-service:443]
    |----------------|

在您的情况下,Istio VirtualService在访问/airflow/home/后无法正确处理由

Apache Airflow
发起的重定向。
Airflow 期望其
base_url
可直接访问,其中包括路径
/login

由于您的 VirtualService 重写 路径
/airflow/home/
/home
,因此它不会重写或处理
/login
,从而导致 404。

因此,您需要调整 Istio VirtualService 配置以包含处理

/login
的规则,或者更广泛地说,将
/airflow/
下的任何路径正确转发到
airflow-service

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myapp-virtualservice
  namespace: mynamespace
spec:
  hosts:
  - "myapp.example.com"
  gateways:
  - mygateway
  http:
  - match: 
    - uri:
        prefix: /api/v1/
    route: 
    - destination: 
        host: backend-service
        port:
          number: 8000
  - match:
    - uri:
        prefix: /airflow/
    rewrite:
      uri: "/"
    route:
    - destination:
        host: airflow-service
        port:
          number: 8080
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: frontend-service
        port:
          number: 443

这样,任何以

/airflow/
开头的请求(包括
/airflow/home/
/airflow/login/
等)都会被重写为
/
并路由到
airflow-service
。这应该确保 Istio 正确处理 Airflow 到
/login
的重定向并定向到 Airflow 服务。

© www.soinside.com 2019 - 2024. All rights reserved.