k8s-资源存储
ConfigMap
基于命令创建
创建一个名为my-config的configMap,并将key1和key2的值分别设置为value1和value2。
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
基于文件创建
1.定义文件
apiVersion: v1 kind: ConfigMap metadata: name: my-config data: key1: value1 key2: value2
2.基于文件创建
kubectl apply -f configmap.yaml
查询
1.要查看已创建的configMap,可以使用以下kubectl命令行工具:
kubectl get configmaps
这将列出所有已创建的configMap及其基本信息,如名称、命名空间、创建时间等。
2.要查看特定configMap的详细信息,可以使用以下命令:
kubectl describe configmap <configmap-name>
这将显示有关指定configMap的详细信息,包括数据键值对和其他元数据。
使用configMap
1.注入环境变量的方式
deployment.yml配置
spec: containers: - env: - name: CACHE_ADDR #赋值给本地环境变量名字 valueFrom: configMapKeyRef: key: cache.addr #config map 里面key name: config-common #config map 名字
2.基于数据卷
volumes: - name: db-config # 数据卷的名称 configMap: name: test-dir-config # 指定要加载的 ConfigMap 的名称如果不指定,默认会讲configmap中所有key全部转换为一个个同名的文件 items: # 对 configMap 中的 key 进行映射 - key: "db.properties" # ConfigMap 中的 key 创建configmap可以直接指定key的value为一个yml文件 path: "db.properties" # 将该 key 的值转换为文件
Secret
使用base64存储 安全性不高
针对有特殊字符需要加上单引号
基于dockerregistry创建
kubectl create secret docker-registry harbor-secret --docker-username=admin --docker-password=wolfcode --docker-email=lq
查看
kubectl describe secret harbor-secret
编辑
kubectl edit secret harbor-secret
配合 使用,用于deplomyment 配置私有仓库需要密码授权时用户名密码存储
- name: harbor-secret
SubPath
1.创建一个configMap基于本地文件
kubectl create configmap nginx-conf-cm --from-file=./nginx.conf
2.讲nginxConfig通过configMap挂载起来
apiVersion: v1 kind: Pod metadata: name: app-pod # 定义Pod的名称 spec: containers: - name: app-container # 定义容器的名称 image: my-app-image # 指定容器所使用的镜像 volumeMounts: - name: config-volume # 定义要挂载的Volume的名称 mountPath: /etc/config # 指定要挂载到容器中的路径 subPath: app.properties # 指定要挂载的文件 这样就不会把整个目录覆盖 只会替换这个文件 volumes: - name: config-volume # 定义Volume的名称 configMap: name: nginx-config # 指定要使用的ConfigMap的名称
配置的热更新
针对 subPath 和环境变量形式不会更新
解决方式使用文件挂载的方式,在容器生命周期,将文件替换,或者修改nginx config的config目录文件位置
默认方式会更新,会有个更新周期(更新时间+缓存时间)
如何更新配置
使用edit修改
使用yml替换
1.使用--dry-run不会发送到k8s创建map -o yml输出yml格式 kubectl create cm test-dir-config --from-file=./test/ --dry-run -o yml 2.组合kubectl replace 替换 kubectl create cm test-dir-config --from-file=./test/ -o yml| kubectl replace -f configmap/{name} replaced
不可变的configMap和Secret
禁止别人更改
通过设置 immutable:true
apiVersion: v1 kind: ConfigMap metadata: name: my-config # 定义 ConfigMap 的名称 immutable: true # 设置 ConfigMap 为不可变 data: app.properties: |- key1=value1 # 定义配置文件中的键值对 key2=value2 # 定义配置文件中的键值对
持久化存储
Volumens
HostPath
节点上的文件或目录挂载到Pod上,此时该目录会变成特久化
存储目录了即使Pod被删除后更启,也可以重新加载到该目录,该目录下的文件不会丢失
apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image: nginx volumeMounts: - mountPath: /data # 容器内挂载路径 name: data-volume volumes: - name: data-volume hostPath: path: /path/to/example # 本地目录路径
EmptyDir
不是为了持久化,仅仅是为了多个pod实现文件共享,当pod被删除 emptDir也会删除
apiVersion: v1 kind: Pod metadata: name: emptydir-pod spec: containers: - name: my-container image: my-image volumeMounts: - mountPath: /cache # 将 EmptyDir 挂载到 /cache 路径 name: cache-volume volumes: - name: cache-volume # 定义名为 cache-volume 的 EmptyDir 卷 emptyDir: {} # 使用 EmptyDir 类型的卷
容器之间访问cache实现了共享
NFS挂载
nfs卷能将NFS(网络文件系统挂或到你的Pod中。
不像emptyDir那样会在除Pod的同时也会被除,nfs卷的内容在删除Pod时会被保存,卷只是被即载。这意味着nfs卷可以被先填充数据,并且这些可以在Pod之间共享。
PV与PVC
各种挂载的抽象封装,PV抽象各个挂载的不同, pod根据PVC匹配对于的PV
PV构建
1.静态构建,预先在k8s定义好PV
2.动态构建,当PVC申领没有符合条件的PV则自动创建 需要指定StorageClass
PV绑定
根据PVC 绑定符合条件的PV
绑定后的PV不能删除
PVC使用
Pod申领PVC
运维定义好PV和PVC 开发Pod申领使用
回收策略
1.保留
删除不会自动删除,需要管理员手动删除
2.删除
删除PV对象的同时,所关联数据都会自动移除(默认)
3.回收
已废弃
PV状态
Availabel(空闲未绑定)
Bound(已经被PVC绑定)
Released(PVC被删除,资源已回收,但是PV未被重新使用)
Failed(回收灰白)
StorageClass
传统pod申请pvc 需要提前定义pv 和pvc,有状态服务多了会变得比较麻烦。
相关命令
1.获取PV列表
2.获取PVC列表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!