无法在Kubernetes(Google Cloud)中将数据保留在我的永久卷上

问题描述 投票:0回答:1

我在Google Cloud的Kubernetes集群上有一个Redis容器。我建立了光伏和索赔。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: my-size 
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: postgres
  name: redis-pv-claim
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: my size 

我也将其安装在我的deployment.yaml中

volumeMounts:
      - mountPath: /data
        name: redis-pv-claim
    volumes:
    - name: redis-pv-claim
      persistentVolumeClaim:
        claimName: redis-pv-claim  

我在运行describe pod时看不到任何错误

Volumes:
  redis-pv-claim:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  redis-pv-claim
    ReadOnly:   false

但是它无法保存任何密钥。每次部署后,“ / data”文件夹都为空。

kubernetes redis persistent-storage
1个回答
0
投票

发生的情况是,当您有多个节点使用PVC在Pod之间共享文件不是最佳方法。

PVC可以在同一节点中的Pod之间共享文件。因此,如果我有多个节点,有时我可能会觉得文件没有正确存储。

您的理想解决方案是使用任何可用的DSF解决方案。在问题中,您提到您正在使用GCP,但不清楚是使用GKE还是在计算实例之上创建了集群。

如果您有权访问节点,则最简单的设置是在一个节点中创建一个NFS服务器,并使用nfs-client-provisioner提供从Pod中访问nfs服务器的权限。

我已经使用这种方法已有相当长的一段时间了,它确实运行良好。

1-在我的主节点上安装和配置NFS服务器(Debian Linux,这可能会有所不同,具体取决于您的Linux发行版):

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

$ sudo apt-get update

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

$ sudo apt install nfs-kernel-server

创建导出目录

$ sudo mkdir -p /mnt/nfs_server_files

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

$ sudo chown nobody:nogroup /mnt/nfs_server_files
$ sudo chmod 777 /mnt/nfs_server_files

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

$ sudo nano /etc/exports

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

/mnt/nfs_server_files        10.128.0.0/24(rw,sync,no_subtree_check)

您可能希望在共享中使用其他选项。 10.128.0.0/24是我的k8s内部网络。

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

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

检查所有活动共享:

$ sudo exportfs
/mnt/nfs_server_files
                10.128.0.0/24

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

$ sudo apt-get update
$ sudo apt-get install nfs-common

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

$ sudo mkdir -p /mnt/sharedfolder_client
$ sudo mount kubemaster:/mnt/nfs_server_files /mnt/sharedfolder_client

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

$ cd /mnt/sharedfolder_client
$ mkdir test
$ touch file

返回到主节点,并检查这些文件是否在/ mnt / nfs_server_files文件夹中。

3-安装NFS客户端预配器

使用头盔安装预配器:

$ helm install --name ext --namespace nfs --set nfs.server=kubemaster --set nfs.path=/mnt/nfs_server_files stable/nfs-client-provisioner

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

$ kubectl get pods -n nfs
NAME                                         READY   STATUS      RESTARTS   AGE
ext-nfs-client-provisioner-f8964b44c-2876n   1/1     Running     0          84s

目前,我们有一个名为nfs-client的存储类:

$ kubectl get storageclass -n nfs
NAME         PROVISIONER                                AGE
nfs-client   cluster.local/ext-nfs-client-provisioner   5m30s

我们需要创建一个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
$ kubectl apply -f nfs-client-pvc.yaml

检查状态(需要绑定):

$ 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

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

使用此Yaml创建广告连播:

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
$ kubectl apply -f pod.yaml

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

$ kubectl exec -ti -n nfs pod0 -- df -h /mnt
Filesystem                                                                               Size  Used Avail Use% Mounted on
kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1   99G   11G   84G  11% /mnt

如我们所见,我们在/ mnt上安装了一个NFS卷。 (重要注意路径kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1

让我们检查一下:

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 ..

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

$ for i in 1 2; 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

现在让我们在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

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

© www.soinside.com 2019 - 2024. All rights reserved.