7

k8s 网络持久化存储之StorageClass(如何一步步实现动态持久化存储) - 渡边彻

 2 years ago
source link: https://www.cnblogs.com/zhangpeiyao/p/16648250.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

k8s 网络持久化存储之StorageClass(如何一步步实现动态持久化存储)

StorageClass的作用:

创建pv时,先要创建各种固定大小的PV,而这些PV都是手动创建的,当业务量上来时,需要创建很多的PV,过程非常麻烦。
而且开发人员在申请PVC资源时,还不一定有匹配条件的PV可用,这又带来了新的问题。
于是Kubernetes提供了StorageClass来动态创建PV,StorageClass大大简化了PV的创建过程。
当申请PVC资源时, 如果匹配到满足条件的StorageClass,还会自动为PVC创建对应大小的 PV并进行绑定。

下面就来仔细讲讲现在如何一步步的通过创建StorageClass动态创建PV从而实现持久化存储的。

网络存储卷

Kubernetes是分布式容器集群,如何在多个Pod之间或多 个Node之间进行数据存储和共享是非常重要的问题。

Kubernetes引入了网络存储卷,它支持为数众多的云提供商的产品和网络存储方案,如 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker等

网络存储卷还能够 满足持久化数据的要求,这些数据将永久保存。

网络存储卷是集成各种第三方的存储系统,不同的服务商提供的配置有一些不同,NFS只是其中一种。

一. 安装NFS

安装NFS服务器

资源有限,此处我选择了master作为NFS服务器

安装NFS服务器应用:yum install -y nfs-utils rpcbind

image

创建NFS共享目录:mkdir -p /data/k8snfs

编辑NFS配置文件:vim /etc/exports

image
image

重启服务:

image

检查服务器端是否正常加载 了/etc/exports的配置:

image

注意:如果使用云服务器,需要开放一下端口,否则客户端连接不上。使用:rpcinfo -p 查看需要开放的端口。注意有tcp和udp:

image

安装NFS客户端

注意:每台需要使用NFS的Node都需要安装NFS

安装客户端:yum install -y nfs-utils

检查是否能访问远端的NFS服务器:sudo showmount -e {NFS服务器IP地址}

image
如果出现clnt_create: RPC: Port mapper failure - Timed out,使用云服务的话大概率是接口没开放。

持久存储卷

Kubernetes支持为数众多的 云提供商和网络存储方案,如 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker等。但因为网络存储卷 通常是集成各种第三方的存储系统,所以在配置上各有差别。

不同的存储的配置参数不太一样,这些参数应该是存储管理员关注的,而非开发人员,Kubernetes提供了3种基于存储的抽象对象—— PersistentVolume(PV)、StorageClass和 PersistentVolumeClaim(PVC),以支持基础设施和应用之间的分离。

存储管理人员设置 PV或StorageClass,并在里面配置存储系统和参数

开发人员只 需要创建PVC来申请指定空间的资源以存储与共享数据即可,无须再关 注存储的具体实现和操作。

当删除PVC时,它写入具体存储资源中的数据可以根据回收策略自动清理。

image

PV和PVC

PV表示持久存储卷,定义了Kubernetes集群中可用的存储资源, 其中包含存储资源实现的细节,如包含如何使用 NFS/iSCSI/GlusterFS/RDB/azureDisk/flocker 等资源的具体设置。

PVC表示持久存储卷的申请,是由用户发起的对存储资源的请求。 申请中只包含请求资源的大小和读写访问模式,无须关注具体的资源 实现细节,Kubernetes会自动为其绑定符合条件的PV

二.部署StorageClass

StorageClass是通过存储分配器(provisioner)来动态分配PV 的,但是Kubernetes官方内置的存储分配器并不支持NFS,所以需要额外安装NFS存储分配器。

1. 安装NFS存储分配器

第一步:设置存储分配器的权限

因为storage自动创建pv需要经过kube-apiserver,所以要进行授权

在node节点创建nfs-client-provisioner-authority.yaml文件

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
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: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
image

第二步:安装NFS存储分配器

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME  # 存储分配器的默认名称
              value: fuseim.pri/ifs  
            - name: NFS_SERVER    # NFS服务器地址
              value: xx.xx.236.113
            - name: NFS_PATH       # NFS共享目录地址
              value: /data/k8snfs
      volumes:
        - name: nfs-client-root
          nfs:
            server: xx.xx.236.113  # NFS服务器地址
            path: /data/k8snfs     # NFS共享目录

image

image

第三步: 创建StorageClass

创建nfs-storage-class.yml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage   # StorageClass名称

  # 存储分配器名称
provisioner: fuseim.pri/ifs  # 对应“nfs-client-provisioner.yaml”文件中env.PROVISIONER_NAME.value

  # 允许pvc创建后扩容
allowVolumeExpansion: True

parameters:
  archiveOnDelete: "false"  # 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV,false删除PVC时,对应的PV不会删除

image

创建PVC

StorageClass 创建完成后就可以创建 PVC 了。
创建:testpvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testpvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"
  resources:
    requests:
      storage: 500Mi

image
此时发现,pvc一直是pending状态,并没有默认分配PV。 分析,可能是存储分配器除了问题

image

selfLink was empty 在k8s集群 v1.20之前都存在,在v1.20之后被删除,需要在/etc/kubernetes/manifests/kube-apiserver.yaml 添加参数 - --feature-gates=RemoveSelfLink=false
如下所示:
image

image

稍等一会,再进行查看PV和PVC
image
可以看到PV已经被自动创建,且PV,PVC的状态已经均为绑定状态。

NFS和PV,PVC关系图:

image

本文参考博客:https://blog.csdn.net/zhang19903848257/article/details/125887017


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK