我正在玩kubernetes和谷歌容器引擎(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拥有。所以我的容器无法写入磁盘。
提前感谢您的输入
答案 0 :(得分:12)
您可以使用pod的安全上下文的FSGroup字段来使非root用户可以写入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
答案 1 :(得分:2)
我遇到了同样的问题。我使用的解决方法是在运行容器的主机上运行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拥有。