相关文章推荐
不拘小节的太阳  ·  div ...·  2 月前    · 
严肃的青蛙  ·  Java维护由Collectors.grou ...·  6 月前    · 
重情义的小熊猫  ·  在 Python ...·  7 月前    · 

在 k8s 中当我们需要持久化存储一些数据的使用,会使用到的就是 PV 和 PVC,但 PV 和 PVC 都是需要手动创建的话会很麻烦,特别是当有 StatefulSet 应用存在的时候,如果你需要手动对每个 pod 都创建一个 PVC 和 PV 就非常麻烦,于是 StorageClass 就是来解决这个问题的。

pv、pvc、StorageClass请参考此链接
https://blog.csdn.net/weixin_46902396/article/details/124780531

首先你需要一个 nfs 或其他存储,这里我以 nfs 为例进行部署

我们先来梳理一下思路和几个需要的东西:

  • nfs 是我们最终的存储
  • nfs-client 是用来动态创建 pv 和 pvc 的,我们称为 provisioner
  • StorageClass 关联到对应的 provisioner 就可以使用
  • statefulset(或别的资源)需要配置 storageClassName 进行使用
  • 一、安装NFS并挂载共享目录
    1、服务端安装NFS

    [root@localhost ~]#yum-y install nfs-utils rpcbind
    

    2、创建共享目录并设置权限

    [root@localhost ~]#mkdir-p /data/{kafka,zookeeper}
    [root@localhost ~]#chmod 755 -R /data/*
    

    3、修改配置文件

    [root@localhost ~]# cat >> /etc/exports<<EOF
    /data/kafka  *(rw,sync,no_root_squash,insecure)
    /data/zookeeper  *(rw,sync,no_root_squash,insecure)
    

    4、服务端启动

    [root@localhost ~]# systemctl start rpcbind.service
    [root@localhost ~]# systemctl enable rpcbind
    [root@localhost ~]# systemctl status rpcbind
    [root@localhost ~]# systemctl start nfs.service
    [root@localhost ~]# systemctl enable nfs
    [root@localhost ~]# systemctl status nfs
    

    5、客户端安装NFS

    [root@localhost ~]#yum -y install nfs-utils rpcbind

    6、客户端启动

    [root@localhost ~]# systemctl start rpcbind.service
    [root@localhost ~]# systemctl enable rpcbind
    [root@localhost ~]# systemctl status rpcbind
    [root@localhost ~]# systemctl start nfs.service
    [root@localhost ~]# systemctl enable nfs
    [root@localhost ~]# systemctl status nfs
    

    7、查看共享目录

    [root@localhost ~]# showmount -e 172.171.2.148

    8、客户端挂载共享目录

    [root@localhost ~]#mkdir -p /data/{kafka,zookeeper}
    [root@localhost ~]#mount 172.171.2.148:/data/kafka /data/kafka
    [root@localhost ~]#mount 172.171.2.148:/data/zookeeper /data/zookeeper
    

    二、设置ServiceAcount,为操作pv和pvc设置操作权限
    1、配置.yaml文件

    点击查看代码
    [root@k8s-master conf]# vim serviceAccount/conf.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-provisioner
      namespace: middleware
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-provisioner-runner
      namespace: middleware
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["list", "watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-provisioner
        namespace: middleware
    roleRef:
      kind: ClusterRole
      name: nfs-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    

    2、应用.yaml文件

    kubectl apply -f conf.yaml

    三、部署nfs-client

    创建一个 deployment 用于部署 nfs-client 来分配想对应所需资源,注意其中 NFS_SERVERNFS_PATH 需要修改为你自己的地址

    1、配置.yaml文件

    点击查看代码 kind: Deployment apiVersion: apps/v1 metadata: name: zs-nfs-client-provisioner namespace: middleware spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: zs-nfs-client-provisioner template: metadata: labels: app: zs-nfs-client-provisioner spec: serviceAccountName: nfs-provisioner containers: - name: zs-nfs-client-provisioner #image: quay.io/external_storage/nfs-client-provisioner:latest,使用这个会报错 unexpected error getting claim reference: selfLink was empty, can't make reference,故使用下面的镜像 image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes - name: PROVISIONER_NAME # 这个名称你可以自定义,需要记住,下面还要用 value: zk/nfs - name: NFS_SERVER value: 172.171.2.148 - name: NFS_PATH value: /data/zookeeper resources: requests: cpu: 100m memory: 256Mi limits: cpu: 200m memory: 512Mi volumes: - name: nfs-client-root server: 172.171.2.148 path: /data/zookeeper

    这里以配置zookeeper为样例,配置Kafka请修改红色部分

    2、应用yaml文件

    kubectl apply -f zk-nfs.yaml
    四、创建StorageClass

    1、配置.yaml文件
    [root@k8s-master nfs-client]# vim ../storageClass/zk.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: zk-nfs-storage
      namespace: middleware
    mountOptions:
    - vers=4.0
    - nolock,tcp,noresvport
    provisioner: zk/nfs
    reclaimPolicy: Retain
    

    Reclaim Policy 回收策略:

  • Delete(删除):当 PVC 被删除时,PV 同样会被删除。
  • Retain(保留):当 PVC 被删除时,PV 并不会被删除,需要手动进行删除。
  • Recycle(回收):当 PVC 被删除时,PV 上的数据也会随之删除,以便和新的 PVC 进行绑定(已被遗弃)
  • 2、应用yaml

    kubectl apply -f zk.yaml

    五、可能遇到的问题

    问题: 创建完 PVC 后,一直处于 Pending 状态,通过查看 PVC 信息发现,输出:waiting for a volume to be created, either by external provisioner "zk/nfs" or manually created by system administrator 报错。

    原因是因为: 在 Kubernetes 的 1.20 以上版本,默认禁用了 SelfLink 功能。但是由于 nfs-client-privisioner 服务需要依赖此功能。所以,需要在 apiserver 的配置文件中开启此功能。

    [root@k8s-master ~]# vim /etc/systemd/system/kube-apiserver.service

  • 增加:--feature-gates=RemoveSelfLink=false 配置。
  •