无法通过Classic Load Balancer暴露Airflow UI问题求助
EKS中Airflow WebServer LoadBalancer访问超时问题排查
环境信息
在EKS集群通过Helm部署Airflow实例,所有Pod状态均为Running,手动创建了LoadBalancer Service暴露WebServer,但访问LB端点时出现超时。相关资源状态及Service配置如下:
Pod状态
NAME READY STATUS RESTARTS AGE LABELS pod/airflow-postgresql-0 1/1 Running 0 59m app.kubernetes.io/component=primary,app.kubernetes.io/instance=airflow,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=postgresql,app.kubernetes.io/version=16.1.0,apps.kubernetes.io/pod-index=0,controller-revision-hash=airflow-postgresql-59f5bcc96d,helm.sh/chart=postgresql-13.2.24,statefulset.kubernetes.io/pod-name=airflow-postgresql-0 pod/airflow-redis-0 1/1 Running 0 59m apps.kubernetes.io/pod-index=0,component=redis,controller-revision-hash=airflow-redis-5fd5d95c95,release=airflow,statefulset.kubernetes.io/pod-name=airflow-redis-0,tier=airflow pod/airflow-scheduler-7fbb64bf55-svssq 2/2 Running 0 59m component=scheduler,pod-template-hash=7fbb64bf55,release=airflow,tier=airflow pod/airflow-statsd-6df8564664-tq6dm 1/1 Running 0 59m component=statsd,pod-template-hash=6df8564664,release=airflow,tier=airflow pod/airflow-triggerer-0 2/2 Running 0 59m apps.kubernetes.io/pod-index=0,component=triggerer,controller-revision-hash=airflow-triggerer-d48d9dc45,release=airflow,statefulset.kubernetes.io/pod-name=airflow-triggerer-0,tier=airflow pod/airflow-webserver-69cb8b99f-rzckw 1/1 Running 0 59m component=webserver,pod-template-hash=69cb8b99f,release=airflow,tier=airflow pod/airflow-worker-0 2/2 Running 0 59m apps.kubernetes.io/pod-index=0,component=worker,controller-revision-hash=airflow-worker-5b7cf8dc95,release=airflow,statefulset.kubernetes.io/pod-name=airflow-worker-0,tier=airflow
Service配置
apiVersion: v1 kind: Service metadata: name: airflow-webserver-lb namespace: airflow labels: release: airflow component: webserver annotations: service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-04fdde0fa39e75951,subnet-043ffb9be25ec2ea7,subnet-0ab770df112e5e70b spec: type: LoadBalancer selector: component: webserver release: airflow ports: - protocol: TCP port: 80 targetPort: 8080
排查步骤
1. 确认Service Endpoint关联状态
执行以下命令检查Service是否正确关联到WebServer Pod:
kubectl get endpoints airflow-webserver-lb -n airflow
- 正常情况下,
ENDPOINTS列应显示WebServer Pod的IP地址(如10.0.XX.XX:8080) - 如果显示
<none>,需重新核对Pod标签与Service的spec.selector,同时确认资源所属namespace是否统一
2. 检查节点安全组规则
CLB通过NodePort(31185,从Service状态80:31185/TCP可知)转发流量到节点,需确保节点安全组允许:
- 入站规则:允许CLB的安全组(或CLB的公网IP段)访问TCP 31185端口
- 出站规则:允许节点向Pod所在IP段转发TCP 8080端口流量
3. 验证Pod内部WebServer服务可用性
进入WebServer Pod,直接访问内部端口确认服务是否正常:
# 测试本地访问 kubectl exec -it airflow-webserver-69cb8b99f-rzckw -n airflow -- curl localhost:8080 # 查看Pod日志排查启动异常 kubectl logs airflow-webserver-69cb8b99f-rzckw -n airflow
- 如果
curl命令返回Airflow UI的HTML内容,说明Pod内部服务正常;若超时或报错,需排查WebServer启动配置问题
4. 检查CLB健康检查状态
登录AWS控制台,找到对应CLB,查看目标组的健康检查状态:
- 默认健康检查路径可能为
/,而Airflow WebServer的/会跳转到登录页,可能导致健康检查失败 - 将健康检查路径修改为Airflow专用健康端点
/health,调整后等待健康检查状态变为健康
5. 确认子网NACL规则
检查指定子网的网络访问控制列表(NACL):
- 入站规则:允许TCP 80端口(来自任意IP)
- 出站规则:允许TCP 31185端口(到CLB IP)和TCP 8080端口(到Pod IP段)
- NACL为双向规则,需确保入站和出站的相关端口均被允许
6. 验证kube-proxy状态
kube-proxy负责节点流量转发到Pod,确认集群中kube-proxy Pod正常运行:
kubectl get pods -n kube-system | grep kube-proxy
- 所有kube-proxy Pod应处于
Running状态,若有异常,查看日志排查:
kubectl logs <kube-proxy-pod-name> -n kube-system
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

