k8s学习: 部署动态 pvc(nfs-subdir-external-provisioner)
Kubernetes Volume 官方文档
Kubernetes Volume
nfs-subdir-external-provisioner 官方仓库和文档
nfs-subdir-external-provisioner
旧版的在这里
external-storage
Public archive
之前学习了 NFS 创建、删除和使用,那个应该算是静态方式的 NFS
感觉还是比较简单,这个说是动态方式,暂时也没有搞明白动态体现在哪里
总之,先照着完成,用着用着就应该回明白差别在哪里
按照官方仓库和文档的步骤操作
clone 代码
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/
简单认识一下
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.
配置 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
依次启动
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依次确认资源
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-pvNAME 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 时测试用例创建的 pvcNAME 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 是否已经挂载并起作用
查看 test-pod 挂载情况
cat test-pod.yamlkind: 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
查看test-pod 状况
kubectl describe pod test-podName: 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 ...
确认数据
既然容器中创建了一个文件,那么,对应到挂载的 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
测试数据是否会丢失
删除 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
数据依然存在
删除 pvc
kubectl delete -f test-claim.yaml
现在数据消失了!
storage class 的使用规则是: 不会随着 pod 删除而删除数据
查看 test-claim.yaml ,可以看到 archiveOnDelete: “false”
具体 pvc 删除规则,现在不去纠结!
关于动态 pvc 的理解
这篇文章写的比较详细
【kubernetes】持久化存储之静态PV/PVC
对比动态和静态 pvc 创建方式,可以说完全没有差别
动态 pvc
spec:storageClassName: managed-nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 1Mi
静态 pvc
spec:storageClassName: nfs-pvaccessModes:- ReadWriteManyresources:requests:storage: 50Mi #容量
对比静态 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)相关推荐
- k8s 动态NFS Subdir External Provisioner
目录 1.部署NFS 2.部署 NFS Subdir External Provisioner 已适配k8s-1.23.9集群(docker运行时) 1.部署NFS nfs 服务端(k8s-maste ...
- 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 个重要概念 ...
- 动态创建nfs的pvc失败问题排查
项目场景: 提示:Hadoop部署到k8s,需要在各个节点之间共享,而且各个节点都需要能编辑文件内容,所以需要支持ReadWriteMany的PersistentVolume,这里我选择使用NFS 使 ...
- k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
目录 概念 Volumes ConfigMap && Secret hostPath 模版 emptyDir 模版 PV 模版 PVC 模版 实战 volumes - hostPath ...
- 使用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 ...
- k8s学习笔记- 部署prometheus
1.Prometheus概述 Prometheus是一个开源监控系统,它前身是SoundCloud的警告工具包.从2012年开始,许多公司和组织开始使用Prometheus. 该项目的开发人员和用户社 ...
- aws--efs---使用efs创建k8s的动态pvc
我们之前使用EBS作为k8s的动态pvc的pv,但是EBS不支持ReadWriteMany类型的声明. 所以尝试使用efs作为存储底层来声明pvc. 动态pvc声明方案 创建efs文件存储系统 使用命 ...
- k8s mysql pv_k8s+mysql+pv+pvc+NFS实现mysql容器编排
k8s+mysql+pv+pvc+NFS实现mysql容器编排 首先需要介绍概念:pv和pvc PV 是集群提供的一种存储资源,是实际可用的磁盘.和挂 PV 的 Pod 有着独立的生命周期,Pod 销 ...
- k8s学习笔记一集群部署
k8s安装笔记 基础环境配置 修改主机名: 修改hosts配置文件 安装依赖包 关闭防火墙并未Iptables设置空规则 关闭swap分区和linux虚拟内存 调整内核参数 调整系统时区 关闭系统不需 ...
- k8s学习-CKA真题-Pod指定节点部署
目录 题目 分析 命令 环境搭建 解题 结果 参考 题目 分析 创建一个Pod,名字为nginx-kusc00401,镜像地址是nginx,调度到具有disk=spinning标签的节点上. 命令 环 ...
最新文章
- Python编程基础:第四十一节 继承Inheritance
- thinkphp开发卡密社区系统
- 阵列卡直通模式和raid模式_DNF:希洛克Raid攻坚流程攻略
- 软件设计师考试 | 第四章 操作系统知识 | 文件管理
- 设计灵感|展览海报如何编排?
- Win10系统,开机后提示Desktp不可用的故障解决方法。
- 2016 ICPC 大连网络赛 部分题解
- Django折腾日记(django2.0)
- gpu云服务器运行游戏_99元起!华为云鲲鹏云手机正式发布:流畅运行大型游戏...
- Java速成:Boot入门
- 编辑器,在线编辑器,微信编辑器,公众号编辑器,UEditor编辑器
- 使用机器学习和数据挖掘算法进行数据处理
- matlab保存f黑白图片_MATLAB的矩阵运算与重构
- break 通过自定义标签跳到指定位置
- 无线web认证计费服务器,WEB认证原理
- 动态代理是什么?应用场景?
- 我的世界服务器淬炼系统,我的世界淬炼指令 | 手游网游页游攻略大全
- 华硕主板通过奥创与海盗船内存条神光同步
- C语言怎样判断乘法越界,c语言算术运算符越界问题解决方案
- 小程序一:利用Python编写一个简单的图书管理系统