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 所有。所以我的容器无法写入磁盘。
- 有没有办法挂载 GCE 永久磁盘并使它们 read/write 用于没有非根用户的容器?
- 另一个常见问题:在 Google 容器引擎中使用根用户 运行 容器安全吗?
提前感谢您的投入
您可以使用 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 拥有。
我正在玩 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 所有。所以我的容器无法写入磁盘。
- 有没有办法挂载 GCE 永久磁盘并使它们 read/write 用于没有非根用户的容器?
- 另一个常见问题:在 Google 容器引擎中使用根用户 运行 容器安全吗?
提前感谢您的投入
您可以使用 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 拥有。