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
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/
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
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
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.
Avez-vous vérifié les autorisations du répertoire? Assurez-vous que l'accès en lecture est disponible pour tous.