【问题标题】:Kubernetes deployment read-only filesystem errorKubernetes 部署只读文件系统错误
【发布时间】:2018-09-11 19:59:41
【问题描述】:

我在 Kubernetes 上部署 Airflow(确切地说是这个版本的 Airflow https://github.com/puckel/docker-airflow/blob/1.8.1/Dockerfile)时遇到了关于将权限写入文件系统的错误。

pod的日志显示的错误是:

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 配置错误(我需要为 pod 使用特殊的 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 权限。

【问题讨论】:

    标签: docker sed deployment kubernetes airflow


    【解决方案1】:
        volumeMounts:
          - name: airflow-config-volume
            mountPath: /usr/local/airflow
      volumes:
      - name: airflow-config-volume
        secret:
          secretName: airflow-config-secret
    

    这是您问题的根源,原因有两个:首先,您通过将您的秘密直接卷安装到图像上的图像预期的位置 a directory owned by airflow 破坏了气流用户的home directory

    另外,虽然我必须启动一个集群以确认 100%,但我很确定 Secret 卷安装 - 我认为他们的 ConfigMap 朋友 - 已阅读- 仅投影到 Pod 文件系统;这种怀疑显然与你的经历相符。肯定不会期望这些卷的更改会传播回 Kubernetes 集群,所以为什么要假装不这样呢。

    如果你想继续尝试这样的事情,你确实对投射到volumeMount文件defaultMode 有影响,所以你可以将它们设置为0666 ,但肯定是买者自负。到目前为止,简短的版本不会用卷挂载粉碎$AIRFLOW_HOME

    【讨论】:

      【解决方案2】:

      从 kubernetes 1.9 及更高版本开始,在 secret、configMap、downAPI 和 projection 上的 volumeMounts 行为默认更改为只读。

      解决该问题的方法是创建一个 emtpyDir 卷并将内容复制到其中并执行/写入您需要的任何内容。

      这是一个小sn-p来演示。

          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

      【讨论】:

      • 感谢您对 Kubernetes 更改的提醒。我正在与 Consul 而不是 Airflow 合作,但遇到了类似的问题。您的回答为我指明了正确的方向。
      • 我很高兴能帮上忙:P
      • 我遇到了同样的问题,这帮助我解决了它。谢谢@levich
      • 对于安装为卷的 configMap,请添加 defaultMode: 0700 以便您的脚本可以执行。
      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多