为什么非 root 用户无法访问文件?
虚拟私有云 经典基础架构
您已使用控制台或 REST API 将文件上传到 IBM Cloud Object Storage 服务实例。 在尝试使用通过 runAsUser
在应用程序部署中定义的非 root 用户访问这些文件时,将拒绝对文件的访问。
在 Linux 中,文件或目录具有 3 个访问组:Owner
、Group
和 Other
。 在使用控制台或 REST API 将文件上传到 IBM Cloud Object Storage 时,将除去 Owner
、Group
和 Other
的许可权。 每个文件的许可权如下所示:
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 用户设置正确的许可权。
-
要检查存储区中文件的许可权,请为
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>
-
创建
test-permission
pod。kubectl apply -f test-permission.yaml
-
登录到 pod。
kubectl exec test-permission -it bash
-
浏览到安装路径并列出文件的许可权。
cd test && ls -al
示例输出
d--------- 1 root root 0 Jan 1 1970 <file_name>
-
删除 pod。
kubectl delete pod test-permission
-
针对要用于纠正文件许可权的 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>
-
创建
fix-permission
pod。kubectl apply -f fix-permission.yaml
-
等待 pod 进入
Completed
状态。kubectl get pod fix-permission
-
删除
fix-permission
pod。kubectl delete pod fix-permission
-
重新创建先前用于检查许可权的
test-permission
pod。kubectl apply -f test-permission.yaml
验证是否更新了文件的许可权
-
登录到 pod。
kubectl exec test-permission -it bash
-
浏览到安装路径并列出文件的许可权。
cd test && ls -al
示例输出
-rwxrwx--- 1 <nonroot_userID> root 6193 Aug 21 17:06 <file_name>
-
删除
test-permission
pod。kubectl delete pod test-permission
-
使用非 root 用户将 PVC 安装到应用程序。
将 runAsUser
和 fsGroup
设置为部署 YAML 中的相同值。
在 IBM Cloud Object Storage 服务实例中设置正确的文件许可权后,请勿使用控制台或 REST API 上载文件。 使用 IBM Cloud Object Storage 插件以将文件添加到服务实例。