我正在创建Kubernetes PVC和使用它的Deploy。
在yaml中,指定uid和gid必须为1000。
但是在部署时,该卷使用不同的ID挂载,因此我对此没有写访问权限。
如何为PVC有效地指定uid和gid?
PVC yaml:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jmdlcbdata
annotations:
pv.beta.kubernetes.io/gid: "1000"
volume.beta.kubernetes.io/mount-options: "uid=1000,gid=1000"
volume.beta.kubernetes.io/storage-class: default
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "2Gi"
storageClassName: "default"
部署Yaml:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
name: jmdlcbempty
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
creationTimestamp: null
labels:
name: jmdlcbempty
spec:
securityContext:
runAsUser: 1000
fsGroup: 1000
volumes:
- name: jmdlcbdata
persistentVolumeClaim:
claimName: jmdlcbdata
containers:
- name: myalpine
image: "alpine"
command:
- /bin/sh
- "-c"
- "sleep 60m"
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /usr/share/logstash/data
name: jmdlcbdata
这是目录列表:
$ kubectl get pvc; kubectl get pods;
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jmdlcbdata Bound pvc-6dfcdb29-8a0a-11e8-938b-1a5d4ff12be9 20Gi RWO default 2m
NAME READY STATUS RESTARTS AGE
jmdlcbempty-68cd675757-q4mll 1/1 Running 0 6s
$ kubectl exec -it jmdlcbempty-68cd675757-q4mll -- ls -ltr /usr/share/logstash/
total 4
drwxr-xr-x 2 nobody 42949672 4096 Jul 17 21:44 data
我正在研究IBM的Bluemix集群。
谢谢。
答案 0 :(得分:3)
经过一些实验,最后,我可以提供答案。
有几种方法可以通过特定的UID和GID在Container中运行进程:
runAsUser
中的 securityContext
字段为Pod中的Containers中运行的第一个进程指定用户ID。
fsGroup
中的 securityContext
字段指定与Pod中的所有Container关联的组ID。该组ID还与装入Pod的卷以及在这些卷中创建的任何文件相关。
当Pod使用具有pv.beta.kubernetes.io/gid
批注的PersistentVolume时,带注释的GID将以与Pod安全上下文中指定的GID相同的方式应用于Pod中的所有Container。
请注意,每个GID,无论它是来自PersistentVolume注释还是Pod的规范,都将应用于每个Container中运行的第一个进程。
此外,有几种方法可以为PersistentVolume
设置安装选项。 PersistentVolume
是集群中由管理员配置的一部分存储。另外,可以使用StorageClass
动态地设置它。因此,您可以在手动创建PersistentVolume
时指定安装选项。或者,您可以在StorageClass
中指定它们,并且PersistentVolumeClaim
从该类请求的每个PersistentVolume都将具有这些选项。
使用mountOptions
属性比使用volume.beta.kubernetes.io/mount-options
注释和使用storageClassName
属性代替volume.beta.kubernetes.io/storage-class
注释更好。这些注释过去用于代替属性,现在仍在使用,但是在将来的Kubernetes版本中将完全弃用它们。这是一个示例:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: with-permissions
provisioner: <your-provider>
parameters:
<option-for your-provider>
reclaimPolicy: Retain
mountOptions: #these options
- uid=1000
- gid=1000
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "2Gi"
storageClassName: "with-permissions" #these options
请注意,挂载选项未经验证,因此如果其中一个无效,挂载只会失败。例如,您可以将uid=1000, gid=1000
安装选项用于FAT或NTFS之类的文件系统,而不能用于EXT4。
参考您的配置:
在您的PVC yaml中,volume.beta.kubernetes.io/mount-options: "uid=1000,gid=1000"
无法正常工作,因为它是StorageClass或PV的选项。
您在PVC yaml中指定了storageClassName: "default"
和volume.beta.kubernetes.io/storage-class: default
,但它们的作用相同。另外,default
StorageClass
默认没有安装选项。
在您的PVC yaml中,“ pv.beta.kubernetes.io/gid:“ 1000”'注释与“部署”定义中的securityContext.fsGroup: 1000
选项相同,因此不需要第一个。
尝试创建带有必需的安装选项(StorageClass
)的uid=1000, gid=1000
,然后使用PVC向其请求PV,如上例所示。之后,您需要对Deployment
使用SecurityContext
定义来设置对已安装PVC的访问。但是请确保您正在使用文件系统可用的挂载选项。
答案 1 :(得分:1)
您可以使用initContainer设置卷装载路径的UID / GID权限。
您默认看到的UID / GID是由于在NFS上启用了根南瓜。
步骤:https://console.bluemix.net/docs/containers/cs_troubleshoot_storage.html#nonroot