https://github.com/likaiyuan00/k8s-StorageClass.git

前提安装nfs

1.检查并安装软件
rpm -q rpcbind nfs-utils
yum install -y rpcbind nfs-utils
2.创建共享目录
vim /etc/exports  //NFS的配置文件,默认文件内容为空(无任何共享)
/data/testnfs  192.168.48.0/24(rw,sync,no_root_squash)

/opt     *(rw)
//设置/data/testnfs为共享目录,允许192.168.48.0网段的IP地址主机访问
3.启动服务
systemctl start rpcbind  //一定要先开启rpcbind服务
systemctl start nfs      //如服务已启动,更改完配置信息后需要重启服务

exportfs -v  //查看详细的nfs信息
exportfs -r  //重读配置文件
showmount -e //查看本机发布的NFS共享目录
showmount -e +IP //查看IP地址发布的NFS共享目录
mount -t nfs 127.0.0.1:/opt  /mnt //将NFS服务端127.0.0.1下的/opt挂载到/mnt下
rpcinfo -p localhost  //查看rpc注册的端口信息

账户和驱动安装可以理解为干活的

# 表示使用Kubernetes核心API的v1版本
apiVersion: v1
# ServiceAccount表示这是一个服务账户资源,用于定义运行在Pod中的进程可以访问权限
kind: ServiceAccount
metadata:
# 服务账户的名称
  name: nfs-provisioner
---
# 表示使用基于角色的访问控制(RBAC)的v1版本
apiVersion: rbac.authorization.k8s.io/v1
# 表示这是一个集群角色绑定资源,用于将角色(CLusterRole)绑定到一个或多个用户或组
kind: ClusterRoleBinding
# 这是集群角色绑定的名称
metadata:
  name: nfs-provisioner-clusterrolebinding
# 指定了要绑定的角色
roleRef:
# rbac.authorization.k8s.io是角色所在的API组
  apiGroup: rbac.authorization.k8s.io
# 表示这是一个集群级别的角色
  kind: ClusterRole
# cluster-admin是要绑定的角色,这里给予了nfs-provisioner服务账户非常高的权限
  name: cluster-admin
# 指定了绑定到这个角色用户或组
subjects:
# ServiceAccount表示这是一个服务账户
- kind: ServiceAccount
# 服务账号的名称
  name: nfs-provisioner
# 指定了服务账户所在的命名空间,这里是默认的命名空间
  namespace: default
---
# 表示这是一个部署资源,用于管理无状态应用的Pod
kind: Deployment
# apps/v1表示使用应用工作负载API的v1版本
apiVersion: apps/v1
metadata:
# Deployment的名字
  name: nfs-provisioner
# 定义了部署的规格
spec:
# 定义了如何识别由这个部署管理的Pod
  selector:
# 指定了Pod必须具有的标签
    matchLabels:
      app: nfs-provisioner
# 表示Deployment将运行一个Pod副本
  replicas: 1
# 定义了Pod的更新策略
  strategy:
# 表示在更新时先删除除旧的Pod,然后创建新的Pod
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    # 定义Pod的规格
    spec:
    # nfs-provisioner指定了Pod将使用的账户
      serviceAccount: nfs-provisioner
      containers:
      - name: nfs-provisioner
    # 指定了容器的镜像,这里是一个NFS外部卷预配器的镜像
        image: registry.cn-hangzhou.aliyuncs.com/lky-deploy/nfs-provisioner:v4.0.0
        # 定义了容器内部的挂载点
        volumeMounts: 
        # nfs-client-root挂载卷的名字
        - name: nfs-client-root
        # 将卷挂载到容器内部的目录/persistentvolumes
          mountPath: /persistentvolumes
        # 定义了容器的环境变量
        env:
        # 定义了预配器的名称,这是动态卷预配的关键
          - name: PROVISIONER_NAME
            value: nfs-name 
          # NFS_SERVER和NFS_PATH定义了NFS服务器的地址和路径,预配器将从中创建新的NFS持久化
          - name: NFS_SERVER
            value: 127.0.0.1
          - name: NFS_PATH
            value: /data/testnfs
      # 定义Pod中的挂载卷
      volumes:
      # 卷的名字,与容器挂载点中的名字相匹配
        - name: nfs-client-root
        # 定义了NFS卷的类型和配置
          nfs:
          # server和path分别是NFS服务器的地址和路径,与环境变量中的值相同
            server: 127.0.0.1
            path: /data/testnfs

 StorageClass安装,创建pvc测试是否会自动生成pv

# nfs-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-data
 
# 存储分配器的名称
# 对应“nfs-client-provisioner.yaml”文件中env.PROVISIONER_NAME.value
provisioner: nfs-name
 
# 允许pvc创建后扩容
allowVolumeExpansion: True
 
parameters:
  # 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV
  archiveOnDelete: "true"
---
# nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # 注意,后面Deployment申请资源需要用到此处的名称
  name: nfs-pvc
spec:
  # 设置资源的访问策略,ReadWriteMany表示该卷可以被多个节点以读写模式挂载;
  accessModes:
    - ReadWriteMany
 
  # 设置资源的class名称
  # 注意,此处的名称必须与“nfs-storage-class.yaml”中的storageClassName相同
  storageClassName: nfs-data
 
  # 设置申请的资源大小
  resources:
    requests:
      storage: 100Mi

volumeClaimTemplates pod关联pvc模版有了他甚至pvc都不用手动创建了

# 使用volumeClaimTemplates直接指定pvc,申请pv
apiVersion: v1
kind: Service # 无头Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/lky-deploy/nginx:1.27.5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # 这里不再是volumes,变成了volumeClaimTemplates
  - metadata:
      name: www # 这个是pvc的名字
    spec: # 下面是pvc请求的方式
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: nfs-data #注意需要和StorageClass名字一样不然pvc一直pengding
#  volumes:
 # - name: test-nfs-pvc
 #   persistentVolumeClaim:
  #    claimName: my-test-pvc   #使用刚才创建的PVC 

创建完StatefulSet自动创建pv和pvc很方便的,而且数据都是独立的

注意点

过程中可能会遇到的问题 ,祝大家都能一次跑通

1 sc的 provisioner: nfs-name  一定要和 provisioner中env.PROVISIONER_NAME.value一样

2 nfs的共享目录要给777权限不然报错 /persistentvolumes 是容器里面的挂载路径

3 waiting for a volume to be created, either by external provisioner “gxf-nfs-storage” or manually created by system administrator

修改/etc/kubernetes/manifests/kube-apiserver.yaml

在 - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key下面添加如下:

- --feature-gates=RemoveSelfLink=false

然后kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

4 The StorageClass "nfs-data" is invalid: provisioner: Forbidden: updates to provisioner are forbidden

sc一旦创建成功,不可以修改文件,然后apply,需要删除后重新apply

5 no persistent volumes available for this claim and no storage class is set

通过volumeClaimTemplates创建pod必须指定sc 需要添加storageClassName: nfs-data,不然pod不知道去那里找pvc

更多推荐