一、 存储分类

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)模块,该模块工作在内核空间。其基本流程如下

  1. 请求接收​:客户端请求到达负载均衡器(Director Server)的虚拟IP(VIP)。

  2. 规则匹配​:IPVS将接收到的请求与预先定义的集群服务进行比对。

  3. 请求转发​:根据匹配结果和设定的调度算法,IPVS将请求转发至后端某台真实服务器(RS)。转发方式取决于其工作模式(如NAT、DR、TUN)。

  4. 响应返回​:真实服务器处理请求后,将响应直接返回给客户端(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,远程过程调用)​

你可以这样理解其工作流程:

  1. 服务注册​:NFS服务器启动后,其提供的服务(如挂载、文件操作)会向本机的RPC服务(端口111)注册自己的端口号

  2. 当客户端要访问NFS共享时,它首先查询服务器上的RPC服务,询问“挂载服务在哪个端口?”

  3. 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

该操作不可逆,只能删除重建

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