WSL2 Kubernetes - 如何通过指定用户/组权限挂载本地文件夹

时间:2021-06-14 06:41:31

标签: docker kubernetes file-permissions wsl-2 persistent-volumes

我正在使用 WSL2 Debian 和 Docker Desktop,我想将我的卷数据保存在本地文件夹中(最好是 OneDrive 的路径)。

这工作正常,但有一个例外,一切都归 root:root 所有。如何在卷中指定 user/group 权限?

是否有任何相关文档?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dummy-service
  labels:
    app: dummy-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dummy-service
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: dummy-service
    spec:
      containers:
        - name: dotnet
          image: alpine
          imagePullPolicy: Always
          resources:
            requests:
              cpu: "100m"
              memory: "40Mi"
            limits:
              memory: "64Mi"
          ports:
            - containerPort: 5000
          volumeMounts:
            - mountPath: "/app/wwwroot"
              name: dummy-volume
          readinessProbe:
            httpGet:
              path: /heartbeat
              port: 5000
              scheme: HTTP
            initialDelaySeconds: 5
            timeoutSeconds: 1
            periodSeconds: 15
          livenessProbe:
            httpGet:
              path: /heartbeat
              port: 5000
              scheme: HTTP
            failureThreshold: 3
            initialDelaySeconds: 10
            periodSeconds: 15
            successThreshold: 1
            timeoutSeconds: 1
      volumes:
        - name: dummy-volume
          persistentVolumeClaim:
            claimName: dummy-pvc
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: dummy-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: dummy-pv
spec:
  capacity:
    storage: 512Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: dummy-sc
  local:
    path: /run/desktop/mnt/host/c/Users/Markus/OneDrive/Workspace/Volume/Web
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - docker-desktop
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dummy-pvc
spec:
  storageClassName: dummy-sc
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 512Mi

1 个答案:

答案 0 :(得分:0)

对于这个问题,我可以想到三种可能的解决方案:

  1. 您可以使用 Init Containers。这样,以非 root 用户身份运行的 pod 中的容器可以拥有已安装卷的权限。请参阅以下示例:

initContainers:
- name: set-permissions
  image: <image_name>
  # Give user id 555 permissions for the mounted volume
  command:
  - chown
  - -R
  - 555:555
  - /var/lib/data
  volumeMounts:
  - name: data
    mountPath: /var/lib/data

  1. 另一种让非 root 用户访问其想要读取和写入数据的文件夹的方法是按照以下步骤操作:
  • 在 Dockerfile 中创建用户组并分配组 ID。

  • 使用用户 ID 创建用户并添加到 Dockerfile 中的组。

  • 递归地更改用户进程想要读/写的文件夹的所有权。

  • 将以下行添加到您的部署的 Pod 规范中:


spec:
  securityContext:
    runAsUser: 1099
    runAsGroup: 1099
    fsGroup: 1099

作为described in the docs

  • runAsUser:指定对于 Pod 中的任何容器,所有进程都以用户 ID 1099 运行。

  • runAsGroup:为 Pod 的任何容器内的所有进程指定 1099 的主要组 ID。如果省略此字段,则容器的主要组 ID 将为 root(0)。指定 1099 时,创建的任何文件也将归用户 1099 和组 runAsGroup 所有。

  • fsGroup:指定任何附加卷的所有者将成为组 ID 1099 的所有者。

  1. Configure volume permission and ownership change policy for Pods(我知道它不适合您的用例,但我会将这个选项留在这里供其他社区成员使用)。