IBM Cloud Docs
为什么非 root 用户无法访问文件?

为什么非 root 用户无法访问文件?

虚拟私有云 经典基础架构

您已使用控制台或 REST API 将文件上传到 IBM Cloud Object Storage 服务实例。 在尝试使用通过 runAsUser 在应用程序部署中定义的非 root 用户访问这些文件时,将拒绝对文件的访问。

在 Linux 中,文件或目录具有 3 个访问组:OwnerGroupOther。 在使用控制台或 REST API 将文件上传到 IBM Cloud Object Storage 时,将除去 OwnerGroupOther 的许可权。 每个文件的许可权如下所示:

d--------- 1 root root 0 Jan 1 1970 <file_name>

在使用 IBM Cloud Object Storage 插件上传文件时,将保留文件的许可权而不进行更改。

要使用非 root 用户访问文件,非 root 用户必须具有文件的读写许可权。 在 pod 部署过程中更改文件的许可权需要执行写操作。IBM Cloud Object Storage 不是针对写工作负载设计的。

在 pod 部署期间更新许可权可能阻止 pod 进入 Running 状态。

要解决此问题,请在将 PVC 安装到应用程序 pod 之前,创建另一个 pod 来为非 root 用户设置正确的许可权。

  1. 要检查存储区中文件的许可权,请为 test-permission pod 创建配置文件并将该文件命名为 test-permission.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-permission
    spec:
      containers:
      - name: test-permission
         image: nginx
         volumeMounts:
         - name: cos-vol
         mountPath: /test
      volumes:
      - name: cos-vol
         persistentVolumeClaim:
         claimName: <pvc_name>
    
  2. 创建 test-permission pod。

    kubectl apply -f test-permission.yaml
    
  3. 登录到 pod。

    kubectl exec test-permission -it bash
    
  4. 浏览到安装路径并列出文件的许可权。

    cd test && ls -al
    

    示例输出

    d--------- 1 root root 0 Jan 1 1970 <file_name>
    
  5. 删除 pod。

    kubectl delete pod test-permission
    
  6. 针对要用于纠正文件许可权的 pod 创建配置文件,并将其命名为 fix-permission.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: fix-permission
      namespace: <namespace>
    spec:
      containers:
      - name: fix-permission
        image: busybox
        command: ['sh', '-c']
        args: ['chown -R <nonroot_userID> <mount_path>/*; find <mount_path>/ -type d -print -exec chmod u=+rwx,g=+rx {} \;']
        volumeMounts:
        - mountPath: "<mount_path>"
          name: cos-volume
      volumes:
      - name: cos-volume
        persistentVolumeClaim:
          claimName: <pvc_name>
    
  7. 创建 fix-permission pod。

    kubectl apply -f fix-permission.yaml
    
  8. 等待 pod 进入 Completed 状态。

    kubectl get pod fix-permission
    
  9. 删除 fix-permission pod。

    kubectl delete pod fix-permission
    
  10. 重新创建先前用于检查许可权的 test-permission pod。

    kubectl apply -f test-permission.yaml
    

验证是否更新了文件的许可权

  1. 登录到 pod。

    kubectl exec test-permission -it bash
    
  2. 浏览到安装路径并列出文件的许可权。

    cd test && ls -al
    

    示例输出

    -rwxrwx--- 1 <nonroot_userID> root 6193 Aug 21 17:06 <file_name>
    
  3. 删除 test-permission pod。

    kubectl delete pod test-permission
    
  4. 使用非 root 用户将 PVC 安装到应用程序。

runAsUserfsGroup 设置为部署 YAML 中的相同值。

在 IBM Cloud Object Storage 服务实例中设置正确的文件许可权后,请勿使用控制台或 REST API 上载文件。 使用 IBM Cloud Object Storage 插件以将文件添加到服务实例。