TL; DR: у меня проблемы с монтированием NFS внутри стручка Kubernetes
Когда я пытаюсь смонтировать /exports
из NFS-сервиса, я получаю сообщение об ошибке, что он защищен от записи, когда (rw)
указан в /etc/exports
Сначала я создал диск GCP для монтирования, так как вычислительные диски PV
gcloud compute disks create --size=50GB --zone=us-central1-a nfs-disk
Затем я kubectl apply -f
следующие две конфигурации.
NFS_Deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-server
spec:
replicas: 1
selector:
matchLabels:
app: nfs-server
template:
metadata:
labels:
app: nfs-server
spec:
containers:
- name: nfs-server
image: gcr.io/google_containers/volume-nfs:0.8
ports:
- name: nfs
containerPort: 2049
- name: mountd
containerPort: 20048
- name: rpcbind
containerPort: 111
securityContext:
privileged: true
volumeMounts:
- mountPath: /exports
name: nfs-disk
volumes:
- name: nfs-disk
gcePersistentDisk:
pdName: nfs-disk
fsType: ext4
NFS_Service.yaml
apiVersion: v1
kind: Service
metadata:
name: nfs-service
spec:
clusterIP: 10.27.254.55
ports:
- name: nfs
port: 2049
- name: mountd
port: 20048
- name: rpcbind
port: 111
selector:
app: nfs-server
Это приводит к следующему /etc/exports
внутри контейнера nfs-server
[root@nfs-server-85546b8c7b-jlzc5 /]# cat /etc/exports
/exports *(rw,fsid=0,insecure,no_root_squash)
/ *(rw,fsid=0,insecure,no_root_squash)
После этого я запускаю временный контейнер только для проверки с помощью следующей команды
kubectl run --rm -it --image=markeijsermans/debug:kitchen-sink debug /bin/bash
* Используемое изображение - это просто изображение для устранения неполадок, которое я нашел , У меня точно такая же проблема с каждым изображением, которое я пробовал, включая Ubuntu и fedora
Когда я пытаюсь смонтировать nfs внутри контейнера отладки (в том же кластере), я получаю следующую ошибку
(22:54 debug-7dcc5cd59f-496fd:/) mkdir /test
(22:54 debug-7dcc5cd59f-496fd:/) chmod -R 777 /test/
(22:54 debug-7dcc5cd59f-496fd:/) mount -t nfs nfs-service.default.svc.cluster.local:/exports /test/
mount: nfs-service.default.svc.cluster.local:/exports is write-protected, mounting read-only
mount: cannot mount nfs-service.default.svc.cluster.local:/exports read-only
(32 22:54 debug-7dcc5cd59f-496fd:/) mount -t nfs 10.27.254.55:/exports /test/
mount: 10.27.254.55:/exports is write-protected, mounting read-only
mount: cannot mount 10.27.254.55:/exports read-only
(32 22:55 debug-7dcc5cd59f-496fd:/) mount -t nfs nfs-service:/exports /test/
mount: nfs-service:/exports is write-protected, mounting read-only
mount: cannot mount nfs-service:/exports read-only
(32 22:55 debug-7dcc5cd59f-496fd:/)
Изменить: я должен упомянуть здесь, что я могу успешно смонтировать /exports от localhost, если я kubectl exec -it nfs-server-xxxxxxx /bin/bash
.
^^^^ Это проблема, которую я пытаюсь решить
Любопытно, что я могу использовать сервер NFS в качестве PV и PVC. Чтобы продемонстрировать, следующее yaml развертывается и может быть успешно использовано
NFS_Volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: nfs-service.default.svc.cluster.local
path: "/"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 10Gi
Это может быть доказано и протестировано с помощью следующего ReplicationController
_NFS_Test_PV.yaml
# This mounts the nfs volume claim into /mnt and continuously
# overwrites /mnt/index.html with the time and hostname of the pod.
apiVersion: v1
kind: ReplicationController
metadata:
name: nfs-busybox
spec:
replicas: 2
selector:
name: nfs-busybox
template:
metadata:
labels:
name: nfs-busybox
spec:
containers:
- image: busybox
command:
- sh
- -c
- 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'
imagePullPolicy: IfNotPresent
name: busybox
volumeMounts:
- name: nfs
mountPath: "/mnt"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs