乐趣区

关于容器:腾讯云TKEPV使用COS存储案例容器目录权限问题

背景

在 TKE 的集群中创立工作负载并把某一个对应的 cos 桶的根目录挂载到 /data 目录,在镜像构建的时候有把 /data 目录设置权限为 755,然而运行容器后胜利挂载 cos 桶的根目录到 /data/ 目录,发现用非 root 账号却无法访问 /data 上面的文件,镜像的启动用户是非 root 用户,查看容器内 /data 目录权限变成了 700。

为什么设置的目录权限是 755,挂载到 COS 后就变成了 700 权限呢?

起因剖析

测试启动 2 个 nginx 工作负载,一个负载将目录 /etc/nginx/conf.d 挂载到 cos 桶上,另一个工作负载失常运行不挂载,而后发现的确挂载 cos 后,默认会把目录权限变成 700。

TKE 中应用 cos 实质上是应用的 Cosfs,腾讯云官网文档 COSFS 工具应用外面能够查到这样一个参数-oallow_other。如果要容许其余用户拜访挂在文件夹, 能够在容许 COSFS 的时候指定该参数。

COSFS 工具:https://cloud.tencent.com/document/product/436/6883?from=10680

解决方案

TKE 中如何配置 -oallow_other 参数?

在应用 cos 桶进行挂载的时候在 pv 创立界面是能够进行参数设置的,然而因为咱们习惯在控制台间接创立 pvc 关联 pv,而后 pv 会主动创立导致很多人没有去关注这个 cos 的参数。

形式一:手动创立

通过编写 yaml 文件来创立 pv,pvc

以下内容起源:https://github.com/TencentCloud/kubernetes-csi-tencentcloud/blob/master/docs/README_COSFS.md

pv-cos.yaml(须要关注 volumeAttributes 下的 additional_args 属性增加了 -oallow_other)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "pv-cos"
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1Gi
  csi:
    driver: com.tencent.cloud.csi.cosfs
    # Specify a unique volumeHandle like bucket name.(this value must different from other pv's volumeHandle)
    volumeHandle: xxx
    volumeAttributes:
      # Replaced by the url of your region.
      url: "http://cos.ap-guangzhou.myqcloud.com"
      # Replaced by the bucket name you want to use.
      bucket: "testbucket-1010101010"
      # You can specify sub-directory of bucket in cosfs command in here.
      # path: "/my-dir"
      # You can specify any other options used by the cosfs command in here.
      additional_args: "-oallow_other"
    nodePublishSecretRef:
      # Replaced by the name and namespace of your secret.
      name: cos-secret
      namespace: kube-system

pvc-cos.yaml(存储大小自行批改)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: pvc-cos
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  # You can specify the pv name manually or just let kubernetes to bind the pv and pvc.
  # volumeName: pv-cos
  # Currently cos only supports static provisioning, the StorageClass name should be empty.
  storageClassName: ""

kubectl apply -f pv-cos.yaml pvc-cos.yaml

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv-cos    1Gi        RWX            Retain           Available                                      5s
$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-cos   Bound     pv-cos    1Gi        RWX

形式二:控制台创立

1、创立 pv

在挂载选项填入 -oallow_other 这个参数,想填写多个参数空格分隔,cos 提供的参数配置选项能够参考:https://cloud.tencent.com/document/product/436/6883#.E5.B8.B8.E7.94.A8.E6.8C.82.E8.BD.BD.E9.80.89.E9.A1.B9

2、创立 pvc 并关联 pv

3、在工作负载中应用 pvc

4、验证对应的目录权限是否正确

进入容器中查看 /etc/nginx/conf.d 的目录不再是 700,创立一个 test 文件,也挂载到了 cos 桶

5、上传一个文件到 cos 桶看容器中是否能够拜访


退出移动版