Доступ к постоянным томам Kubernetes NFS запрещен - PullRequest
0 голосов
/ 03 мая 2018

У меня есть приложение, работающее поверх POD в Kubernetes. Я хотел бы сохранить некоторые журналы выходного файла на постоянном томе хранения.

Чтобы сделать это, я создал том поверх NFS и связал его с POD через соответствующее требование тома. Когда я пытаюсь написать или присоединиться к общей папке, я получил сообщение «Отказано в доступе», поскольку NFS, по-видимому, доступна только для чтения.

Ниже приведен файл json, который я использовал для создания тома:

{
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "task-pv-test"
      },
      "spec": {
        "capacity": {
          "storage": "10Gi"
        },
        "nfs": {
          "server": <IPAddress>,
          "path": "/export"
        },
        "accessModes": [
          "ReadWriteMany"
        ],
        "persistentVolumeReclaimPolicy": "Delete",
        "storageClassName": "standard"
      }
    }

Ниже приведен файл конфигурации POD

kind: Pod
apiVersion: v1
metadata:
    name: volume-test
spec:
    volumes:
        -   name: task-pv-test-storage
            persistentVolumeClaim:
                claimName: task-pv-test-claim
    containers:
        -   name: volume-test
            image: <ImageName>
            volumeMounts:
            -   mountPath: /home
                name: task-pv-test-storage
                readOnly: false

Есть ли способ изменить разрешения?


UPDATE

Вот настройки PVC и NFS:

ПВХ:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-test-claim
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi

NFS CONFIG

{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "nfs-client-provisioner-557b575fbc-hkzfp",
    "generateName": "nfs-client-provisioner-557b575fbc-",
    "namespace": "default",
    "selfLink": "/api/v1/namespaces/default/pods/nfs-client-provisioner-557b575fbc-hkzfp",
    "uid": "918b1220-423a-11e8-8c62-8aaf7effe4a0",
    "resourceVersion": "27228",
    "creationTimestamp": "2018-04-17T12:26:35Z",
    "labels": {
      "app": "nfs-client-provisioner",
      "pod-template-hash": "1136131967"
    },
    "ownerReferences": [
      {
        "apiVersion": "extensions/v1beta1",
        "kind": "ReplicaSet",
        "name": "nfs-client-provisioner-557b575fbc",
        "uid": "3239b14a-4222-11e8-8c62-8aaf7effe4a0",
        "controller": true,
        "blockOwnerDeletion": true
      }
    ]
  },
  "spec": {
    "volumes": [
      {
        "name": "nfs-client-root",
        "nfs": {
          "server": <IPAddress>,
          "path": "/Kubernetes"
        }
      },
      {
        "name": "nfs-client-provisioner-token-fdd2c",
        "secret": {
          "secretName": "nfs-client-provisioner-token-fdd2c",
          "defaultMode": 420
        }
      }
    ],
    "containers": [
      {
        "name": "nfs-client-provisioner",
        "image": "quay.io/external_storage/nfs-client-provisioner:latest",
        "env": [
          {
            "name": "PROVISIONER_NAME",
            "value": "<IPAddress>/Kubernetes"
          },
          {
            "name": "NFS_SERVER",
            "value": <IPAddress>
          },
          {
            "name": "NFS_PATH",
            "value": "/Kubernetes"
          }
        ],
        "resources": {},
        "volumeMounts": [
          {
            "name": "nfs-client-root",
            "mountPath": "/persistentvolumes"
          },
          {
            "name": "nfs-client-provisioner-token-fdd2c",
            "readOnly": true,
            "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
          }
        ],
        "terminationMessagePath": "/dev/termination-log",
        "terminationMessagePolicy": "File",
        "imagePullPolicy": "Always"
      }
    ],
    "restartPolicy": "Always",
    "terminationGracePeriodSeconds": 30,
    "dnsPolicy": "ClusterFirst",
    "serviceAccountName": "nfs-client-provisioner",
    "serviceAccount": "nfs-client-provisioner",
    "nodeName": "det-vkube-s02",
    "securityContext": {},
    "schedulerName": "default-scheduler",
    "tolerations": [
      {
        "key": "node.kubernetes.io/not-ready",
        "operator": "Exists",
        "effect": "NoExecute",
        "tolerationSeconds": 300
      },
      {
        "key": "node.kubernetes.io/unreachable",
        "operator": "Exists",
        "effect": "NoExecute",
        "tolerationSeconds": 300
      }
    ]
  },
  "status": {
    "phase": "Running",
    "hostIP": <IPAddress>,
    "podIP": "<IPAddress>,
    "startTime": "2018-04-17T12:26:35Z",
    "qosClass": "BestEffort"
  }
}

Я только что удалил некоторую информацию о состоянии из конфигурации nfs, чтобы сделать ее короче

Ответы [ 5 ]

0 голосов
/ 07 ноября 2018

Спасибо 白 栋 天 за подсказку . Например, если для pod securityContext установлено значение:

securityContext:
  runAsUser: 1000
  fsGroup: 1000

вы бы подключились к серверу NFS и запустили

chown 1000:1000 -R /some/nfs/path

Если вы не знаете пользователя: группа или несколько модулей будут его монтировать, вы можете запустить

chmod 777 -R /some/nfs/path
0 голосов
/ 05 мая 2018

Если вы установили правильное значение securityContext для конфигурации модуля, вы можете убедиться, что том смонтирован с соответствующими разрешениями.

Пример:

apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  securityContext:
    fsGroup: 2000 
  volumes:
    - name: task-pv-test-storage
      persistentVolumeClaim:
        claimName: task-pv-test-claim
  containers:
  - name: demo
    image: example-image
    volumeMounts:
    - name: task-pv-test-storage
      mountPath: /data/demo

В приведенном выше примере хранилище будет смонтировано на /data/demo с идентификатором группы 2000, который установлен на fsGroup. Вам необходимо узнать идентификатор группы пользователя, которого вы используете. Для этого запустите контейнер и введите id и найдите gid.

Для запуска контейнера и получения результатов id введите: docker run --rm -it example-image id

Подробнее о контексте безопасности модуля вы можете прочитать здесь: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

0 голосов
/ 04 мая 2018

Простой способ - перейти к хранилищу nfs и chmod 777, или chown с идентификатором пользователя в контейнере для проверки объема.

0 голосов
/ 05 мая 2018

Я немного смущен тем, как вы пытаетесь добиться цели, в любом случае, если я вас правильно понимаю, попробуйте этот пример:

  volumeClaimTemplates:
  - metadata:
      name: data
      namespace: kube-system
      labels:
        k8s-app: something
        monitoring: something
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

А потом, может быть, контейнер init сделает что-то:

initContainers:
        - name: prometheus-init
          image: /something/bash-alpine:1.5
          command:
            - chown
            - -R
            - 65534:65534
            - /data
          volumeMounts:
            - name: data
              mountPath: /data

или это том, на котором вам не хватает тома:

volumeMounts:
            - name: config-volume
              mountPath: /etc/config
            - name: data
              mountPath: /data

Мой последний комментарий - записывать контейнеры, я думаю, что вы можете писать только в /tmp или это было только для CoreOS? Я должен был бы посмотреть это.

0 голосов
/ 03 мая 2018

Вы проверили разрешения каталога? Убедитесь, что доступ для чтения доступен всем.

...