NFS 服务器和客户端都在工作,但数据不在服务器上?

AVa*_*arf 0 storage network-attached-storage nfs kubernetes

我有一个在裸机上运行的内部 Kubernetes 集群,它由 5 个节点(1 个主节点和 4 个工作节点)组成。我在 master 上本地设置了一个 NFS 服务器,并在 K8s 中启动了 nfs-client 以拥有 nfs 动态配置器。一切正常,我可以通过定义持久卷声明来使用我的应用程序,但我在磁盘上找不到我的数据。

每次启动应用程序时,nfs-client 都会在我的 nfs 服务器的路径上创建一个具有正确名称的新目录,但所有这些目录都是空的。所以我的问题是我的数据在哪里?

我正在使用nfs 客户端舵图。这是在我的 nfs 服务器路径中创建但空目录的示例:

/var/nfs/general$ tree
.
??? 166-postgres-claim-pvc-37146254-db50-4293-a9f7-13097689610a
?   ??? data
??? 166-registry-claim-pvc-fe337e34-d9a5-4266-8178-f67973894584
??? 166-registry-slave-claim-registry-slave-0-pvc-b18d430b-e1fc-4eeb-bd12-cab9340bed69
??? 166-rtspdata-claim-pvc-bf9bc1e3-412f-4627-ade4-50817478308e
??? 172-postgres-claim-pvc-087538cf-5b67-4789-8d8b-117d41c3fe02
?   ??? data
??? 172-registry-claim-pvc-7b7d9bb6-a636-4f78-b2fe-924473cb47ab
??? 172-registry-slave-claim-registry-slave-0-pvc-34e62524-fca0-48dd-ba29-b4cf178ca028
??? 172-rtspdata-claim-pvc-211a1aac-409f-431c-b78d-5b87b9017625
??? 173-postgres-claim-pvc-b901449a-0ce7-4ecf-8dfc-e6371dd3a9b4
?   ??? data
??? 173-registry-claim-pvc-cd842cde-a3f7-4d54-94d6-c018e42ec495
??? 173-rtspdata-claim-pvc-a95c5748-ebed-4045-98b2-a04e534e0cf6
??? archived-161-postgres-claim-pvc-01cc1ff2-8cc8-4161-8d85-00cb6562e10e
?   ??? data
??? archived-161-registry-claim-pvc-9b626e01-a565-4214-b94e-b7ba1e206a5e
??? archived-161-rtspdata-claim-pvc-b079c7e2-248e-4245-b243-5ff7dc3afa82
??? archived-162-postgres-claim-pvc-188af7ca-106d-4f2f-8905-9d7b391e9dce
?   ??? data
??? archived-162-postgres-claim-pvc-356e4632-19e2-4ac9-8400-e00d39621b7c
?   ??? data
??? archived-162-postgres-claim-pvc-45372032-979f-4ced-be35-15ec67a322b7
?   ??? data
??? archived-162-postgres-claim-pvc-6d5e1f01-ad5b-45cc-9eef-654275e3ecd2
?   ??? data
??? archived-162-postgres-claim-pvc-cbf4d4ca-b9d1-4d1c-88be-621eeb3680fb
?   ??? data
??? archived-162-postgres-claim-pvc-eaa32a4c-9768-469a-ad85-1e1b682c376d
?   ??? data
??? archived-162-postgres-claim-pvc-f517586b-e132-4a38-8ec9-18f6d5ca000e
?   ??? data
??? archived-162-registry-claim-pvc-1796642a-d639-4ede-8204-1779c029aa4e
?   ??? rethinkdb_data
Run Code Online (Sandbox Code Playgroud)

Mar*_*ney 6

我在我的测试环境中重现了这个场景,我可以正常找到我的数据。为了重现它,我遵循了这些步骤。

确保您遵循每个步骤。编辑这个文件需要root权限;因此,您需要在命令中使用 sudo。您还可以在您个人喜欢的任何文本编辑器中打开该文件。

1 - 在我的主节点上安装和配置我的 NFS 服务器(Debian Linux,这可能会根据您的 Linux 发行版而改变):

在安装 NFS 内核服务器之前,我们需要更新我们系统的存储库索引:

$ sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

现在,运行以下命令以在您的系统上安装 NFS 内核服务器:

$ sudo apt install nfs-kernel-server
Run Code Online (Sandbox Code Playgroud)

创建导出目录

$ sudo mkdir -p /mnt/nfs_server_files
Run Code Online (Sandbox Code Playgroud)

由于我们希望所有客户端都访问该目录,因此我们将通过以下命令删除导出文件夹的限制性权限(根据您的安全策略,这可能因您的设置而异):

$ sudo chown nobody:nogroup /mnt/nfs_server_files
$ sudo chmod 777 /mnt/nfs_server_files
Run Code Online (Sandbox Code Playgroud)

通过 NFS 导出文件为客户端分配服务器访问权限

$ sudo nano /etc/exports
Run Code Online (Sandbox Code Playgroud)

