使用Kubernetes Executor时Airflow Scheduler启动失败及SSL问题求助
我来帮你一步步排查并解决这两个困扰你的Airflow部署问题:
一、先搞定JSONDecodeError:Helm values.yaml的配置坑
你遇到的第一个json.decoder.JSONDecodeError,本质是YAML的解析特性导致的。Airflow的KUBE_CLIENT_REQUEST_ARGS要求接收一个JSON格式的字符串,但你直接在values.yaml里写字典{"_request_timeout" : [60,60] }时,YAML会自动把它解析成Python字典对象,而不是原样传递字符串给Airflow。这就导致Airflow尝试解析一个非JSON格式的内容,自然报错。
正确的values.yaml写法:
把这个配置值用单引号包裹,强制YAML将其识别为完整的字符串:
airflow: config: AIRFLOW__KUBERNETES__KUBE_CLIENT_REQUEST_ARGS: '{"_request_timeout": [60, 60]}'
这样Helm就会把这个JSON字符串原封不动地传给Pod的环境变量,Airflow就能正确解析了——这也是你在Dockerfile里直接设置ENV能成功的原因,因为Dockerfile里的单引号确保了它是字符串格式。
二、再解决OpenSSL.SSL.WantReadError问题
这个错误是KubernetesJobWatcher在和K8s API服务器建立SSL连接时,出现了读取超时或连接不稳定的情况。结合你的场景,可以尝试以下几个方案:
1. 优化请求超时参数
你已经设置了_request_timeout,可以尝试延长超时时间,比如调整为[120, 120](连接超时120秒,读取超时120秒),同时确保用第一部分的字符串格式配置。
2. 检查ServiceAccount权限与SSL证书
- 确认你的
airflowServiceAccount有足够的权限访问K8s API,特别是读取Pod、Job这类资源的权限。可以用kubectl auth can-i get pods --as=system:serviceaccount:airflow:airflow命令验证权限。 - 如果你的K8s集群用的是自签名SSL证书,需要确保证书已经挂载到Airflow Pod的信任目录中。如果是测试环境,也可以临时禁用SSL验证(生产环境不推荐):
airflow: config: AIRFLOW__KUBERNETES__KUBE_CLIENT_VERIFY: 'false'
3. 升级Kubernetes Python客户端版本
Airflow 1.10.8默认的Kubernetes客户端版本可能存在SSL相关的bug。你可以在自定义Dockerfile中升级到兼容的版本:
RUN pip install --upgrade kubernetes==10.0.1
(10.0.1是经过验证和Airflow 1.10.8兼容的版本,避免升级到过高版本导致兼容性问题)
4. 增加Watcher的重试机制
Airflow的KubernetesJobWatcher默认的重试逻辑可能不够,你可以添加以下配置让它在连接失败时自动重试:
airflow: config: AIRFLOW__KUBERNETES__WATCHER_CONNECTION_RETRY_COUNT: 5 AIRFLOW__KUBERNETES__WATCHER_CONNECTION_RETRY_DELAY: 10
这会让Watcher在连接失败时重试5次,每次间隔10秒,提升连接稳定性。
总结
先通过修正values.yaml中环境变量的字符串格式解决JSON解码错误,再通过调整超时、权限、客户端版本或重试机制来解决SSL读取问题。如果问题还存在,建议查看Scheduler的完整日志,找一找有没有更具体的连接错误提示,方便进一步排查。
内容的提问来源于stack exchange,提问作者Asav Patel

