当前位置: 首页 > news >正文

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设置为一个更大的值即可。


http://www.mrgr.cn/news/18822.html

相关文章:

  • 香港服务器支持PHP吗?还支持哪些语言?
  • Vue 组件有哪些通讯方式?这里有10种方式及示例代码
  • wacat - 一款开源随机测试工具
  • AI 生成技术引领创新潮流,多领域应用展现广阔前景
  • vue3中播放m3u8,附测试网址
  • 涨薪秘籍?40w年薪项目经理力荐,10个项目管理神器大放送!
  • quartz源码-Schedule启动过程分析
  • Java算法之LRUCache缓存实现
  • JVM面试(三)类加载过程
  • 人该怎样活着呢?48
  • 深度学习引介:未来已来
  • CMake编译测试
  • 15年期权停交易的时候究竟发生了什么?期权零门槛开户怎么做?
  • ​​​​​​​《黑神话:悟空》—— 高科技点亮西游神话璀璨之路
  • 免费pdf转word软件,为你整理出8种方法,总有一个适合你
  • DRY原则-用函数和模块化来避免重复代码
  • 2024自动化测试面试真题(附答案)!
  • 分类预测|基于雪消融优化极端梯度提升的数据分类预测Matlab程序SAO-XGBoost 多特征输入多类别输出
  • 【干货】深度学习调参秘籍【表格】
  • 企业数据管理方案-提升效率与决策力的关键