web-dev-qa-db-ja.com

Kubernetesデプロイの読み取り専用ファイルシステムエラー

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権限があると思います。

4
spaghettifunk
    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を圧倒するものではありません。

3
mdaniel

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

12
levich