在此文件中,添加一个新行以允许从其他服务器访问您的共享。

/mnt/nfs_server_files        10.128.0.0/24(rw,sync,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

您可能希望在共享中使用不同的选项。10.128.0.0/24是我的k8s内网。

导出共享目录并重新启动服务以确保所有配置文件都正确。

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server
Run Code Online (Sandbox Code Playgroud)

检查所有活动共享:

$ sudo exportfs
/mnt/nfs_server_files
                10.128.0.0/24
Run Code Online (Sandbox Code Playgroud)

2 - 在我所有的工作节点上安装 NFS 客户端:

$ sudo apt-get update
$ sudo apt-get install nfs-common
Run Code Online (Sandbox Code Playgroud)

此时,您可以进行测试以检查您是否可以从您的工作节点访问您的共享:

$ sudo mkdir -p /mnt/sharedfolder_client
$ sudo mount kubemaster:/mnt/nfs_server_files /mnt/sharedfolder_client
Run Code Online (Sandbox Code Playgroud)

请注意,此时您可以使用主节点的名称。K8s 在这里负责处理 DNS。检查卷是否按预期安装并创建一些文件夹和文件以确保一切正常。

$ cd /mnt/sharedfolder_client
$ mkdir test
$ touch file
Run Code Online (Sandbox Code Playgroud)

返回您的主节点并检查这些文件是否位于 /mnt/nfs_server_files 文件夹中。

3 - 安装 NFS 客户端配置程序

使用 helm 安装配置器:

$ helm install --name ext --namespace nfs --set nfs.server=kubemaster --set nfs.path=/mnt/nfs_server_files stable/nfs-client-provisioner
Run Code Online (Sandbox Code Playgroud)

请注意,我已经为它指定了一个命名空间。检查它们是否正在运行:

$ kubectl get pods -n nfs
NAME                                         READY   STATUS      RESTARTS   AGE
ext-nfs-client-provisioner-f8964b44c-2876n   1/1     Running     0          84s
Run Code Online (Sandbox Code Playgroud)

此时我们有一个名为 nfs-client 的存储类:

$ kubectl get storageclass -n nfs
NAME         PROVISIONER                                AGE
nfs-client   cluster.local/ext-nfs-client-provisioner   5m30s
Run Code Online (Sandbox Code Playgroud)

我们需要创建一个 PersistentVolumeClaim:

$ more nfs-client-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  namespace: nfs 
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f nfs-client-pvc.yaml
Run Code Online (Sandbox Code Playgroud)

检查状态(预期绑定):

$ kubectl get persistentvolumeclaim/test-claim -n nfs
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-e1cd4c78-7c7c-4280-b1e0-41c0473652d5   1Mi        RWX            nfs-client     24s
Run Code Online (Sandbox Code Playgroud)

4 - 创建一个简单的 pod 来测试我们是否可以读/写 NFS 共享:

使用这个 yaml 创建一个 pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod0
  labels:
    env: test
  namespace: nfs  
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim
Run Code Online (Sandbox Code Playgroud)
$ kubectl apply -f pod.yaml
Run Code Online (Sandbox Code Playgroud)

现在,让我们深入了解这个 pod:

$ kubectl exec -ti -n nfs pod0 -- bash
Run Code Online (Sandbox Code Playgroud)

让我们列出 pod 上所有已安装的卷:

root@pod0:/# df -h
Filesystem                                                                                Size  Used Avail Use% Mounted on
overlay                                                                                   9.8G  6.1G  3.3G  66% /
tmpfs                                                                                      64M     0   64M   0% /dev
tmpfs                                                                                     7.4G     0  7.4G   0% /sys/fs/cgroup
kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12  9.8G  5.8G  3.6G  62% /mnt
/dev/sda1                                                                                 9.8G  6.1G  3.3G  66% /etc/hosts
shm                                                                                        64M     0   64M   0% /dev/shm
tmpfs                                                                                     7.4G   12K  7.4G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                                                     7.4G     0  7.4G   0% /proc/acpi
tmpfs                                                                                     7.4G     0  7.4G   0% /sys/firmware
Run Code Online (Sandbox Code Playgroud)

正如我们所见,我们在 /mnt 上挂载了一个 NFS 卷。(注意路径很重要kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12

让我们检查一下:

root@pod0:/# cd /mnt
root@pod0:/mnt# ls -la
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:33 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..
Run Code Online (Sandbox Code Playgroud)

它是空的。让我们创建一些文件:

$ for i in 1 2 4 5 6; do touch file$i; done;
$ ls -l 
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:58 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file1
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file2
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file4
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file5
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file6
Run Code Online (Sandbox Code Playgroud)

现在让我们看看 NFS 服务器(主节点)上的这些文件在哪里:

$ cd /mnt/nfs_server_files
$ ls -l 
total 4
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 09:11 nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12
$ cd nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12/
$ ls -l 
total 0
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file1
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file2
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file4
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file5
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file6
Run Code Online (Sandbox Code Playgroud)

这是我们刚刚在 pod 中创建的文件!