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