十、kubernetes 1.29 之 存储 分类和configmap
一、 存储分类
1、元数据与真实数据
元数据
configMap: 用于保存配置数据(明文书写)
Secret: 用于保存敏感性数据(编码)
Downward API: 容器在运行时从Kubernetes API服务器获取有关它们自身的信息
真实数据
Volume: 用于存储临时或者持久性数据
PersistentVolume: 申请制的持久化存储
二、configMap
1、模型

2、定义
ConfigMap 功能在 Kubernetes 1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象。
注入的形式:用2替换1

LVS负载均衡
LVS(Linux Virtual Server)是一款基于Linux内核的高性能、高可用的负载均衡软件解决方案,由章文嵩博士发起。它通过将客户端请求分发到多台后端真实服务器(Real Server),实现流量均衡,从而提高系统的整体处理能力、可用性和可扩展性
。🔄 LVS 工作原理
LVS的核心工作依赖于IP虚拟服务器(IPVS)模块,该模块工作在内核空间。其基本流程如下
:
请求接收:客户端请求到达负载均衡器(Director Server)的虚拟IP(VIP)。
规则匹配:IPVS将接收到的请求与预先定义的集群服务进行比对。
请求转发:根据匹配结果和设定的调度算法,IPVS将请求转发至后端某台真实服务器(RS)。转发方式取决于其工作模式(如NAT、DR、TUN)。
响应返回:真实服务器处理请求后,将响应直接返回给客户端(DR、TUN模式)或通过负载均衡器返回(NAT模式)。
用户空间的
ipvsadm工具则用于配置和管理IPVS的规则,定义集群服务和真实服务器三种主要工作模式
LVS主要通过三种模式实现负载均衡,它们在转发机制和网络要求上有所不同
⚖️ 调度算法
LVS提供了多种调度算法来决定如何将请求分发给后端服务器,常见的有
轮询(Round Robin, RR):将请求依次分配给每台服务器。
加权轮询(Weighted Round Robin, WRR):根据服务器处理能力分配权重,按权重比例进行轮询。
最少连接(Least Connections, LC):将新请求分配给当前连接数最少的服务器。
加权最少连接(Weighted Least Connections, WLC):结合服务器权重和当前连接数进行调度。
基于源IP哈希(IP Hash):将来自同一客户端的请求始终发往同一台RS,适用于需要会话保持的场景。
💡 优势与应用场景
LVS的优势在于其高性能、高可用性、良好的可扩展性和透明性。它广泛应用于大型网站、云计算平台和企业数据中心等需要处理高并发流量的场景。
共享

NFS(Network File System,网络文件系统)是一种允许计算机通过网络共享文件和目录的分布式文件系统协议。它让你能够像访问本地硬盘一样,透明地访问远程服务器上的文件
。下面这个表格能帮你快速了解NFS的核心特点:
🔧 工作原理与核心组件
NFS采用客户端-服务器模型,其工作依赖一个关键的中间角色——RPC(Remote Procedure Call,远程过程调用)
。你可以这样理解其工作流程:
服务注册:NFS服务器启动后,其提供的服务(如挂载、文件操作)会向本机的RPC服务(端口111)注册自己的端口号
。当客户端要访问NFS共享时,它首先查询服务器上的RPC服务,询问“挂载服务在哪个端口?”
。RPC服务告知客户端具体的端口号。随后,客户端直接与该端口建立连接,进行文件读写操作
。简单来说,RPC就像一个电话总机,负责为客户端转接正确的服务分机
。📜 主要版本差异
NFS协议经历了多个主要版本的发展,了解其区别有助实际
💼 典型应用场景
NFS在以下场景中尤为有用:
Web服务器集群:多台Web服务器可以通过NFS共享相同的网站静态资源(如HTML、图片),保证内容一致
。家庭或实验室网络:方便地在不同计算机间共享文档、媒体文件或软件资源
。容器与虚拟化环境:为Kubernetes集群中的Pod或虚拟机提供共享存储卷
。⚠️ 性能与安全考量
性能:NFS的性能受网络速度(如千兆以太网)、延迟以及客户端缓存设置的影响。在高要求场景下,调整读写块大小(
。rsize/wsize)等参数可以优化性能安全:早期版本(如NFSv3)在公网环境下安全性较低。务必使用NFSv4,并通过防火墙限制访问IP范围,避免在互联网上暴露服务。 对于敏感数据,建议在NFS之上使用VPN或SSH隧道进行加密传输
。
注入和共享
3、创建
3.1 --from-file
要求
文件内容必须是一行一对的 k=v,注入pod内部变成环境变量
kubectl create configmap config的名字 --from-file=hongfu.file
将hongfu这个文件转换成config对象
3.2 --from-literal
kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=123 ...
适合k = v少的,直接写在命令
4、使用
apiVersion: v1
kind: Pod
metadata:
name: cm-env-test-pod
spec:
containers:
- name: test-container
image: wangyanglinux/myapp:v1
command: ["/bin/sh", "-c", "env"]
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: literal-config
key: name
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: literal-config
key: password
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never
解释:
启动后打印环境变量
command: ["/bin/sh", "-c", "env"]环境变量
env直接引入不替换
envFrom:
4.1
多个资源清单写在一起用 --- 分开
# ConfigMap 资源定义
apiVersion: v1
kind: ConfigMap
metadata:
name: literal-config
namespace: default
data:
name: dave
password: pass
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
---
# Pod 资源定义
apiVersion: v1
kind: Pod
metadata:
name: cm-env-test-pod
spec:
containers:
- name: test-container
image: wangyanglinux/myapp:v1
command: ["/bin/sh", "-c", "env"]
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: literal-config
key: name
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: literal-config
key: password
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never
编写,创建

