Kubernetes Volume 官方文档
Kubernetes Volume

nfs-subdir-external-provisioner 官方仓库和文档
nfs-subdir-external-provisioner

旧版的在这里
external-storage
Public archive

之前学习了 NFS 创建、删除和使用,那个应该算是静态方式的 NFS
感觉还是比较简单,这个说是动态方式,暂时也没有搞明白动态体现在哪里
总之,先照着完成,用着用着就应该回明白差别在哪里

按照官方仓库和文档的步骤操作

  1. clone 代码

    git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/

  2. 简单认识一下

    cd /root/working/nfs-subdir-external-provisioner/deploy

    ls

     class.yaml  clusterrolebinding.yaml  clusterrole.yaml  deployment.yaml  README.md  rolebinding.yaml  role.yaml  serviceaccount.yaml
    

    deployment.yaml 部署一个服务提供者( provisioner)
    class.yaml 定义存储类 ( storage class)
    clusterrole.yaml 定义集群角色和规则 ( RBAC )
    test-claim.yaml test-pod.yaml 测试用例

    object 目录: 里面的文件实际内容和父目录一样,只是拆分的细致一些

     README 原文:The objects in this directory are the same as in the parent except split up into one file per object for certain users' convenience.
    
  3. 配置 provisioner ( Configure the NFS subdir external provisioner )

    简单起见,在 default namespace 来完成

    使用预先配置好的阿里云镜像
    使用阿里云容器镜像的 github关联仓库,海外机器构建 Docker 镜像

    registry.cn-beijing.aliyuncs.com/docker-dhbm/nfs-subdir-external-provisioner

    修改 IP (192.168.1.188)和 NFS 目录 (/nfs/data)

    vim deployment.yaml

     apiVersion: apps/v1kind: Deploymentmetadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: defaultspec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/docker-dhbm/nfs-subdir-external-provisioner #registry.cn-hangzhou.aliyuncs.com/xzjs/nfs-subdir-external-provisioner:v4.0.0 # k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.1.188 # 10.3.243.101 - name: NFS_PATHvalue: /nfs/data # /ifs/kubernetesvolumes:- name: nfs-client-rootnfs:server: 192.168.1.188 # 10.3.243.101path: /nfs/data # /ifs/kubernetes
    
  4. 依次启动

    kubectl create -f rbac.yaml
    kubectl create -f class.yaml
    kubectl create -f deployment.yaml

    这个测试用例也一并启动
    kubectl create -f test-claim.yaml -f test-pod.yaml

  5. 依次确认资源
    kubectl get pods

    其中已经包含了测试用例 test-pod ,还有之前静态 NFS 学习时的 demo1

     NAME                                      READY   STATUS      RESTARTS       AGEdemo-654c477f6d-l6lbh                     1/1     Running     5 (145m ago)   12ddemo1-deployment-67fc75ff95-2k259         1/1     Running     1 (145m ago)   6h19mdemo1-deployment-67fc75ff95-nc5rx         1/1     Running     1 (145m ago)   6h19mnfs-client-provisioner-554dbf7dd5-qd7hc   1/1     Running     9 (132m ago)   25htest-pod                                  0/1     Completed   0              106m
    

    kubectl get pv
    其中已经包含了之前静态 NFS 学习时的 nfs-pv

     NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGEnfs-pv                                     100Mi      RWX            Retain           Bound    default/nfs-pvc      nfs-pv                         7h3mpvc-cc92f9b2-327c-4afb-96b6-7e9a90bcb9d3   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            107m
    

    kubectl get pvc
    其中已经包含了之前静态 NFS 学习时的 nfs-pvc
    test-claim 时测试用例创建的 pvc

     NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGEnfs-pvc      Bound    nfs-pv                                     100Mi      RWX            nfs-pv                7h3mtest-claim   Bound    pvc-cc92f9b2-327c-4afb-96b6-7e9a90bcb9d3   1Mi        RWX            managed-nfs-storage   107m
    

