本文主要是介绍kubernetes里面那些事—————存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
常用数据卷类型
- 一,emptyDir
- 1.1,emptyDir概念
- 1.2,应用场景
- 1.3,yaml示例
- 二,hostPath
- 2.1,hostPath概念
- 2.2,应用场景
- 2.3,yaml示例
- 三,congfigmap
- 3.1, configmap的作用
- 3.2, 注意事项:
- 3.3, 使用configmap创建java项目配置文件
- 3.4,subPath应用
- 3.5, configmap作为环境变量
- 四,secret
- 4.1 ,secret类型
- 4.2,secret保存用户密码
- 4.3 ,使用secret创建docker-registry
- 五,PV和PVC
- 5.1,PersistentVolume(PV)
- 5.2,PersistentVolumeClaim(PVC)
- 5.3,工作流程
- 5.4,pv生命周期
- 5.5 ,手动使用pv,pvc
- 六,PV动态供给
- 6.1,yaml示例
- 6.2,回收策略修改
- 6.3, pvc扩容
节点本地: hostPath emptyDir
网络:NFS GFS Ceph Openebs
k8s资源: configMap Secret
一,emptyDir
1.1,emptyDir概念
是一个临时存储卷(pod所在节点),与pod生命周期绑定,如果pod删除卷也会被删除
1.2,应用场景
pod中容器之间数据共享
1.3,yaml示例
apiVersion: v1
kind: Pod
metadata: name: my-pod
spec:containers:- name: write # 业务容器(写数据) image: centos:7command: ["bash","-c","for i in {1..100};do echo $i >>/data/hello;sleep 1;done"]volumeMounts:- name: data mountPath: /data- name: read # 辅助容器(读数据)image: centoscommand: ["bash","-c","tail -f /data/hello"] volumeMounts:- name: data mountPath: /datavolumes:- name: dataemptyDir: {}
二,hostPath
2.1,hostPath概念
挂载node文件系统(pod所在节点)上文件或者目录到pod中的容器,pod删除后数据会持久化在宿主机上
2.2,应用场景
pod中容器需要访问宿主机文件(cadvisor暴露指标、jenkins打包镜像)
2.3,yaml示例
apiVersion: v1
kind: Pod
metadata:name: testpod
spec:containers:- name: testimage: busyboxargs:- /bin/sh- -c - sleep 36000volumeMounts:- name: datamountPath: /project #挂载到容器中目录 - name: data2mountPath: /project2volumes:- name: datahostPath:path: /tmp #宿主机目录type: Directory #挂载卷的类型为目录 - name: data2hostPath:path: /etctype: Directory
三,congfigmap
3.1, configmap的作用
- 持久化保存配置文件
- 根据需要覆盖原配置文件
3.2, 注意事项:
- 以subpath方式挂载的无法直接在容器中修改 文本数据挂载成文件时采用 UTF-8
- 字符编码。如果使用其他字符编码形式,可使用binaryData字段。
3.3, 使用configmap创建java项目配置文件
apiVersion: v1
kind: ConfigMap
metadata:name: java-demo-config
data:config: |server:port: 8080spring:datasource:url: jdbc:mysql://java-demo-db:3306/test?characterEncoding=utf-8username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverfreemarker:allow-request-override: falsecache: truecheck-template-location: truecharset: UTF-8content-type: text/html; charset=utf-8expose-request-attributes: falseexpose-session-attributes: falseexpose-spring-macro-helpers: falsesuffix: .ftltemplate-loader-path:- classpath:/templates/ #到这都是配置文件
3.4,subPath应用
使用场景
场景一:一个共享卷,挂载多个路径。
场景二:ConfigMap或Secret挂载到特定目录的特定路径, 而该目录下已经有其他文件且不希望被覆盖掉。可以通过 subPath 挂载卷的子目录,而不是根目录。
volumeMounts:- name: config #挂载数据卷的名字mountPath: "/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml" #挂载到容器中的目标目录subPath: application.yml #subpath代表远端存储子路径volumes:- name: config #数据卷名configMap: #类型name: java-demo-config items:- key: "config" #ConfigMap中key config中的内容被挂载到pod的mountPath路径path: "application.yml" #路径由 spec.containers 中参数 volumeMounts.mountpath 和 volumes 中参数 items.path 拼接而成
3.5, configmap作为环境变量
cat nacos-env-cm.yaml
apiVersion: v1
data:nacos_addr: http://nacos-cs:8848nacos_ns_uc: 845a984f-9b16-46e3-a396-78f84ba669d7nacos_ns_vsoc_csa: 845a984f-9b16-46e3-a396-78f84ba669d7nacos_ns_vsoc_front: 614a56fc-e64f-4904-b0f1-635c66f2f82f
kind: ConfigMap
metadata:name: nacos-env
cat pod.yaml
spec:containers:- env:- name: TZvalue: Asia/ShanghaienvFrom:- configMapRef:name: nacos-env
四,secret
4.1 ,secret类型
- Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
- 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
- kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证
4.2,secret保存用户密码
加密:echo admin | base64
YWRtaW4K
解密:echo YWRtaW4K | base64 -d
admin
创建
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:password: MWYyZDFlMmU2N2Rmusername: YWRtaW4=
#将Secret挂载到环境变量中
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress-deployment
spec:replicas: 2selector:matchLabels:app: wordpressstrategy:type: RollingUpdatetemplate:metadata:labels:app: wordpressvisualize: "true"spec:containers:- name: "wordpress"image: "wordpress"ports:- containerPort: 80env:- name: WORDPRESS_DB_USERvalueFrom:secretKeyRef:name: mysecretkey: username- name: WORDPRESS_DB_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password
4.3 ,使用secret创建docker-registry
kubectl create secret docker-registry harbor-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=reg.ale.com -n dev
yaml中应用imagePullSecrets
spec:replicas: REPLICASselector:matchLabels:project: PROJECTapp: APP_NAMEtemplate:metadata:labels:project: PROJECTapp: APP_NAMEspec:imagePullSecrets:- name: "harbor-auth"
五,PV和PVC
5.1,PersistentVolume(PV)
持久数据卷,对存储资源的抽象,使得存储作为集群中的资源管理
5.2,PersistentVolumeClaim(PVC)
持久数据卷申请,用户定义使用的存储容量,使得用户不需要关心后端存储实现
5.3,工作流程
Pod申请PVC作为卷来使用,Kubernetes通过PVC查找绑定的PV,并挂载到Pod中供程序使用
5.4,pv生命周期
ACCESS MODES(访问模式):
AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
• ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
• ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
• ReadWriteMany(RWX):读写权限,可以被多个节点挂载
RECLAIM POLICY(回收策略):
目前 PV 支持的策略有三种:
• Retain(保留): 保留数据,需要管理员手工清理数据
• Recycle(回收):清除 PV 中的数据,效果相当于执行 rm -rf /ifs/kuberneres/*
• Delete(删除):与 PV 相连的后端存储同时删除
修改回收策略:
spec:
......persistentVolumeReclaimPolicy: Recycle
......
STATUS(状态):
一个 PV 的生命周期中,可能会处于4中不同的阶段:
• Available(可用):表示可用状态,还未被任何 PVC 绑定
• Bound(已绑定):表示 PV 已经被 PVC 绑定
• Released(已释放):PVC 被删除,但是资源还未被集群重新声明
• Failed(失败): 表示该 PV 的自动回收失败
5.5 ,手动使用pv,pvc
创建pv
apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv1
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncenfs:path: /nfs/kubernetesserver: 192.168.200.1
创建pod使用pvc
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: web-pvname: web-pv
spec:selector:matchLabels:app: web-pvtemplate:metadata:labels:app: web-pvspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumes:- name: wwwpersistentVolumeClaim:claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 5Gi
六,PV动态供给
- PV动态供给,使用StorageClass对象实现,只需要定义pvc,pv会自动创建绑定
- 使用nfs-external-provisioner实现
storageClassName: “managed-nfs-storage”
6.1,yaml示例
cat > web-sc.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: web-scname: web-sc
spec:selector:matchLabels:app: web-sctemplate:metadata:labels:app: web-scspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumes:- name: wwwpersistentVolumeClaim:claimName: my-pvc3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc3
spec:storageClassName: "managed-nfs-storage"accessModes:- ReadWriteManyresources:requests:storage: 5GiEOF
6.2,回收策略修改
存储类级别,创建后不能更新
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:archiveOnDelete: "false" #是启用数据卷归档,pod删除时,pv打包成压缩包allowVolumeExpansion: true #是否允许扩容reclaimPolicy: #可选参数,Delete、Retain,pvc和pod删除时,删除还是保留pv,默认为Delete
pvc级别
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retain
对已经创建的pv更新保留策略
kubectl patch pv pvc-99648dc8-de7d-49e2-81ed-433989ba33ad -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
6.3, pvc扩容
前提是存储类支持扩容
对pvc进行扩容时,只需要修改pvc的定义,将resources.requests.storage设置为一个更大的值即可。
这篇关于kubernetes里面那些事—————存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!