web-dev-qa-db-fra.com

Autorisation des volumes persistants Kubernetes NFS refusée

J'ai une application qui s'exécute sur un POD sous Kubernetes. J'aimerais stocker certains journaux de fichiers de sortie sur un volume de stockage persistant.

Pour ce faire, j'ai créé un volume sur le système NFS et l'ai lié au POD via la revendication de volume associée. Lorsque j'essaie d'écrire ou d'accéder au dossier partagé, j'ai reçu un message "autorisation refusée", car le NFS est apparemment en lecture seule.

Voici le fichier json que j'ai utilisé pour créer le volume:

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

Ce qui suit est le fichier de configuration du 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

Est-il possible de modifier les autorisations?


METTRE À JOUR

Voici les configurations PVC et NFS:

PVC:

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"
  }
}

Je viens de supprimer certaines informations d'état de la configuration NFS pour le rendre plus court

2
fragae

Si vous définissez la variable securityContext appropriée pour la configuration du pod, vous pouvez vous assurer que le volume est monté avec les autorisations appropriées.

Exemple:

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

Dans l'exemple ci-dessus, la mémoire sera montée à /data/demo avec l'ID de groupe 2000, défini par fsGroup. Vous devez connaître l'ID de groupe de l'utilisateur que vous utilisez. Pour cela, exécutez le conteneur, tapez id et cherchez gid.

Pour exécuter le conteneur et obtenir les résultats de id, tapez: docker run --rm -it example-image id

Vous pouvez en savoir plus sur le contexte de sécurité du pod ici: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

2
MrBlaise

Merci à 白 栋 天 pour le tip . Par exemple, si le pod securityContext est défini sur:

securityContext:
  runAsUser: 1000
  fsGroup: 1000

vous voulez ssh à l'hôte NFS et exécutez

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

Si vous ne connaissez pas l'utilisateur: un groupe ou plusieurs pods le monteront, vous pouvez exécuter

chmod 777 -R /some/nfs/path
3
AlaskaJoslin

Un moyen simple consiste à accéder au stockage nfs et à chmod 777, ou de le chown avec l'ID utilisateur dans votre conteneur de test de volume

0
白栋天

Je suis un peu confus de la façon dont vous essayez de faire avancer les choses. En tout cas, si je vous comprends bien, essayez cet exemple:

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

Et puis peut-être qu'un conteneur init fera quelque chose:

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

ou est-ce le volume que vous manquez sur:

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

Mon dernier commentaire serait de prendre note sur les conteneurs, je pense que vous êtes seulement autorisé à écrire dans /tmp ou était-ce juste pour CoreOS? Je devrais regarder ça.

0
Naim Salameh

Avez-vous vérifié les autorisations du répertoire? Assurez-vous que l'accès en lecture est disponible pour tous.

0
sairam546