Kubenetes 部署NFS

1.了解基本概念

StorageClass

Kubernetes提供了StorageClass来动态创建PV,StorageClass大大简化了PV的创建过程。
当申请PVC资源时, 如果匹配到满足条件的StorageClass,还会自动为PVC创建对应大小的 PV并进行绑定。

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

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

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

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

持久存储卷

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

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

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

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

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

PV和PVC

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

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

2.安装NFS

2.1 准备一台虚拟机 

vim /etc/sysconfig/network-scripts/ifcfg-eth0 #192.168.0.255

 

 

 2.2 安装NFS

yum install -y nfs-utils rpcbind  #安装NFS

  mkdir -p /data/k8snfs # 创建NFS存储目录

  vim /etc/exports  #编辑NFS配置文件内容:/data/nfs-share  *(rw,no_root_squash,no_all_squash,sync)

 

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

 

 

 

 

 2.3 启动服务

serice rpcbind restart
servce nfs restart
showmount -e localhost

[root@test01 ~]# showmount -e localhost  #说明服务正常,可以挂载
Export list for localhost:
/data/nfs-share *

2.4检测k8s 节点是否可以连接上

showmount -e 192.168.0.225 #yum install showmount

 

3 K8s开始部署nfs

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

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

部署分为四个步骤

Step1.为 存储分配器nfs-client-provisioner 配置权限 Rbac ,

yaml 见nfs-client-provisioner-authority.yaml,如果没有storageclass,请提前创建

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

Step2.创建存储分配器  nfs-client-provisioner 

注意点:1.如果k8s版本是1.21 以后,请使用最最新的镜像  registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0

    2.PROVISIONER_NAME 要记住

 

     

 

step3.部署storageclass

step4.pvc创建测试

 

 注意点:pvc一直是pending状态,并没有默认分配PV。 分析,可能是存储分配器除了问题

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

如果1.21之后的版本,请使用最新的存储分配器镜像,上文中有提到;

NFS和PV,PVC关系图:

 

 

 附四个yaml 文件

#nfs-client-provisioner-authority.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: storageclass
---
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: storageclass
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: storageclass
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: storageclass
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: storageclass
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
View Code

#nfs-client-provisioner.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: storageclass
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    # NFS服务器地址
              value: 192.168.0.225
            - name: NFS_PATH       # NFS共享目录地址
              value: /data/nfs-share
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.0.225  # NFS服务器地址
            path: /data/nfs-share     # NFS共享目录

#nfs-storage-class.yaml

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
allowVolumeExpansion: True
parameters:
  archiveOnDelete: "false"  # 资源删除策略,“true”表示删除PVC时,同时删除绑定的PV,false删除PVC时,对应的PV不会删除

#testpvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testpvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"
  resources:
    requests:
      storage: 50Mi

执行过程:

 

posted @ 2022-10-12 12:00  王叫兽  阅读(349)  评论(0编辑  收藏  举报