存储持久化相关三个概念:
SC会定义两部分内容:
apiVersion: v1
kind: PersistentVolume
metadata:
name: testpv
spec:
storageClassName: test-storage
accessModes:
- ReadWriteOnce
capacity:
storage: 500Mi ##提供500Mi空间
hostPath:
path: /tmp/testpv/
说明:
storageClassName: 定义存储类名称,PV和PVC中都会有该字段,目的是为了方便两者匹配绑定在一起。
accessModes定义该pv的访问权限模式,有三种:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: testpvc
spec:
storageClassName: test-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi ##期望申请100Mi空间
应用pv和pvc的YAML
kubectl apply -f testpv.yaml -f testpvc.yaml
查看状态
kubectl get pv,pvc
查看状态是否Bound,如果不是,详细查看:
kubectl describe puv testpvc
实验:
将testpvc的期望100Mi改为1000Mi,查看PV的STATUS
SC的主要作用在于,自动创建PV,从而实现PVC按需自动绑定PV。
下面我们通过创建一个基于NFS的SC来演示SC的作用。
要想使用NFS的SC,还需要安装一个NFS provisioner,provisioner里会定义NFS相关的信息(服务器IP、共享目录等)
github地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
将源码下载下来:
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
cd nfs-subdir-external-provisioner/deploy
sed -i 's/namespace: default/namespace: kube-system/' rbac.yaml ##修改命名空间为kube-system
kubectl apply -f rbac.yaml ##创建rbac授权
修改deployment.yaml
sed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空间为kube-system
##你需要修改image、nfs_server、nfs_path、server共4处
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: chronolaw/nfs-subdir-external-provisioner:v4.0.2 ##改为dockerhub地址
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.222.99 ##nfs服务器地址
- name: NFS_PATH
value: /data/nfs ##nfs共享目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.222.99 ##nfs服务器地址
path: /data/nfs ##nfs共享目录
应用yaml
kubectl apply -f deployment.yaml
kubectl apply -f class.yaml ##创建storageclass
SC YAML示例
cat class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false" ##自动回收存储空间
有了SC,还需要一个PVC
vi nfsPvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfspvc
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi
下面创建一个Pod,来使用PVC
vi nfsPod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfspod
spec:
containers:
- name: nfspod
image: nginx:1.23.2
volumeMounts:
- name: nfspv
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfspv
persistentVolumeClaim:
claimName: nfspvc
配置完成,测试:
kubectl get po -w wide #查看po的ip
curl 10.187.168.151/test.html
总结:
pod想使用共享存储–>PVC(定义具体需求属性)–>SC(定义Provisionler)–> Provisioner(定义具体的访问存储方法)–> NFS-server
SC是自动创建PV
之前PV YAML示例就是本地存储。本地存储类型的PV是Kubernetes中一种比较特殊的持久化存储,它允许将节点上的本地磁盘或目录用作PV。与其他PV类型(例如NFS、Ceph或云存储)不同,本地存储类型的PV直接使用节点上的存储资源,因此具有更低的延迟和更高的性能。
使用本地存储类型的PV时,需注意以下几个关键点:
nodeAffinity: ##定义节点亲和性
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node-name
persistentVolumeReclaimPolicy: Retain
完整示例:
首先,确保在每个要使用本地存储的节点上创建一个本地目录。例如,在节点上创建/mnt/local-storage目录:
mkdir -p /mnt/local-storage
然后,创建一个PV资源配置文件,例如local-pv.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
labels:
type: local
spec:
storageClassName: local-storage
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
local:
path: /mnt/local-storage
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname #这是内置的节点标签,表示节点的主机名
operator: In
values:
- rocky9-2 #只有rocky9-2这个主机节点才满足要求
应用PV资源配置文件:
kubectl apply -f local-pv.yaml
再创建一个PVC资源配置文件,例如local-pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
应用PVC资源配置文件:
kubectl apply -f local-pvc.yaml
最后,创建一个Pod资源配置文件,例如local-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: local-pod
spec:
containers:
- name: local-container
image: nginx:1.21.0
volumeMounts:
- name: local-storage
mountPath: /data
volumes:
- name: local-storage
persistentVolumeClaim:
claimName: local-pvc
应用pod资源配置文件:
kubectl apply -f local-pod.yaml
kubectl get pod
kubectl get pod -o wide
kubectl describe po local-pod #注意之前实验中的污点设置
kubectl exec -it local-pod -- bash
注意:在做本章节示例时,需要拿单独一台机器来部署NFS,具体步骤略。
[root@localhost ~]# cat /etc/exports
/data/nfs 192.168.56.0/24(rw,sync,no_root_squash)
/data/nfs2 192.168.56.0/24(rw,sync,no_root_squash)
NFS作为常用的网络文件系统,在多机之间共享文件的场景下用途广泛,毕竟NFS配置方便,而且稳定可靠。
NFS同样也有一些缺点:
完整示例:
首先部署好NFS服务,并且保证所有Kubernetes节点可以顺利挂载(showmount -e 192.168.56.124)。如果没有客户端,安装:yum install -y nfs-utils
。
定义基于NFS的PV
vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storage
nfs:
path: /data/nfs2
server: 192.168.56.124
应用
kubectl apply -f nfs-pv.yaml
定义PVC
vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
应用
kubectl apply -f nfs-pvc.yaml
定义Pod
vi nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
spec:
containers:
- name: nfs-container
image: nginx:1.21.0
volumeMounts:
- name: nfs-storage
mountPath: /data
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: nfs-pvc
应用
kubectl apply -f nfs-pod.yaml
kubectl get po -o wide
kubectl exec -it nfs-pod -- bash #创建文件做测试