在Atomic Host上为Kubernetes 1.5配置NFS共享:拒绝权限

时间:2018-02-26 13:02:16

标签: docker kubernetes

我正在使用两个带有Atomic Host的VM(1个Master,1个Node; Centos Image)。我想使用来自另一个VM(Ubuntu Server 16.04)的NFS共享作为我的pod的持久卷。我可以手动挂载它们并在Kubernetes(版本1.5.2)中成功创建持久卷并绑定到我的PVC。它们也安装在我的吊舱中。 但是当我尝试写入或甚至从pod中的相应文件夹中读取时,我收到错误Permission denied从我的研究中我认为,问题在于文件夹权限/所有者/我的NFS主机上的组。

我在Ubuntu VM上的导出文件(/etc/exports)有10个共享,具有以下模式(两个IP是我的Atomic Host Master和Node的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)

在我的pod的图像中,我创建了一个名为guestbook的新用户,这样容器就不会使用特权用户,因为这种不安全。我阅读了许多帖子,如this one,该状态,您必须将权限设置为全局可写或使用相同的UID和GID作为共享文件夹。因此,在我的Dockerfile中,我创建了具有UID guestbook的{​​{1}}用户和一个名称相同且GID为1003的组:

1003

在我的NFS主机上,我还有一个名为RUN groupadd -r guestbook -g 1003 && useradd -u 1003 -r -g 1003 guestbook 的用户,其中UID guestbook是GID 1003的群组nfs的成员。共享文件夹(1003)的权限如下:

ls -l

(世界可写,所有者留言簿,组nfs)。在我的Pod中,我可以看到已安装文件夹drwxrwxrwx 2 guestbook nfs 4096 Feb 19 11:23 pv01 (再次使用/data)的权限为:

ls -l

使用模式为

的YAML文件创建持久卷
drwxrwxrwx. 2 guestbook guestbook 4096 Feb 9 13:37 data

使用此YAML文件创建Pod:

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

带有YAML文件的PVC:

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

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

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

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法: 我偶然发现了每次尝试从我的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具有创建文件的权限。