k8s通过nfs-provisioner配置持久化存储

这篇具有很好参考价值的文章主要介绍了k8s通过nfs-provisioner配置持久化存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、nfs-client-provisioner简介

Kubernetes集群中NFS类型的存储没有内置 Provisioner。但是你可以在集群中为NFS配置外部Provisioner。

Nfs-client-provisioner是一个开源的NFS 外部Provisioner,利用NFS Server为Kubernetes集群提供持久化存储,并且支持动态购买PV。但是nfs-client-provisioner本身不提供NFS,需要现有的NFS服务器提供存储。持久卷目录的命名规则为: n a m e s p a c e − {namespace}- namespace{pvcName}-${pvName}。

K8S的外部NFS驱动可以按照其工作方式(是作为NFS server还是NFS client)分为两类:

nfs-client:

它通过K8S内置的NFS驱动挂载远端的NFS服务器到本地目录;然后将自身作为storage provider关联storage class。当用户创建对应的PVC来申请PV时,该provider就将PVC的要求与自身的属性比较,一旦满足就在本地挂载好的NFS目录中创建PV所属的子目录,为Pod提供动态的存储服务。

nfs-server:

与nfs-client不同,该驱动并不使用k8s的NFS驱动来挂载远端的NFS到本地再分配,而是直接将本地文件映射到容器内部,然后在容器内使用ganesha.nfsd来对外提供NFS服务;在每次创建PV的时候,直接在本地的NFS根目录中创建对应文件夹,并export出该子目录。

本文将介绍使用nfs-client-provisioner这个应用,利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。前提条件是有已经安装好的NFS服务器,并且NFS服务器与Kubernetes的Slave节点网络能够连通。将nfs-client驱动做为一个deployment部署到K8S集群中,然后对外提供存储服务文章来源地址https://www.toymoban.com/news/detail-664860.html

二、准备NFS服务端

2.0 当前环境信息
[root@master1 ~]# kubectl get nodes -owide
NAME               STATUS   ROLES    AGE     VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME
master1.k8s.test   Ready    <none>   5d21h   v1.22.17   10.140.20.141   <none>        CentOS Linux 7 (Core)   6.3.2-1.el7.elrepo.x86_64   docker://19.3.15
master2.k8s.test   Ready    <none>   5d21h   v1.22.17   10.140.20.142   <none>        CentOS Linux 7 (Core)   6.3.2-1.el7.elrepo.x86_64   docker://19.3.15
master3.k8s.test   Ready    <none>   5d21h   v1.22.17   10.140.20.143   <none>        CentOS Linux 7 (Core)   6.3.2-1.el7.elrepo.x86_64   docker://19.3.15
node1.k8s.test     Ready    <none>   5d21h   v1.22.17   10.140.20.156   <none>        CentOS Linux 7 (Core)   6.3.2-1.el7.elrepo.x86_64   docker://19.3.15
2.1 通过yum安装nfs server端
[root@master1 ~]# rpm -qa|egrep "nfs|rpc"
[root@master1 ~]# yum -y install nfs-utils rpcbind
2.2 启动服务和设置开机启动
#启动nfs-server,并加入开机启动
[root@master1 ~]# systemctl start rpcbind.service
[root@master1 ~]# systemctl enable rpcbind.service
[root@master1 ~]# systemctl start nfs
[root@master1 ~]# systemctl enable nfs-server --now
#查看nfs server是否已经正常启动
[root@master1 ~]# systemctl status nfs-server
2.3 编辑配置文件,设置共享目录
[root@master1 ~]# mkdir /data/nfs-provisioner -p
[root@master1 ~]# cat > /etc/exports <<EOF
/data/nfs_provisioner   10.140.20.0/24(rw,no_root_squash)
EOF
#不用重启nfs服务,配置文件就会生效
[root@master1 ~]# exportfs -arv 
exporting 10.140.20.0/24:/data/nfs_provisioner
用于配置NFS服务程序配置文件的参数:
参数 含义
ro 只读
rw 读写
root_squash 当NFS客户端以root管理员访问时,映射未NFS服务器的匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射未NFS服务器的root管理员
all_suash 无论NFS客户端使用什么账户访问,均映射未NFS服务器的匿名用户
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘。效率高但易丢失数据
2.4 客户端测试
客户端需要安装nfs-utils
[root@master1 ~]# yum -y install nfs-utils
[root@master1 ~]# systemctl enable nfs --now
[root@master1 ~]# systemctl status nfs
客户端验证
[root@master2 ~]# showmount -e 10.140.20.141
Export list for 10.140.20.141:
/data/nfs_provisioner 10.140.20.0/24

三、部署nfs-provisioner

