Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 如何将一个永久卷声明的数据与另一个永久卷声明的数据隔离_Kubernetes_Persistent Volumes - Fatal编程技术网

Kubernetes 如何将一个永久卷声明的数据与另一个永久卷声明的数据隔离

Kubernetes 如何将一个永久卷声明的数据与另一个永久卷声明的数据隔离,kubernetes,persistent-volumes,Kubernetes,Persistent Volumes,我使用以下YAML创建了一个持久卷 apiVersion: v1 kind: PersistentVolume metadata: name: dq-tools-volume labels: name: dq-tools-volume spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClas

我使用以下YAML创建了一个持久卷

apiVersion: v1
kind: PersistentVolume
metadata:
  name: dq-tools-volume
  labels:
    name: dq-tools-volume
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: volume-class
  nfs:
    server: 192.168.215.83
    path: "/var/nfsshare"
创建了这个之后,我使用以下YAML创建了两个persistentvolumeclaims

PVC1:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
$ sudo apt-get update
$ sudo apt-get install nfs-common
PVC2:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
$ sudo apt-get update
$ sudo apt-get install nfs-common
但我注意到这两个持久卷声明都在写入同一个后端卷


如何将一个persistentvolumeclaim的数据与另一个隔离。我将此应用于Jenkins的多个安装。我希望将每个Jenkins的工作区隔离。

据我所知,不可能将两个PVC绑定到同一个PV上

请参阅此链接>

您可能需要查看您的设置

通过创建一个10G PV和两个带有8Gi和2Gi索赔请求的PVC进行测试 PVC-2进入待定状态

master $ kubectl get persistentvolume
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM         STORAGECLASS   REASON    AGE
pv        10Gi       RWX            Retain           Bound     default/pv1                            7m


master $ kubectl get persistentvolumeclaims
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1       Bound     pv        10Gi       RWX                           3m
pvc2       Pending                                                      8s
用于创建PV和PVC的文件如下

master $ cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /var/tmp/

正如@D.T.所解释的,持久卷声明专门绑定到持久卷。
不能将两个pvc绑定到同一个pv

你可以找到另一个讨论过的案例

对于您的场景,有一个更好的解决方案,它包括使用。要实现这一点,首先必须在集群中安装helm,然后按照我为之前的on-ServerFault创建的这些步骤进行操作

我已经测试过了,使用这种溶液,你可以将一种PVC与另一种PVC隔离开来

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
$ sudo apt-get update
$ sudo apt-get install nfs-common
在安装NFS内核服务器之前,我们需要更新系统的存储库索引:

$ sudo apt-get update
现在,运行以下命令以便在系统上安装NFS内核服务器:

$ sudo apt install nfs-kernel-server
创建导出目录

$ sudo mkdir -p /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客户端:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
$ 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\u server\u files文件夹中

3-安装NFS客户端Provisioner

使用头盔安装供应器:

$ 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客户端的storageclass:

$ 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
检查状态(需要绑定):

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume
$ sudo apt-get update
$ sudo apt-get install nfs-common
使用此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
让我们列出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\u server\u 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服务器(主节点)上的这些文件在哪里:

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