Docker 非根用户部署在 Google 容器引擎中的容器无法写入挂载的 GCE 永久磁盘

Docker container with non-root user deployed in Google Container Engine can not write to mounted GCE Persistent disk

我正在玩 kubernetes 和 google 容器引擎 (GKE)。

我从这个镜像部署了一个容器jupyter/all-spark-notebook

这是我的复制控制器:

{
  "apiVersion": "v1",
  "kind": "ReplicationController",
  "metadata": {
    "name": "datalab-notebook"
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "app": "datalab-notebook"
    },
    "template": {
      "metadata": {
        "name": "datalab-notebook",
        "labels": {
          "environment": "TEST",
          "app": "datalab-notebook"
        }
      },
      "spec": {
        "containers": [{
          "name": "datalab-notebook-container",
          "image": "jupyter/all-spark-notebook",
          "env": [],
          "ports": [{
            "containerPort": 8888,
            "name": "datalab-port"
          }],
          "volumeMounts": [{
            "name": "datalab-notebook-persistent-storage",
            "mountPath": "/home/jovyan/work"
          }]
        }],
        "volumes": [{
          "name": "datalab-notebook-persistent-storage",
          "gcePersistentDisk": {
            "pdName": "datalab-notebook-disk",
            "fsType": "ext4"
          }
        }]
      }
    }

  }
}

如您所见,我安装了一个 Google Compute Engine 永久磁盘。我的问题是容器使用非 root 用户并且挂载的磁盘归 root 所有。所以我的容器无法写入磁盘。

提前感谢您的投入

您可以使用 pod 安全上下文的 FSGroup 字段使 GCE PD 可由非根用户写入。

在此示例中,gce 卷将由组 1234 拥有,容器进程将在其补充组列表中包含 1234:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  securityContext:
    fsGroup: 1234
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    # This GCE PD must already exist.
    gcePersistentDisk:
      pdName: my-data-disk
      fsType: ext4

我运行陷入同样的​​问题。我使用的解决方法是在容器 运行 所在的主机上 运行 df -h。从那里我能够找到持久存储的绑定点。它应该看起来像 /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/<pd-name>。它也将是具有以 /dev 开头但未挂载到 root 的文件系统的文件系统之一。

一旦您发现可以从主机箱 运行 sudo chmod -R 0777 /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/<pd-name>,现在至少您的容器可以使用该目录,尽管文件仍将由 root 拥有。