场景是使用本地的目录作为持久卷或者想要将本地目录作为共享数据盘对外提供

local path provisioner

local path provisioner 可以让你使用 pv pvc 的方式来使用本地目录,同时添加了 pv schedule,保证 pod 在升级的时候还会调度到原来的节点上。 部署 local path provisioner

1
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

查看创建的 local-path storageclass,volumeBindingMode 是 WaitForFirstConsumer,WaitForFirstConsumer 和 Immediate 的区别是,Immediate 会在 pvc 创建后马上创建 pv,而 WaitForFirstConsumer 会在 pod 使用的时候才创建 pv,主要作用是让调度度能感知 pv 的情况来调度 pod。

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

设置为默认的 storageclass,如果系统中存在其他默认的 storageclass,需要把它们设置为 false

1
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

nfs provisioner

部署 local path provisioner > quota 好像没有作用, 最终的 quota 限制是目录所在的磁盘

1
helm install stable/nfs-server-provisioner --set persistence.enabled=true,persistence.size=30Gi --namespace=nfs

nfs provisioner 会使用一个 host path 的 volume 来作为共享盘来使用,查看创建出来的 pv 可以看到 nodeAffinity 信息,pod 在调度的 时候会感知到 pv 的调度限制,保证可以调度原来的 node 上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: v1
kind: PersistentVolume
metadata:
  finalizers:
  - kubernetes.io/pv-protection
  name: pvc-3d80384a-0f55-11ea-96b6-00163e129c28
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 30Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-ideal-nightingale-nfs-server-provisioner-0
    namespace: nfs
  hostPath:
    type: DirectoryOrCreate
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - cn-beijing.172.16.133.205
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-path

指定 storage class 为 nfs 创建共享盘即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  finalizers:
  - kubernetes.io/pvc-protection
  name: nfs-pvc
  namespace: jx
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: nfs

到节点查看文件信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ cd local-path-provisioner/
# 查看 local path 的 volume
$ ls
pvc-36c399a7-0f3f-11ea-9180-00163e059bee
$ cd pvc-36c399a7-0f3f-11ea-9180-00163e059bee/
$ ls
ganesha.log  nfs-provisioner.identity  pvc-911a998e-0f49-11ea-87dc-00163e0577f1  vfs.conf
# 查看 nfs 的 volume
$ ls pvc-911a998e-0f49-11ea-87dc-00163e0577f1/
agent  composer  support  workspace
$