我正在尝试使用 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 可能有问题。有什么想法吗?
你有:
Internet
|
[Istio Ingress]
|
VirtualService
|----------------|
| /api/v1/ |-----> [backend-service:8000]
| /airflow/home/|-----> [airflow-service:8080]
| / |-----> [frontend-service:443]
|----------------|
在您的情况下,Istio VirtualService在访问/airflow/home/
后无法正确处理由
Apache Airflow发起的重定向。
base_url
可直接访问,其中包括路径 /login
。/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 服务。