下面我们通过创建一个基于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

应用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