kubernetes 入门实践-存储 volume-nfs-pv-pvc

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(成功的时候,谁都是朋友。但只有母亲——她是失败时的伴侣。——郑振铎)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤ在这里插入图片描述
上一篇:kubernetes 入门实践-操作k8s集群

该教程将演示如何使用nfs解决k8s文件存储和节点之间共享的问题。如果没有部署过k8s应用,建议先看一下kubernetes 入门实践-操作k8s集群后再来看这篇文章

本教程版本相关信息

ubuntu 20.04
kubectl v1.22.3
k8s v1.22.3
nfs节点ip 192.168.5.138
node节点ip 192.168.5.139

如果不了解k8s集群,可以先看一下上面的教程,搭建入门集群后再来了解nfs,效果更佳。

在按照本教程操作时可能遇到的问题和解决方案
  • k8s node无法操作k8s

原因
需要将master节点的admin.conf复制到node节点,该配置文件是与集群通信时使用的kubeconfig文件。 没有该文件则无法与k8s通信
解决方案

  • 文件同步
    scp /etc/kubernetes/admin.conf zhangzw@192.168.5.138:/etc/kubernetes/admin.conf
  • 授权
    sudo chmod -R 777 /etc/kubernetes
  • 配置k8s环境变量
    echo “export KUBECONFIG=/etc/kubernetes/admin.conf” >> /etc/profile
  • 环境变量生效
    source /etc/profile

Pod生命周期

我们知道,pod的生命周期短暂,会被频繁的创建和销毁。当pod被销毁时,pod内的文件系统也会被销毁,所以为了解决这个问题,k8s提供了Volume。

Volumes k8s存储卷

Volume的生命周期独立于pod容器。当pod不在存在时,k8s会销毁临时卷。但对于持久卷,k8s在pod重启期间不会进行销毁

持久卷的核心是一个目录,任何pod的容器都可以访问该目录中的数据。

Vloume 常用的卷类型

  • emptyDir

作用

  1. 缓存空间,例如基于磁盘的归并排序。
  2. 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  3. 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
  • hostPath

作用

  1. 运行一个需要访问 Docker 内部机制的容器;可使用 hostPath 挂载 /var/lib/docker 路径。
  2. 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
  3. 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在
  • nfs

作用

  1. 多节点共享存储
  2. 独立于pod的文件服务器
  3. 文件服务器搭建

开始搭建nfs服务器

安装ubuntu网络文件系统 nfs
sudo apt-get install nfs-kernel-server rpcbind
创建节点共享目录
mkdir nfs-release

在这里插入图片描述

配置nfs挂载的环境变量

比如我的nfs挂在路径是

home/zhangzw/nfs-release

编辑配置文件

vim /etc/exports 

在这里插入图片描述
重启nfs

sudo /etc/init.d/nfs-kernel-server restart

在这里插入图片描述
查看nfs服务状态

sudo service nfs-kernel-server status

在这里插入图片描述

授权

sudo chmod -R 777 /home/zhangzw/nfs-release
部署 PersistentVolume(pv)

PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod

创建pv配置文件

vim nfs-release-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-release-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /home/zhangzw/nfs-release
    server: 192.168.5.138  #指定nfs目录所在的机器的地址
  • capacity 指定 PV 的容量为 1G。
  • accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

ReadWriteOnce:PV 能以 read-write 模式 mount 到单个节点。
ReadOnlyMany:PV 能以 read-only 模式 mount 到多个节点。
ReadWriteMany :PV 能以 read-write 模式 mount 到多个节点。

  • persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

Retain: 需要管理员手工回收。
Recycle:清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。
Delete: 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、- OpenStack Cinder Volume 等。

  • storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
  • 指定 PV 在 NFS 服务器上对应的目录。

应用nfs-release-pv.yaml

kubectl apply -f nfs-release-pv.yaml

在这里插入图片描述
查看集群上的pv

kubectl get pv

在这里插入图片描述
查看dashboard中的pv
在这里插入图片描述

部署 PersistentVolumeClaim(pvc)

PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV。
有了 PersistentVolumeClaim,用户只需要告诉 Kubernetes 需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息

创建pvc配置文件

vim nfs-release-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-release-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
~                       

应用nfs-release-pvc.yaml

kubectl apply -f nfs-release-pvc.yaml

在这里插入图片描述
查看集群上的pvc
在这里插入图片描述
查看dashboard中的pvc
在这里插入图片描述

创建pod验证共享存储

使用busybox镜像进行测试,该镜像是一个集成了三百多个最常用Linux命令和工具的软件
然后分别在两个k8s节点创建和部署两个pod nfs-pod1和nfs-pod2 用来验证数据的共享和存储

192.168.5.138

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod1
spec:
  containers:
    - name: nfs-pod1
      image: busybox
      args:
      - /bin/sh
      - -c
      - sleep 30000
      volumeMounts:
      - mountPath: "/home/zhangzw/nfs-release"
        name: nfs-pod1-volumeMount-name
  volumes:
    - name: nfs-pod1-volume-name
      persistentVolumeClaim:
        claimName: nfs-release-pvc
kubectl apply -f nfs-pod1.yaml

192.168.5.139

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod2
spec:
  containers:
    - name: nfs-pod2
      image: busybox
      args:
      - /bin/sh
      - -c
      - sleep 30000
      volumeMounts:
      - mountPath: "/home/zhangzw/nfs-release"
        name: nfs-pod2-volumeMount-name
  volumes:
    - name: nfs-pod2-volume-name
      persistentVolumeClaim:
        claimName: nfs-release-pvc
kubectl apply -f nfs-pod2.yaml
分别在两个pod的容器中创建文件

进入容器

kubectl exec -it nfs-pod1 /bin/sh
kubectl exec -it nfs-pod2 /bin/sh

进去容器内nfs共享存储目录

cd /home/zhangzw/nfs-release

分别创建文件 nfs-pod1.txt和nfs-pod2.txt

touch nfs-pod1.txt
touch nfs-pod2.txt

在这里插入图片描述
重新查看目录下文件,发现两个节点的容器内分别有这两个文件了
在这里插入图片描述
回到nfs节点 查看目录下文件已经有刚刚创建的文件了,这整明k8s的节点已经通过nfs共享存储空间了
在这里插入图片描述

删除并重启pod

kubectl delete pod nfs-pod2
kubectl apply -f nfs-pod2.yaml
验证重启后的pod是否可以访问nfs存储卷

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值