webentwicklung-frage-antwort-db.com.de

Die Berechtigung für persistente Kubernetes NFS-Volumes wurde verweigert

Ich habe eine Anwendung, die über einen POD in Kubernetes läuft. Ich möchte einige Ausgabedateiprotokolle auf einem dauerhaften Speichervolume speichern.

Zu diesem Zweck habe ich ein Volume über das NFS erstellt und es über den zugehörigen Volume-Claim an den POD gebunden. Wenn ich versuche, den freigegebenen Ordner zu schreiben oder darauf zuzugreifen, wird die Meldung "Berechtigung verweigert" angezeigt, da das NFS anscheinend schreibgeschützt ist.

Das Folgende ist die JSON-Datei, mit der ich das Volume erstellt habe:

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

Das Folgende ist die POD-Konfigurationsdatei

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

Gibt es eine Möglichkeit, Berechtigungen zu ändern?


AKTUALISIEREN

Hier sind die PVC- und NFS-Konfiguration:

PVC:

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

NFS-KONFIG

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

Ich habe gerade einige Statusinformationen aus der NFS-Konfiguration entfernt, um sie kürzer zu machen

2
fragae

Wenn Sie die richtige securityContext für die Pod-Konfiguration festlegen, können Sie sicherstellen, dass das Volume mit den richtigen Berechtigungen bereitgestellt wird.

Beispiel:

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

Im obigen Beispiel wird der Speicher unter /data/demo mit der Gruppen-ID 2000 bereitgestellt, die von fsGroup festgelegt wird. Sie müssen die Gruppen-ID des Benutzers herausfinden, den Sie verwenden. Führen Sie dazu den Container aus und geben Sie id ein und suchen Sie nach gid.

Um den Container auszuführen und die Ergebnisse von id abzurufen, geben Sie Folgendes ein: docker run --rm -it example-image id

Weitere Informationen zum Pod-Sicherheitskontext finden Sie hier: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/

2
MrBlaise

Danke an 白 白 天 für den Tipp . Wenn der Pod securityContext beispielsweise auf Folgendes festgelegt ist:

securityContext:
  runAsUser: 1000
  fsGroup: 1000

sie würden ssh an den NFS-Host senden und ausführen

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

Wenn Sie den Benutzer nicht kennen: group oder viele Pods werden ihn bereitstellen, können Sie ihn ausführen

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

Eine einfache Möglichkeit besteht darin, zum Speicher nfs und chmod 777 zu gelangen oder die Benutzer-ID in Ihrem Volumentest-Container anzugeben

0
白栋天

Ich bin ein wenig verwirrt darüber, wie Sie versuchen, die Dinge zu erledigen. Wenn ich verstanden habe, dass Sie richtig sind, versuchen Sie auf jeden Fall folgendes Beispiel:

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

Und dann macht vielleicht ein Init-Container etwas:

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

oder sind es die VolumeMounts, die Sie verpassen:

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

Mein letzter Kommentar wäre, auf Container zu achten. Ich denke, du darfst nur in /tmp schreiben, oder war es nur für CoreOS? Das müsste ich nachschlagen.

0
Naim Salameh

Haben Sie die Berechtigungen des Verzeichnisses überprüft? Stellen Sie sicher, dass Lesezugriff für alle verfügbar ist.

0
sairam546