首页 > 其他分享 >使用nfs作为kubernetes动态storageClass存储

使用nfs作为kubernetes动态storageClass存储

时间:2023-05-16 15:01:26浏览次数:56  
标签:kind name kubernetes storage client nfs storageClass provisioner

使用 nfs 作为kubernetes动态 storageClass 存储

1、StorageClass介绍

参考网址:https://github.com/kubernetes-retired/external-storage

https://blog.51cto.com/xuexinhuan/5394844

StorageClass对象会定义下面两部分内容:

1: PV的属性.比如,存储类型,Volume的大小等
2: 创建这种PV需要用到的存储插件
有了这两个信息之后,Kubernetes 就能够根据用户提交的 PVC,找到一个对应的 StorageClass,之后Kubernetes 就会调用该 StorageClass 声明的存储插件,进而创建出需要的 PV。

但是其实使用起来是一件很简单的事情,你只需要根据自己的需求,编写YAML文件即可,然后使用kubectl create命令执行即可。

image-20230516113550946

创建StorageClass流程

  • 创建一个可用的 NFS Serve
  • 创建 Service Account. 这是用来管控 NFS provisioner 在k8s集群中运行的权限
  • 创建 StorageClass. 负责建立PVC并调用 NFS provisioner 进行预定的工作, 并让 PV 与 PVC 建立管理
  • 创建 NFS provisioner. 有两个功能,一个是在 NFS 共享目录下创建挂载点(volume), 另一个则是建了 PV 并将 PV 与 NFS 的挂载点建立关联

2、安装配置 NFS Serve

安装:

yum install -y nfs-utils
mkdir /data/nfs-volume
chmod 755 /data/nfs-volume
#chown nfsnobody:nfsnobody /data/nfs-volume
echo "/data/nfs-volume    192.168.1.0/24(rw,sync,all_squash)" > /etc/exports
systemctl enable nfs
systemctl start nfs

验证共享存储是否生效:

showmount -e

3、创建account及相关权限

创建external_storage命名空间

kubectl create ns external-storage

创建RBAC权限,nfs-client-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: external-storage
---
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: external-storage
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
  # replace with namespace where provisioner is deployed
  namespace: external-storage
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
  # replace with namespace where provisioner is deployed
  namespace: external-storage
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: external-storage
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

创建基于NFS资源的StorageClass

nfs-client-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"

创建NFS provisioner Deployment

nfs-client-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: external-storage
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: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.1.66
            - name: NFS_PATH
              value: /data/nfs-volume
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.1.66
            path: /data/nfs-volume

依次应用资源配置清单:

kubectl apply -f nfs-client-rbac.yaml
kubectl apply -f nfs-client-class.yaml
kubectl apply -f nfs-client-deployment.yaml

4、创建PVC,POD验证

创建pvc,并验证:

nfs-client-pvc-test.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi

如图所示:

image-20230516133805283

创建测试pod,查看是否可以正常挂载

nfs-client-pod-test.yaml

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox:1.36.0
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim

验证:在nfs服务器验证

image-20230516134548308

标签:kind,name,kubernetes,storage,client,nfs,storageClass,provisioner
From: https://www.cnblogs.com/tigerisnotcat/p/17405667.html

相关文章

  • 关于Kubernetes-v1.23.6-网络组件-calico的安装部署...
    当2个workernodes节点加入到 Kubernetes/k8s集群后,我们去master节点、执行kubectlgetnodes命令就可以看到worker节点了但是我们会看到无论是master节点、还是worker节点,STATUS都会是  NotReady,如下[root@k8s-masterqq-5201351]#kubectlgetnodesNAME......
  • CentOS7搭建keepalived+DRBD+NFS高可用共享存储
    一、服务器信息IP地址 类型 主机名 操作系统 内存 磁盘192.168.11.110 主服务器 node01 CentOS7.9 2G 系统盘20G存储盘20G192.168.11.111 备服务器 node02 CentOS7.9 2G 系统盘20G存储盘20G二、两台主机......
  • k8s 之storageclass存储类
    1.storageclass(存储类)概念storageclass是一个存储类,k8s集群管理员通过创建storageclass可以动态生成一个存储卷供k8s用户使用。2.storageclass资源定义每个StorageClass都包含字段provisioner,parameters和reclaimPolicy,当需要动态配置属于该类的PersistentVolume时使用这些字段......
  • kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具
    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令完成一个kubernetes集群的部署:# 创建一个 Master 节点$kubeadminit​# 将一个 Node 节点加入到当前集群中$kubeadmjoin<Master节点的IP和端口 >1. 安装要求在开始之前,部署Kuber......
  • VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 1.16 - 运营商 Kubernetes
    VMwareTanzuKubernetesGridIntegratedEdition(TKGI)1.16-运营商Kubernetes解决方案请访问原文链接:https://sysin.org/blog/vmware-tkgi/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareTanzuKubernetesGridIntegratedEdition(TKGI)使运营商能......
  • VMware Tanzu Kubernetes Grid (TKG) 2.1 - 企业级 Kubernetes 解决方案
    VMwareTanzuKubernetesGrid(TKG)2.1-企业级Kubernetes解决方案VMware构建、签名和支持的开源Kubernetes容器编排平台的完整分发版请访问原文链接:https://sysin.org/blog/vmware-tkg-2/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgTanzuKubernetes集......
  • Kubernetes故障排除要领
    要在最短的停机时间内运行应用程序,需要完善故障排除技能,将应用程序扩展到运行它们的Kubernetes集群。定期对整个Kubernetes集群进行调试和故障排除,以提供一致的支持和服务,这一点至关重要。故障排除包括识别、诊断和解决Kubernetes集群、节点、pod、容器和其他资源中的问题。由于Kub......
  • 云原生第三周--kubernetes组件详解
    etcd组件etcd简介:etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免......
  • NFS
    一、NFS工作原理1、什么是NFS服务器NFS就是NetworkFileSystem的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就......
  • kubernetes学习笔记27:etcd性能
    理解etcd性能:etcd集群架构图,包含raft层,storage层(storage层包含treeindex层和boltdb底层持久化存储key-value层),它们每一层都可能造成性能损失,raft层需要网络同步数据,网络io节点之间的rtt和带宽都会影响etcd性能,另外wal也会受到磁盘io的写入速度影响。storage层,磁盘iofdatasync延迟......