Ошибка файловой системы только для чтения при развертывании Kubernetes

Я столкнулся с ошибкой при развертывании Airflow в Kubernetes (именно эта версия 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.


person spaghettifunk    schedule 02.04.2018    source источник


Ответы (2)


    volumeMounts:
      - name: airflow-config-volume
        mountPath: /usr/local/airflow
  volumes:
  - name: airflow-config-volume
    secret:
      secretName: airflow-config-secret

Является источником ваших проблем по двум причинам: во-первых, вы разбили пользователя воздушного потока домашний каталог, установив свой секрет в образ прямо в место, где изображение ожидает каталог, принадлежащий airflow.

Отдельно, хотя мне пришлось бы запустить кластер, чтобы подтвердить 100%, я почти уверен, что Secret монтирования томов - и я думаю их ConfigMap друзей - являются проекциями файловых систем Pod только для чтения. ; это подозрение определенно соответствует вашему опыту. Конечно, нет никаких ожиданий, что изменения в этих томах распространятся обратно в кластер Kubernetes, так что зачем притворяться иначе.

Если вы хотите и дальше делать такие попытки, вы действительно можете повлиять на _ 5_ файлов, проецируемых в этот volumeMount, поэтому вы можете установить для них 0666, но будьте осторожны с emptor. Краткая версия, безусловно, не для того, чтобы разбить $AIRFLOW_HOME монтированием тома.

person mdaniel    schedule 04.04.2018

Начиная с версии 1.9 и новее kubernetes, поведение volumeMounts на секретах, configMap, downwardAPI и projected по умолчанию изменено на Read-Only.

Обходной путь к проблеме - создать том 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/58720

person levich    schedule 23.07.2018
comment
Спасибо за предупреждение об изменении Kubernetes. Я работаю с Consul, а не с Airflow, но столкнулся с аналогичной проблемой. Ваш ответ указал мне правильное направление. - person Flic; 10.08.2018
comment
Я счастлив, что смог помочь: P - person levich; 15.11.2018
comment
Я столкнулся с той же проблемой, и это помогло мне ее решить. Спасибо @levich - person papanito; 08.04.2019
comment
для configMap, смонтированного как том, добавьте defaultMode: 0700, чтобы ваши скрипты могли быть выполнены. - person Venkatesh Laguduva; 14.05.2021