3.1.0 创建namespace、工作目录
[root@master1 ~]# kubectl create namespace test
[root@master1 ~]# mkdir  nfs-provisioner
[root@master1 ~]# cd  nfs-provisioner
3.1 创建ServiceAccount
[root@master1 ~]# cat > nfs-sa.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: test
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  - 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: test
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: test
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: test
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: test
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
EOF
应用生效
[root@master1 nfs-provisioner]# kubectl apply -f nfs-sa.yaml
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
3.2 创建Deployment
[root@master1 ~]# cat > nfs-deployment.yaml << EOF
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  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: nfs-provisioner # 和3.Storage中provisioner保持一致便可
            - name: NFS_SERVER
              value: 10.140.20.141
            - name: NFS_PATH
              value: /data/nfs_provisioner
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.140.20.141
            path: /data/nfs_provisioner
EOF
应用生效
[root@master1 nfs-provisioner]# kubectl apply -f nfs-deployment.yaml
deployment.apps/nfs-client-provisioner created
3.3 创建storageclass
[root@master1 ~]# cat > nfs-sc.yaml << EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  annotations:
    storageclass.kubernetes.io/is-test-class: "true"
  name: nfs-storage
  namespace: test
provisioner: nfs-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Delete
EOF
应用生效
[root@master1 nfs-provisioner]# kubectl apply -f nfs-sc.yaml
storageclass.storage.k8s.io/nfs-storage created
3.4 创建pvc
[root@master yaml]# cat > nfs-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: test
  labels:
    app: nfs-pvc
spec:
  accessModes: #指定访问类型
  - ReadWriteOnce
  volumeMode: Filesystem #指定卷类型
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-storage #指定创建的存储类的名字
EOF

#创建pvc
[root@master1 nfs-provisioner]# kubectl apply -n test -f nfs-pvc.yaml 
persistentvolumeclaim/nfs-pvc created
#查看pvc
[root@master1 nfs-provisioner]# kubectl get pvc -n test
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc     Bound    pvc-791dc175-c068-4977-a14b-02f8cb153bc3   2Gi        RWO            nfs-storage    8s
www-web-0   Bound    pvc-b666f81e-9723-4e88-8e81-157b9e081577   10Mi       RWO            nfs-storage    17m
www-web-1   Bound    pvc-a900806b-47e0-432e-81fd-865c5ff6e3ba   10Mi       RWO            nfs-storage    16m
#查看nfs共享目录
[root@master1 nfs-provisioner]# ls /data/nfs_provisioner/
test-nfs-pvc-pvc-791dc175-c068-4977-a14b-02f8cb153bc3
test-www-web-0-pvc-b666f81e-9723-4e88-8e81-157b9e081577
test-www-web-1-pvc-a900806b-47e0-432e-81fd-865c5ff6e3ba


#总结:创建pvc使使用storageclass,那么将会自动创建pv并进行绑定

四、创建应用测试动态添加PV

4.1 创建一个nginx应用
cat > nginx_sts_pvc.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: test
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: test
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-storage"  #使用新建的sc
      resources:
        requests:
          storage: 10Mi
EOF
应用生效
[root@master1 nfs-provisioner]# kubectl apply -f nginx_sts_pvc.yaml
service/nginx created
statefulset.apps/web created

4.2 检查结果
检查deployment、statefulset状态
[root@master1 nfs-provisioner]# kubectl get sts,deploy -n test
NAME                   READY   AGE
statefulset.apps/web   2/2     4m49s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-client-provisioner   1/1     1            1           15m

检查pod状态
[root@master1 nfs-provisioner]# kubectl get pods -n test
NAME                                     READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-fb55999fb-pcrqt   1/1     Running   0          9m30s
web-0                                    1/1     Running   0          3m40s
web-1                                    1/1     Running   0          3m15s

检查nfs-server服务器是否创建pv持久卷:
[root@master1 nfs-provisioner]# kubectl get pvc,pv -n test
NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nfs-pvc     Bound    pvc-791dc175-c068-4977-a14b-02f8cb153bc3   2Gi        RWO            nfs-storage    2m45s
persistentvolumeclaim/www-web-0   Bound    pvc-b666f81e-9723-4e88-8e81-157b9e081577   10Mi       RWO            nfs-storage    19m
persistentvolumeclaim/www-web-1   Bound    pvc-a900806b-47e0-432e-81fd-865c5ff6e3ba   10Mi       RWO            nfs-storage    19m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
persistentvolume/pvc-791dc175-c068-4977-a14b-02f8cb153bc3   2Gi        RWO            Delete           Bound    test/nfs-pvc     nfs-storage             2m45s
persistentvolume/pvc-a900806b-47e0-432e-81fd-865c5ff6e3ba   10Mi       RWO            Delete           Bound    test/www-web-1   nfs-storage             19m
persistentvolume/pvc-b666f81e-9723-4e88-8e81-157b9e081577   10Mi       RWO            Delete           Bound    test/www-web-0   nfs-storage             19m


