Jua*_*ias 6 kubernetes kubernetes-pvc ibm-cloud kubernetes-deployment
我正在创建一个 Kubernetes PVC 和一个使用它的 Deploy。
在 yaml 中指定 uid 和 gid 必须为 1000。
但是在部署时,卷安装了不同的 ID,所以我没有写访问权限。
如何有效地为 PVC 指定 uid 和 gid?
PVC纱线:
---
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"
Run Code Online (Sandbox Code Playgroud)
部署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
Run Code Online (Sandbox Code Playgroud)
这是目录列表:
$ 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
Run Code Online (Sandbox Code Playgroud)
我正在研究 IBM 的 Bluemix 集群。
谢谢。
经过一些实验,终于可以给出答案了。
有几种方法可以从特定的 UID 和 GID 运行容器中的进程:
runAsUsersecurityContextPod 定义中的字段指定在 Pod 中的容器中运行的第一个进程的用户 ID。
fsGroupsecurityContextPod 中的字段指定与 Pod 中的所有容器关联的组 ID。该组 ID 还与挂载到 Pod 的卷以及在这些卷中创建的任何文件相关联。
当 Pod 使用具有pv.beta.kubernetes.io/gid注解的 PersistentVolume 时,带有注解的 GID 会以与 Pod 安全上下文中指定的 GID 相同的方式应用于 Pod 中的所有容器。
请注意,每个 GID,无论它源自 PersistentVolume 注释还是 Pod 的规范,都应用于每个容器中运行的第一个进程。
此外,有多种方法可以为PersistentVolumes设置挂载选项。APersistentVolume是集群中已由管理员配置的一块存储。此外,它可以使用StorageClass. 因此,您可以在PersistentVolume手动创建时在 a 中指定挂载选项。或者您可以在 中指定它们StorageClass,并且 a 从该类请求的每个 PersistentVolumePersistentVolumeClaim都将具有这些选项。
用mountOptionsattribute比用volume.beta.kubernetes.io/mount-optionsannotation好,用storageClassNameattribute代替volume.beta.kubernetes.io/storage-classannotation。这些注解在过去被用来代替属性,现在它们仍然有效,但是在未来的 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
Run Code Online (Sandbox Code Playgroud)
请注意,挂载选项未经过验证,因此如果某个选项无效,挂载将失败。并且您可以将uid=1000, gid=1000挂载选项用于 FAT 或 NTFS 等文件系统,但不能用于 EXT4,例如。
参考你的配置:
在您的 PVC 中 yamlvolume.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 的访问。但请确保您使用的是适用于您的文件系统的挂载选项。
小智 0
您可以使用 initContainer 来设置卷安装路径的 UID/GID 权限。
默认情况下,您看到的 UID/GID 是由于 NFS 上启用了根南瓜。
步骤:https://console.bluemix.net/docs/containers/cs_troubleshoot_storage.html#nonroot
| 归档时间: |
|
| 查看次数: |
8058 次 |
| 最近记录: |