一、NFS在K8S中的应用场景

1.1 在PVC中调用StorageClass

# 定义pvc
[root@master01 2]# vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: nfs-storage #指定通过哪个StorageClass创建
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi

# 应用
[root@master01 2]# kaf test-pvc.yaml

# 查看pv,pvc
[root@master01 2]# kg pvc
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
test-pvc   Bound    pvc-6fd5ccf3-e243-40e4-9ed0-3556fc06e43a   500Mi      RWX            nfs-storageclass   15s
[root@master01 2]# kg pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS       REASON   AGE
pvc-6fd5ccf3-e243-40e4-9ed0-3556fc06e43a   500Mi      RWX            Delete           Bound    default/test-pvc   nfs-storageclass            73s

1.2 在StatefulSet控制器中调用StorageClass

需求:使用statfulset部署nginx,每个pod使用不同的pvc存储数据

# 定义yaml文件
[root@master01 2]# vim nginx-statfuleset-pvc.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-storage-stat
spec:
  replicas: 3
  serviceName: "nginx"
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6
        volumeMounts:
        - name: nginx-storage-test-pvc
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: #在statfulset.spec下定义pvc模板里面的配置参数和pvc的一致
    - metadata: #定义元数据
        name: nginx-storage-test-pvc #pvc的名称要与volumeMounts中的名称一致
      spec: #定义属性
        storageClassName: nfs-storage #指定使用哪个storageclass
        accessModes: #访问模式为多主机可读写
        - ReadWriteMany
        resources: #分配的资源大小
          requests:
            storage: 1Gi

# 应用
[root@master01 2]# kaf nginx-statfuleset-pvc.yaml

# 查看pod
[root@master01 2]# kgp  | grep nginx-storage-stat
nginx-storage-stat-0              2/2     Running   0             34s
nginx-storage-stat-1              2/2     Running   0             28s
nginx-storage-stat-2              2/2     Running   0             24s

# 查看pvc观察到已为每个Pod分配了pvc
[root@master01 2]# kg pvc |grep nginx-storage-test
nginx-storage-test-pvc-nginx-storage-stat-0   Bound    pvc-098095ba-8116-4036-a84d-610bd105c309   1Gi        RWX            nfs-client     97s
nginx-storage-test-pvc-nginx-storage-stat-1   Bound    pvc-6f6b6b54-f339-43bd-bf12-c8ae91b642ed   1Gi        RWX            nfs-client     91s
nginx-storage-test-pvc-nginx-storage-stat-2   Bound    pvc-c70d6988-f88a-4eab-91e1-2660e8326191   1Gi        RWX            nfs-client     87s

# 在每个pod上写入数据验证持久化
[root@master01 2]# kubectl exec -it nginx-storage-stat-0 bash
root@nginx-storage-stat-0:/# echo nginx00000000000 > /usr/share/nginx/html/nginx-storage-stat-0
root@nginx-storage-stat-0:/# exit
exit
[root@master01 2]# kubectl exec -it nginx-storage-stat-1 bash
root@nginx-storage-stat-1:/# echo nginx11111111111 > /usr/share/nginx/html/nginx-storage-stat-1
root@nginx-storage-stat-1:/# exit
exit
[root@master01 2]# kubectl exec -it nginx-storage-stat-2 bash
root@nginx-storage-stat-2:/# echo nginx22222222222 > /usr/share/nginx/html/nginx-storage-stat-2
root@nginx-storage-stat-2:/# exit

# 验证在nfs机器上查看数据是否写入观察到数据已成功写入
[root@node01 ~]# cat /opt/sharedata/default-nginx-storage-test-pvc-nginx-storage-stat-0-pvc-098095ba-8116-4036-a84d-610bd105c309/nginx-storage-stat-0
nginx00000000000
[root@node01 ~]# cat /opt/sharedata/default-nginx-storage-test-pvc-nginx-storage-stat-1-pvc-6f6b6b54-f339-43bd-bf12-c8ae91b642ed/nginx-storage-stat-1
nginx11111111111
[root@node01 ~]# cat /opt/sharedata/default-nginx-storage-test-pvc-nginx-storage-stat-2-pvc-c70d6988-f88a-4eab-91e1-2660e8326191/nginx-storage-stat-2
nginx22222222222

# 删除sts资源
[root@master01 2]# k delete -f nginx-statfuleset-pvc.yaml

# 重新应用并验证观察到数据仍然存在
[root@master01 1]# kaf nginx-statfuleset-pvc.yaml
[root@master01 1]# kubectl exec -it nginx-storage-stat-0 -- cat /usr/share/nginx/html/nginx-storage-stat-0
nginx00000000000
[root@master01 1]# kubectl exec -it nginx-storage-stat-1 -- cat /usr/share/nginx/html/nginx-storage-stat-1
nginx11111111111
[root@master01 1]# kubectl exec -it nginx-storage-stat-2 -- cat /usr/share/nginx/html/nginx-storage-stat-2
nginx22222222222

# 环境复原
[root@master01 2]# k delete -f nginx-statfuleset-pvc.yaml
[root@master01 2]# k delete -f test-pvc.yaml
[root@master01 2]# k delete pvc nginx-storage-test-pvc-nginx-storage-stat-0 nginx-storage-test-pvc-nginx-storage-stat-1 nginx-storage-test-pvc-nginx-storage-stat-2

1.3 应用建议

大中小型网站(2000万/日pv以下)线上应用,门户网站也可以使用;

对于大型网站且可靠性要求较高的企业,nfs网络文件系统的替代软件为分布式文件系统ceph,fastDFS;