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
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/
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
Eine einfache Möglichkeit besteht darin, zum Speicher nfs und chmod 777 zu gelangen oder die Benutzer-ID in Ihrem Volumentest-Container anzugeben
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.
Haben Sie die Berechtigungen des Verzeichnisses überprüft? Stellen Sie sicher, dass Lesezugriff für alle verfügbar ist.