ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(成功的时候,谁都是朋友。但只有母亲——她是失败时的伴侣。——郑振铎)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤ
上一篇: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
作用
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
- hostPath
作用
- 运行一个需要访问 Docker 内部机制的容器;可使用 hostPath 挂载 /var/lib/docker 路径。
- 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
- 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在
- nfs
作用
- 多节点共享存储
- 独立于pod的文件服务器
- 文件服务器搭建
开始搭建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