KubernetesにAirflowをデプロイするときにエラーに直面しています(正確には、このバージョンのAirflow https://github.com/puckel/docker-airflow/blob/1.8.1/Dockerfile )。ファイルシステム。
ポッドのログに表示されるエラーは次のとおりです。
sed: couldn't open temporary file /usr/local/airflow/sed18bPUH: Read-only file system
sed: -e expression #1, char 131: unterminated `s' command
sed: -e expression #1, char 118: unterminated `s' command
Initialize database...
sed: couldn't open temporary file /usr/local/airflow/sedouxZBL: Read-only file system
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/airflow/configuration.py", line 769, in
....
with open(TEST_CONFIG_FILE, 'w') as f:
IOError: [Errno 30] Read-only file system: '/usr/local/airflow/unittests.cfg'
ファイルシステムは読み取り専用のようですが、なぜかはわかりません。それがKubernetesの設定ミス(ポッドに特別なRBACが必要ですか?わからない)か、それともDockerfile。
デプロイメントファイルは次のようになります。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: airflow
namespace: test
spec:
replicas: 1
revisionHistoryLimit: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
app: airflow
spec:
restartPolicy: Always
containers:
- name: webserver
image: davideberdin/docker-airflow:0.0.4
imagePullPolicy: Always
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 50m
memory: 128Mi
securityContext: #does not have any effect
runAsUser: 0 #does not have any effect
ports:
- name: airflow-web
containerPort: 8080
args: ["webserver"]
volumeMounts:
- name: airflow-config-volume
mountPath: /usr/local/airflow
readOnly: false #does not have any effect
- name: airflow-logs
mountPath: /usr/local/logs
readOnly: false #does not have any effect
volumes:
- name: airflow-config-volume
secret:
secretName: airflow-config-secret
- name: airflow-parameters-volume
secret:
secretName: airflow-parameters-secret
- name: airflow-logs
emptyDir: {}
ファイルシステムを書き込み可能にする方法はありますか?コンテナーはUSER airflowとして実行されていますが、このユーザーにはroot権限があると思います。
volumeMounts:
- name: airflow-config-volume
mountPath: /usr/local/airflow
volumes:
- name: airflow-config-volume
secret:
secretName: airflow-config-secret
問題の原因は、次の2つの理由によります。1つ目は、エアフローユーザーの ホームディレクトリ を破壊して、シークレットをイメージの期待する場所に直接イメージにマウントします ディレクトリairflow
が所有しています。
それとは別に、100%を確認するにはクラスターを起動する必要がありますが、Secret
ボリュームがマウントされることは確かです-そして私はthink彼らのConfigMap
フレンド-ポッドファイルシステムへの読み取り専用の投影です。その疑いは確かにあなたの経験と一致しているように見えます。これらのボリュームへの変更がkubernetesクラスターに反映されることは期待できません。
あなたがそのようなことを試み続けることを望むならば、あなたは実際にファイルの defaultMode
に影響を及ぼしますvolumeMount
に投影されるため、0666
に設定できますが、確実に空を警告します。ショートバージョンは、ボリュームマウントで$AIRFLOW_HOME
を圧倒するものではありません。
Kubernetesバージョン1.9以降、シークレット、configMap、downwardAPI、projectedに対するvolumeMountsの動作は、デフォルトで読み取り専用に変更されました。
この問題の回避策は、emtpyDirボリュームを作成し、内容をそのボリュームにコピーして、必要なものを実行/書き込みすることです。
これはデモンストレーションする小さなスニペットです。
initContainers:
- name: copy-ro-scripts
image: busybox
command: ['sh', '-c', 'cp /scripts/* /etc/pre-install/']
volumeMounts:
- name: scripts
mountPath: /scripts
- name: pre-install
mountPath: /etc/pre-install
volumes:
- name: pre-install
emptyDir: {}
- name: scripts
configMap:
name: bla
この中断を引き起こすマージされたPR :( https://github.com/kubernetes/kubernetes/pull/5872