确认 pvc 是否已经挂载并起作用

  1. 查看 test-pod 挂载情况
    cat test-pod.yaml

        kind: PodapiVersion: v1metadata:name: test-podspec:containers:- name: test-podimage: busybox:stablecommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS20211221 && exit 0 || exit 1"volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim
    

    可以看到, test-pod 启动后,会在容器中执行 shell 命令 touch /mnt/SUCCESS20211221 ,然后就直接 exit 了,所以, test-pod 的状态时 Completed

  2. 查看test-pod 状况
    kubectl describe pod test-pod

    Name:         test-pod
    Namespace:    default
    Priority:     0
    Node:         centos7-185/192.168.1.185
    Start Time:   Tue, 21 Dec 2021 01:38:59 -0500
    ...
    Containers:test-pod:Container ID:  docker://e2bf4fdae908deaf0130b53e29ea6b4ce8b64ff16b6edb8775e65648ff0ba296Image:         busybox:stable...Command:/bin/shArgs:-ctouch /mnt/SUCCESS20211221 && exit 0 || exit 1State:          Terminated...Environment:    <none>Mounts:/mnt from nfs-pvc (rw)/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-4c5nw (ro)
    ...
    Volumes:nfs-pvc:Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)ClaimName:  test-claimReadOnly:   false
    ...
    
  3. 确认数据

    既然容器中创建了一个文件,那么,对应到挂载的 pvc 的本地目录中就应该可以看到实际内容 (尽管 pod 已经 exit)

    cd /nfs/data

    ls

          default-test-claim-pvc-cc92f9b2-327c-4afb-96b6-7e9a90bcb9d3  nginx
    

    cd default-test-claim-pvc-cc92f9b2-327c-4afb-96b6-7e9a90bcb9d3/

    ls

      SUCCESS20211221
    

    可以看到,在这个目录下确实创建了一个文件: SUCCESS20211221

测试数据是否会丢失

  1. 删除 pod
    kubectl delete -f test-pod.yaml -f test-claim.yaml

    查看

     [root@centos7-188 data]# ll总用量 0drwxrwxrwx 2 root root 29 12月 21 01:39 default-test-claim-pvc-cc92f9b2-327c-4afb-96b6-7e9a90bcb9d3drwxr-xr-x 2 root root 24 12月 20 21:10 nginx
    

    数据依然存在

  2. 删除 pvc

    kubectl delete -f test-claim.yaml

    现在数据消失了!

  3. storage class 的使用规则是: 不会随着 pod 删除而删除数据

    查看 test-claim.yaml ,可以看到 archiveOnDelete: “false”

    具体 pvc 删除规则,现在不去纠结!

关于动态 pvc 的理解

这篇文章写的比较详细
【kubernetes】持久化存储之静态PV/PVC

  1. 对比动态和静态 pvc 创建方式,可以说完全没有差别

    动态 pvc

     spec:storageClassName: managed-nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 1Mi
    

    静态 pvc

     spec:storageClassName: nfs-pvaccessModes:- ReadWriteManyresources:requests:storage: 50Mi  #容量
    
  2. 对比静态 pv 和动态 pv创建
    动态 pv

         # cat class.yaml apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: managed-nfs-storageprovisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'parameters:archiveOnDelete: "false"
    

    1). 没有直接创建 PersistentVolume ,而是指定了 StorageClass 的 provisioner
    2). 这个 provisioner 的创建就比静态 pv 复杂多了!
    3). 这个nfs-subdir-external-provisioner 是通过创建一个 pod ,在 pod 中挂载 nfs 资源

    4). 后续在 pvc 创建的时候,动态创建了一个 pv,为什么要这样子?
    5). 简单理解:pvc 要求的空间还不定多大,没法预先创建 pv
    6). 虽然以上例子pvc 只需要 1M ,但是,这个 pv 后续还可能会被其他 pvc 申请使用!

    静态 pv

     apiVersion: v1kind: PersistentVolumemetadata:name: nfs-pvnamespace: defaultlabels:pv: nfs-pvspec:capacity:storage: 100MiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RetainstorageClassName: nfs-pvnfs:  server: 192.168.0.141path: "/nfs/data/nginx"   #NFS目录,需要该目录在NFS上存在
    

    这里直接指定了空间(100M)和读写方式,pvc 申请不能超出 pv 的规格!

