Kubernetes持久卷声明安装了错误的gid

时间:2018-07-17 22:01:12

标签: kubernetes ibm-cloud kubernetes-pvc kubernetes-deployment

我正在创建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集群。

谢谢。

2 个答案:

答案 0 :(得分:3)

经过一些实验,最后,我可以提供答案。

有几种方法可以通过特定的UID和GID在Container中运行进程:

    Pod定义中runAsUser中的
  1. securityContext字段为Pod中的Containers中运行的第一个进程指定用户ID。

  2. Pod中fsGroup中的
  3. securityContext字段指定与Pod中的所有Container关联的组ID。该组ID还与装入Pod的卷以及在这些卷中创建的任何文件相关。

  4. 当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。

参考您的配置:

  1. 在您的PVC yaml中,volume.beta.kubernetes.io/mount-options: "uid=1000,gid=1000"无法正常工作,因为它是StorageClass或PV的选项。

  2. 您在PVC yaml中指定了storageClassName: "default"volume.beta.kubernetes.io/storage-class: default,但它们的作用相同。另外,default StorageClass默认没有安装选项。

  3. 在您的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