在Kubernetes上运行Airflow 2.5.0时遇Errno 13权限拒绝问题
在Kubernetes上运行Airflow 2.5.0遇到PermissionError问题
报错信息
File "/usr/local/bin/airflow", line 5, in <module> from airflow.__main__ import main File "/usr/local/lib/python3.9/site-packages/airflow/__init__.py", line 34, in <module> from airflow import settings File "/usr/local/lib/python3.9/site-packages/airflow/settings.py", line 37, in <module> from airflow.configuration import AIRFLOW_HOME, WEBSERVER_CONFIG, conf # NOQA F401 File "/usr/local/lib/python3.9/site-packages/airflow/configuration.py", line 1732, in <module> conf = initialize_config() File "/usr/local/lib/python3.9/site-packages/airflow/configuration.py", line 1487, in initialize_config shutil.copy(_default_config_file_path("default_webserver_config.py"), WEBSERVER_CONFIG) File "/usr/local/lib/python3.9/shutil.py", line 427, in copy copyfile(src, dst, follow_symlinks=follow_symlinks) File "/usr/local/lib/python3.9/shutil.py", line 266, in copyfile with open(dst, 'wb') as fdst: PermissionError: [Errno 13] Permission denied: '/usr/local/airflow/webserver_config.py'
已尝试的解决方法
- 设置
load_examples = False - 重置数据库
当前文件权限
-rw-r--r-- 1 airflow airflow 4744 Mar 20 13:52 webserver_config.py
可行解决方案
1. 修复挂载目录的权限(K8s环境核心排查点)
Kubernetes中,文件本身权限正确不代表挂载目录权限没问题:
- 确认挂载到
/usr/local/airflow的存储卷(PVC/hostPath)所属用户/组为airflow(官方镜像默认UID/GID是50000) - 若使用hostPath,在宿主机执行:
chown -R 50000:50000 /宿主机上的airflow目录路径 - 若使用PVC,在Deployment的initContainers中添加权限修复步骤:
initContainers: - name: fix-permissions image: busybox:latest command: ["sh", "-c", "chown -R 50000:50000 /usr/local/airflow"] volumeMounts: - name: airflow-home mountPath: /usr/local/airflow
2. 阻止Airflow自动覆盖配置文件
通过环境变量指定已存在的配置文件,避免Airflow尝试生成新文件:
在Deployment的env中添加:
env: - name: AIRFLOW__WEBSERVER__WEBSERVER_CONFIG value: /usr/local/airflow/webserver_config.py
或直接在airflow.cfg中配置:
[webserver] webserver_config = /usr/local/airflow/webserver_config.py
3. 确认Pod运行用户
检查Deployment的securityContext,确保Pod以airflow用户运行:
securityContext: runAsUser: 50000 runAsGroup: 50000
如果设置了其他UID,需同步调整文件和目录的权限。
4. 手动生成配置文件并挂载
提前生成配置文件,通过ConfigMap挂载到Pod中:
- 本地生成配置:
airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com - 创建ConfigMap:
kubectl create configmap airflow-webserver-config --from-file=webserver_config.py - 在Deployment中挂载:
volumeMounts: - name: webserver-config mountPath: /usr/local/airflow/webserver_config.py subPath: webserver_config.py volumes: - name: webserver-config configMap: name: airflow-webserver-config
内容的提问来源于stack exchange,提问作者Driss NEJJAR
相关产品推荐
相关产品推荐