k8s学习: 部署动态 pvc(nfs-subdir-external-provisioner)相关推荐

  1. k8s 动态NFS Subdir External Provisioner

    目录 1.部署NFS 2.部署 NFS Subdir External Provisioner 已适配k8s-1.23.9集群(docker运行时) 1.部署NFS nfs 服务端(k8s-maste ...

  2. K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程

    K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...

  3. 动态创建nfs的pvc失败问题排查

    项目场景: 提示:Hadoop部署到k8s,需要在各个节点之间共享,而且各个节点都需要能编辑文件内容,所以需要支持ReadWriteMany的PersistentVolume,这里我选择使用NFS 使 ...

  4. k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战

    目录 概念 Volumes ConfigMap && Secret hostPath 模版 emptyDir 模版 PV 模版 PVC 模版 实战 volumes - hostPath ...

  5. 使用nfs为k8s提供pv动态供给存储

    环境:k8s一主两从 k8s version: 1.20.2 k8s-master: 192.168.31.200 k8s-node1: 192.168.31.201 k8s-node2: 192.1 ...

  6. k8s学习笔记- 部署prometheus

    1.Prometheus概述 Prometheus是一个开源监控系统,它前身是SoundCloud的警告工具包.从2012年开始,许多公司和组织开始使用Prometheus. 该项目的开发人员和用户社 ...

  7. aws--efs---使用efs创建k8s的动态pvc

    我们之前使用EBS作为k8s的动态pvc的pv,但是EBS不支持ReadWriteMany类型的声明. 所以尝试使用efs作为存储底层来声明pvc. 动态pvc声明方案 创建efs文件存储系统 使用命 ...

  8. k8s mysql pv_k8s+mysql+pv+pvc+NFS实现mysql容器编排

    k8s+mysql+pv+pvc+NFS实现mysql容器编排 首先需要介绍概念:pv和pvc PV 是集群提供的一种存储资源,是实际可用的磁盘.和挂 PV 的 Pod 有着独立的生命周期,Pod 销 ...

  9. k8s学习笔记一集群部署

    k8s安装笔记 基础环境配置 修改主机名: 修改hosts配置文件 安装依赖包 关闭防火墙并未Iptables设置空规则 关闭swap分区和linux虚拟内存 调整内核参数 调整系统时区 关闭系统不需 ...

  10. k8s学习-CKA真题-Pod指定节点部署

    目录 题目 分析 命令 环境搭建 解题 结果 参考 题目 分析 创建一个Pod,名字为nginx-kusc00401,镜像地址是nginx,调度到具有disk=spinning标签的节点上. 命令 环 ...

最新文章

  1. Python编程基础:第四十一节 继承Inheritance
  2. thinkphp开发卡密社区系统
  3. 阵列卡直通模式和raid模式_DNF:希洛克Raid攻坚流程攻略
  4. 软件设计师考试 | 第四章 操作系统知识 | 文件管理
  5. 设计灵感|展览海报如何编排?
  6. Win10系统,开机后提示Desktp不可用的故障解决方法。
  7. 2016 ICPC 大连网络赛 部分题解
  8. Django折腾日记(django2.0)
  9. gpu云服务器运行游戏_99元起!华为云鲲鹏云手机正式发布:流畅运行大型游戏...
  10. Java速成:Boot入门
  11. 编辑器,在线编辑器,微信编辑器,公众号编辑器,UEditor编辑器
  12. 使用机器学习和数据挖掘算法进行数据处理
  13. matlab保存f黑白图片_MATLAB的矩阵运算与重构
  14. break 通过自定义标签跳到指定位置
  15. 无线web认证计费服务器,WEB认证原理
  16. 动态代理是什么?应用场景?
  17. 我的世界服务器淬炼系统,我的世界淬炼指令 | 手游网游页游攻略大全
  18. 华硕主板通过奥创与海盗船内存条神光同步
  19. C语言怎样判断乘法越界,c语言算术运算符越界问题解决方案
  20. 小程序一:利用Python编写一个简单的图书管理系统

热门文章

  1. 分享一个数据结构网站
  2. iOS安装CocoaPods详细过程
  3. 一年前端的迷惑,深度还是广度
  4. 5.6.1 Boolean类型
  5. leetcode - Anagrams
  6. C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
  7. DNN2(DotNetNuke2.0)的一些资源
  8. Eigen 3.3.7 MatrixVector的运算
  9. 转:MSSQL SERVER行转列 列转行
  10. linux下重新分区、数据备份相关(parted、dd等命令)