https://www.cnblogs.com/wn1m/p/11288671.html # 不错的文章
# K8s的存储卷:
它有四种存储卷:
1. emptyDir: 空目录,这种存储卷会随着Pod的删除而被清空,它一般作为缓存目录使用,或临时目录,
当做缓存目录时,通常会将一块内存空间映射到该目录上,让Pod做为缓存目录使用。
2. hostPath
SAN(存储区域网络): iSCSI,FB
NAS(网络附加存储): nfs,cifs
分布式存储: Glusterfs, ceph(rbd), cephfs
云存储: EBS(弹性块存储),Azure Disk
gitRepo类型的存储卷:
gitRepo:这种类型的存储卷是在容器启动时,将远程git仓库中的数据(如: 网站代码)给克隆一份到本地,
然后启动容器使用该克隆的数据来提供服务,这份克隆的数据在容器运行过程中不会将更新的数据同步到git仓库中,
同时git仓库中的更新也不会同步到该容器中,若要实现当git仓库发生改变时,能同步到容器的存储卷中,
还要借助于辅助容器,每隔一段时间就去克隆一份git仓库中的数据, 当本地数据改变时,再同步到git仓库中
kubectl explain pod.spec.volumes
#emptyDir存储卷的示例:
apiVersion: v1
kind: Pod
metadata:
name: pod-volumes
namespace: default
labels:
app: myapp
tier: frontend
annotations:
vipthink.com/created-by: “cluster admin”
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts: #存储卷可被一个Pod中的多个容器挂载.谁需要就定义挂载即可.
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/
command:
- "/bin/sh"
- "-c"
- "while true; do echo $(date) >> /data/index.html; sleep 2; done"
volumes:
- name: html
emptyDir: {}
# hostPath类型的存储卷 它有一下几种类型:
DirectoryOrCreate: 它可以是宿主机上的一个已存在的目录,也可不存在,若不存在则自动创建.
Directory: 它必须是宿主机上一个已经存在的目录。
FileOrCreate: 它可以是宿主机上的一个文件,若此文件不存在则创建一个空文件来挂载。
File:宿主机上的一个已经存在的文件,若不存在则报错。
Socket:宿主机上一个已经存在的Unix Socket文件.
CharDevice: 宿主机上一个已存在的字符类型的设备文件.
BlockDevice: 宿主机上一个已存在的块类型的设备文件。
[root@m1 volumes]# cat pod-hostPath.yaml
#创建一个hostPath类型的存储卷示例:
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath-volumes
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
hostPath:
#这是定义宿主机上那个目录作为容器myapp的存储卷的.
path: /data/pod/volume1
type: DirectoryOrCreate
# 创建NFS 共享存储卷的配置清单:
apiVersion: v1
kind: Pod
metadata:
name: pod-nfs-volumes
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
nfs:
path: / # 这里使用腾讯云的 nfs 所以是 / 如果自建可以根据自建的目录来定
server: 10.66.188.211 #先测试直接让Pod挂载NFS共享
# 12-1:20 pvc
kubectl explain pvc.spec
# 前提是要准备好nfs/并且 支持挂载 10.104.27.157/data/v1 10.104.27.157/data/v2 10.104.27.157/data/v3
[root@m1 volumes]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01 #PV是集群级别的资源,因此它不能定义在名称空间中,它可以被任何名称空间使用 名称空间也不能嵌套,因为它也是集群级别的资源.
labels:
name: pv01
rate: high #添加一个速度标签,用于标明其存储效率更高,以便后期标签选择器选择.
spec:
nfs:
path: /data/v1
server: 10.104.27.157
#对于访问模型,可定义为底层共享存储的子集,但不能是超集
#即: NFS支持RWO,ROX,RWX,但我创建PV时,可只提供其中一个或多个.
# https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes-1
# ReadWriteOnce —— 该volume只能被单个节点以读写的方式映射
# ReadOnlyMany —— 该volume可以被多个节点以只读方式映射
# ReadWriteMany —— 该volume只能被多个节点以读写的方式映射
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
#对于存储能力,它的单位有:T,P,G,M,K或 Ti,Pi,Gi,Mi,Ki 区别:加i的是以1024为换算单位的。
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02
labels:
name: pv02
rate: high
spec:
nfs:
path: /data/v2
server: 10.104.27.157
accessModes: ["ReadWriteMany","ReadOnlyMany"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03
labels:
name: pv03
rate: high
spec:
nfs:
path: /data/v3
server: 10.104.27.157
accessModes: ["ReadWriteMany","ReadOnlyMany"]
capacity:
storage: 10Gi
# 创建pvc和pod
[root@m1 volumes]# cat pvc.yaml
#创建PVC和pod :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: default
spec:
#它必须是PV的子集,即PV必须能符合它的要求.
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
kubectl describe pvc mypvc
kubectl get pv
kubectl get pvc
kubectl describe pv