4.2 环境变量编程启动命令
将环境变量拿来作为启动命令

# ConfigMap 资源定义
apiVersion: v1
kind: ConfigMap
metadata:
name: literal-config
namespace: default
data:
name: dave
password: pass
---
# Pod 资源定义
apiVersion: v1
kind: Pod
metadata:
name: cm-command-pod
namespace: default
spec:
containers:
- name: myapp-container
image: wangyanglinux/myapp:v1.0
command: ["/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)"]
env:
- name: USERNAME
valueFrom:
configMapKeyRef:
name: literal-config
key: name
- name: PASSWORD
valueFrom:
configMapKeyRef:
name: literal-config
key: password
restartPolicy: Never
创建..

4.3变成configmap文件

解释
卷绑定
名字
地址
volumeMounts: - name: config-volume mountPath: /etc/config声明卷
-卷名
基于什么方式
名字
volumes: - name: config-volume configMap: name: literal-config
# ConfigMap 资源定义
apiVersion: v1
kind: ConfigMap
metadata:
name: literal-config
namespace: default
data:
name: dave
password: pass
---
# Pod 资源定义(将 ConfigMap 作为卷挂载)
apiVersion: v1
kind: Pod
metadata:
name: cm-volume-pod
spec:
containers:
- name: myapp-container
image: wangyanglinux/myapp:v1.0
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: literal-config
restartPolicy: Never

4.4 链接、热更新

configmap是以注入的形式做的信息共享,如果文件1.conf正在被删除的时候发生了注入,那么很可能这个文件会被损坏,热更新/链接就是说注入的时候新建一个文件,注入完成后将链接关系改过就好

文件
nginx
server {
# 监听 80 端口,并设置为默认服务器
listen 80 default_server;
# 服务器域名,支持 example.com 和 www.example.com
server_name example.com www.example.com;
# 处理根路径请求
location / {
# 网站根目录
root /usr/share/nginx/html;
# 默认索引文件
index index.html index.htm;
}
}
编写创建
将对象编写成yaml文件
kubectl get cm 对象名 -o yaml
deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hotupdate-deploy
name: hotupdate-deploy
spec:
replicas: 5
selector:
matchLabels:
app: hotupdate-deploy
template:
metadata:
labels:
app: hotupdate-deploy
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d/
volumes:
- name: config-volume
configMap:
name: default-nginx
创新

修改前pod内部

当前是 nginx.conf --> configmap --挂载到 --> deployment控制器
修改conf文件,查看控制器是否更新,,验证热更新
修改configmap的端口

一段时间后pod(注入)

强制滚动跟新
针对一些不支持检测配置文件修改而自动跟新的
"更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新"
kubectl patch deployment nginx-test --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "66666666"}}}}}'更新后的现象说明
"使用该 ConfigMap 挂载的 Env 不会同步更新"
"使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概 10 秒)才能同步更新"
5、不可改变
Kubernetes 给不可变的 ConfigMap 和 Secret 提供了一种可选配置,可以设置各个 Secret 和 ConfigMap 为不可变的。对于大量使用 configmap 的集群(至少有成千上万各不相同的 configmap 供 Pod 挂载),禁止变更它们的数据有下列好处:
√ 防止意外(或非预期的)更新导致应用程序中断
√ 通过将 configmap 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低 kube-apiserver 的负载,提升集群性能。

immutable: true
该操作不可逆,只能删除重建
更多推荐











所有评论(0)