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
#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
执行过程: