下面我们通过创建一个基于NFS的SC来演示SC的作用。

要想使用NFS的SC,还需要安装一个NFS provisioner,provisioner里会定义NFS相关的信息(服务器IP、共享目录等)

1、下载源码

$ git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

2、修改命名空间为kube-system并创建rbac授权

$ cd nfs-subdir-external-provisioner/deploy
$ sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml
$ kubectl apply -f rbac.yaml

查看创建情况

$ k get sa -n kube-system | grep nfs

nfs-client-provisioner               1         44s

3、修改并应用deployment.yaml

修改命名空间为kube-system

$ cd nfs-subdir-external-provisioner/deploy
$ sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml

修改nfs服务器地址、nfs共享目录和镜像地址

$ cd nfs-subdir-external-provisioner/deploy
$ vim deployment.yaml

# 修改内容
image: registry.cn-hangzhou.aliyuncs.com/abroad_images/nfs-subdir-external-provisioner:v4.0.2

API资源对象StorageClass-1

应用deployment.yaml

$ cd nfs-subdir-external-provisioner/deploy
$ k apply -f deployment.yaml

验证查看

$ k get deploy -n kube-system | grep nfs
nfs-client-provisioner    1/1     1            1           119s

4、创建SC

$ cd nfs-subdir-external-provisioner/deploy
$ k apply -f class.yaml

验证查看

$ k get sc

NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  3m30s

5、创建PVC

$ vi nfsPvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfspvc

spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany

  resources:
    requests:
      storage: 500Mi

应用

$ k apply -f nfsPvc.yaml

6、创建一个Pod,来使用PVC

$ vi  nfsPod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nfspod
spec:
  containers:
  - name: nfspod
    image: nginx:1.21.6
    volumeMounts:
    - name: nfspv
      mountPath: "/usr/share/nginx/html"
  volumes:
  - name: nfspv
    persistentVolumeClaim:
      claimName: nfspvc

7、验证测试

在192.168.1.34主机上的/data/nfs目录下找到名字包含nfspvc的目录,进入创建文件1.html,文件内容为sc test

$ cd /data/nfs/default-nfspvc-pvc-08748e66-97ee-4e15-b2fb-e571da7e8fdc
$ echo "sc test" > 1.html

查看nfspod的IP

$ k get po -owide| grep nfspod

nfspod                          1/1     Running   0               7m10s   172.25.244.226   k8s-master01   <none>           <none>

进行curl测试

$ curl 172.25.244.226/1.html

sc test

8、恢复

$ k delete -f nfsPod.yaml
$ cd /root/nfs-subdir-external-provisioner/deploy
$ k delete -f class.yaml,deployment.yaml,rbac.yaml
$ k delete -f nfsPvc.yaml

9、小结

pod想使用共享存储 --> PVC (定义具体需求属性) -->SC (定义Provisioner) --> Provisioner(定义具体的访问存储方法) --> NFS-server