[root@master1 nfs-provisioner]# kubectl exec -it -n test web-0 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@web-0:/# echo 1 >  /usr/share/nginx/html/1.txt
root@web-0:/# exit
[root@master1 nfs-provisioner]# ls /data/nfs_provisioner/
test-nfs-pvc-pvc-791dc175-c068-4977-a14b-02f8cb153bc3
test-www-web-0-pvc-b666f81e-9723-4e88-8e81-157b9e081577
test-www-web-1-pvc-a900806b-47e0-432e-81fd-865c5ff6e3ba
[root@master1 nfs-provisioner]# cat  /data/nfs_provisioner/test-www-web-0-pvc-b666f81e-9723-4e88-8e81-157b9e081577/1.txt 
1

到了这里,关于k8s通过nfs-provisioner配置持久化存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S使用持久化卷存储到NFS(NAS盘)

    参考文章:K8S-v1.20中使用PVC持久卷 - 知乎 目录 1、概念: 1.1 基础概念 1.2 PV的配置 1.2.1 静态PV配置 1.2.2 动态PV配置 1.2.3 PVC与PV的绑定 1.2.4 PVC及PV的使用 2 部署PV及PVC 2.1 所有K8S机器都需要安装NFS程序 2.2 仅针对需要暴露文件服务的机器开启NFS服务         2.2.1 Linux为例开启NFS服

    2023年04月26日
    浏览(55)
  • 持续集成部署-k8s-数据持久化-NFS安装与使用

    网络文件系统(Network File System, NFS),是基于内核的文件系统,nfs主要是通过网络实现服务器和客户端之间的数据传输,采用远程过程调用RPC(Romete Procedure Call)机制,让不同的机器节点共享文件目录。只需将nfs服务器共享的文件目录挂载到nfs客户端,这样客户端就可以对远程

    2024年02月07日
    浏览(38)
  • 使用k8s部署Mysql实例~hostpath,nfs服务器,PV和PVC持久化

    1.基础存储的分类: 分类 说明 EmptyDir EmptyDir是在Pod 被分配到Node时 创建的, 无须手动指定 ,当 Pod销毁时 , EmptyDir中的数据也会被 永久删除 HostPath HostPath就是将Node主机中一个实际目录挂载到Pod中,保证 Pod销毁 了,但是 数据依旧可以存在 于Node主机上 NFS NFS是一个网络文件

    2024年02月20日
    浏览(47)
  • K8S NFS持久存储配置

    K8S NFS 持久存储配置 在 Kubernetes ( K8S )中配置 NFS ( Network File System )作为持久存储通常涉及以下步骤: 1. 准备 NFS 服务器 首先,你需要一个运行 NFS 服务的服务器。这可以是 Kubernetes 集群中的一个节点,也可以是集群外部的服务器。 1.1 安装 NFS 服务 在 NFS 服务器上,安装

    2024年03月20日
    浏览(46)
  • k8s 配置hadoop集群,nfs作为存储

    目录 一、简介 二、nfs服务nfs-provisioner配置 1、k8S服务器需安装nfs客户端 2、nfs服务端安装配置 3、使用nfs-provisioner动态创建PV  (文件已修改) 三、hadoop配置文件 1、# cat hadoop.yaml 2、# cat hadoop-datanode.yaml 3、# cat yarn-node.yaml  4、执行文件并查看 5、联通性验证  四、报错解决

    2024年02月10日
    浏览(40)
  • k8s 持久化存储

    我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问节点的设备 这个时候,我们就可以让 hostP

    2024年02月16日
    浏览(42)
  • 【K8s】3# 使用kuboard管理K8s集群(NFS存储安装)

    最完整的学习文档莫过于官网:直达地址:Kuboard for K8S Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预

    2024年01月20日
    浏览(46)
  • K8S之持久化存储

    在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,想要长久的保留这些数据就要用到pod数据持久化存储。 查看K8S支持哪些存储 常用的如下:

    2024年04月09日
    浏览(43)
  • k8s 通过配置 hostAliases 来进行域名解析

    在 Kubernetes (K8s) 中,hostAliases 是一种用于在 Pod 中配置主机名与 IP 地址映射的机制。通过使用 hostAliases,你可以将指定的主机名映射到 Pod 所在节点的 IP 地址,从而实现对主机名的自定义解析。这对于一些特定的用例,比如与主机上的外部资源进行交互,非常有用。 以下是一

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包