代码之家  ›  专栏  ›  技术社区  ›  chrisl

在原子主机上为Kubernetes 1.5配置NFS共享:权限被拒绝

  •  1
  • chrisl  · 技术社区  · 7 年前

    我正在使用两个带有原子主机的虚拟机(1个主机,1个节点;Centos映像)。我想使用另一个VM(Ubuntu服务器16.04)的NFS共享作为我的POD的持久卷。我可以手动装载它们,并在Kubernetes(1.5.2版)中成功创建持久卷并将其绑定到我的PVC。它们也安装在我的吊舱中。 但是,当我试图从pod中相应的文件夹中写入甚至读取时,我得到了错误 Permission denied . 根据我的研究,我认为问题在于NFS主机上的文件夹权限/所有者/组。

    我在Ubuntu VM上导出文件( /etc/exports )具有以下模式的10个共享(这两个IP是我的原子主机主节点和节点的IP):

    /home/user/pv/pv01   192.168.99.101(rw,insecure,async,no_subtree_check,no_root_squash) 192.168.99.102(rw,insecure,async,no_subtree_check,no_root_squash)
    

    在我的播客的图像中,我创建了一个名为 guestbook ,这样容器就不会使用特权用户,因为这是不安全的。我读了很多类似的帖子 this one ,则必须将权限设置为全局可写,或对共享文件夹使用相同的UID和GID。因此,在Dockerfile中,我创建 留言簿 具有UID的用户 1003 和具有相同名称和GID的组 1003 :

    RUN groupadd -r guestbook -g 1003 && useradd -u 1003 -r -g 1003 guestbook
    

    在NFS主机上,我还有一个名为 留言簿 使用UID 1003 作为集团成员 nfs 带GID 1003 . 共享文件夹的权限(具有 ls -l )具体如下:

    drwxrwxrwx 2 guestbook nfs 4096 Feb 19 11:23 pv01
    

    (世界可写、所有者留言簿、nfs组)。在我的Pod中,我可以看到已装载文件夹的权限 /data (再次使用 ls-l )作为:

    drwxrwxrwx. 2 guestbook guestbook 4096 Feb 9 13:37 data
    

    持久卷是使用具有以下模式的YAML文件创建的:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv01
      annotations:
        pv.beta.kubernetes.io/gid: "1003"
    spec:
      capacity:
        storage: 200Mi
      accessModes:
      - ReadWriteOnce
      - ReadWriteMany
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        path: /home/user/pv/pv01
        server: 192.168.99.104
    

    Pod是使用以下YAML文件创建的:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: get-started
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: get-started
        spec:
          containers:
          - name: get-started
            image: docker.io/cebberg/get-started:custom5
            ports:
            - containerPort: 2525
            env:
            - name: GET_HOSTS_FROM
              value: dns
            - name: REDIS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: redis
                  key: database-password
            volumeMounts:
            - name: log-storage
              mountPath: "/data/"
            imagePullPolicy: Always
            securityContext:
              privileged: false
          volumes:
          - name: log-storage
            persistentVolumeClaim:
              claimName: get-started
          restartPolicy: Always
          dnsPolicy: ClusterFirst
    

    带YAML文件的PVC:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: get-started
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 100Mi
    

    我尝试了文件夹所有者/组的不同配置。如果我使用我的普通用户(在所有系统上都是相同的)作为所有者和组,我可以手动装载并在文件夹中读写。但我不想使用我的普通用户,而是使用另一个用户(尤其是不是特权用户)。

    我必须设置哪些权限,以便我在Pod中创建的用户可以写入NFS卷?

    1 回复  |  直到 7 年前
        1
  •  1
  •   chrisl    7 年前

    我找到了问题的解决方案: 我偶然发现了日志条目,每当我尝试从我的pod访问NFS卷时都会出现这些条目。他们说,由于不同的安全上下文,SELinux阻止了对该文件夹的访问。

    为了解决这个问题,我只需打开相应的SELinux布尔值 virt_use_nfs 使用命令

    setsebool virt_use_nfs on
    

    必须在所有节点上执行此操作,以使其正常工作。

    编辑: 我记得,我现在用 sec=sys 作为装载选项 /etc/exports . 这提供了基于创建文件的用户的UID和GID(这似乎是默认值)的访问控制。如果您使用 sec=none 还必须启用SELinux布尔值 nfsd_anon_write ,以便用户 nfsnobody 具有创建文件的权限。