Step - 1:创建NFS服务
    image.png
    如我们在概念一章所提到的,首先我们要创建NFS服务和对应的存储资源,而且不能是共享型的存储,必须一对一,我这里创建了一个单独的目录专门给statefulset相关配置资源和存储,以免混乱

    “mkdir /opt/kubernetes-statefulset”

    “mkdir pv-set-1 pv-set-2 pv-set-3”

    image.png
    和之前一样,要进行相对应的存储路径暴露

    /opt/testdirectory 10.1.10.0/24(rw,no_root_squash)

    /opt/testpv/pv-1 10.1.10.0/24(rw,no_root_squash)
    /opt/testpv/pv-2 10.1.10.0/24(rw,no_root_squash)
    /opt/testpv/pv-3 10.1.10.0/24(rw,no_root_squash)

    /opt/kubernetes-statefulset/pv-set-1 10.1.10.0/24(rw,no_root_squash)

    image.png
    重启并查看服务状态

    “systemctl restart nfs”

    “systemctl status nfs”

    Step - 2:创建PV资源
    image.png
    image.png
    这里需要注意一个点,statefulset创建之中,他的pvc资源是不用特意手动配置的,他会动态去获取,创建和绑定,但是PV资源还是要创建的,而且要大于你statefulset资源所需要的存储空间,如果最终无法动态获取的话,可能会涉及到要安装storageclass存储

    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: pv-set-1
    spec:
    capacity:
    storage: 3Gi #(明确申明,需要3G的存储空间作为存储卷)
    accessModes:
    - ReadWriteMany #(访问模式)
    persistentVolumeReclaimPolicy: Retain #(回收策略)
    nfs:
    path: /opt/kubernetes-statefulset/pv-set-1 #(指定存储路径)
    server: 10.1.10.128 #(存储服务器节点)
    —-
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: pv-set-2
    spec:
    capacity:
    storage: 1Gi #(明确申明,需要1G以上的存储空间作为存储卷)
    accessModes:
    - ReadWriteMany #(访问模式)
    persistentVolumeReclaimPolicy: Retain #(回收策略)
    nfs:
    path: /opt/kubernetes-statefulset/pv-set-2 #(指定存储路径)
    server: 10.1.10.128 #(存储服务器节点)
    —-
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: pv-set-3
    spec:
    capacity:
    storage: 1Gi #(明确申明,需要1G以上的存储空间作为存储卷)
    accessModes:
    - ReadWriteMany #(访问模式)
    persistentVolumeReclaimPolicy: Retain #(回收策略)
    nfs:
    path: /opt/kubernetes-statefulset/pv-set-3 #(指定存储路径)
    server: 10.1.10.128 #(存储服务器节点)

    image.png
    声明式创建PV

    “kubectl apply -f statefulset-pv.yaml”

    image.png
    创建成功
    Step - 3:创建Storageclass
    image.png
    可能会涉及到需要创建storageclass的配置

    相关文档:https://blog.csdn.net/w184414332/article/details/124006555

    Step - 4:创建StatefulSet
    image.png
    创建yaml配置文件,随后声明式创建即可

    apiVersion: v1 #定义Headless服务
    kind: Service
    metadata:
    name: mystatefulset
    namespace: storage
    labels:
    app: mystatefulset
    spec:
    ports:
    - port: 80
    name: web
    clusterIP: None
    selector:
    app: mystatefulset-pod
    —-
    apiVersion: apps/v1 #配置statefulset
    kind: StatefulSet
    metadata:
    name: mynginx
    namespace: storage
    spec:
    serviceName: mystatefulset
    replicas: 2
    selector:
    matchLabels:
    app: mystatefulset-pod
    template:
    metadata:
    labels:
    app: mystatefulset-pod
    spec:
    containers:
    - name: mynginx
    image: nginx:latest
    ports:
    - name: web
    containerPort: 80
    volumeMounts:
    - name: mynginx-data
    mountPath: /usr/share/nginx/html/
    volumeClaimTemplates: #动态创建pvc
    - metadata:
    name: datapool #存储池
    spec:
    accessModes: [ “ReadWriteOnce” ]
    resources:
    requests:
    storage: 1Gi #每个服务申明所需的存储空间