K8s 存储配置资源

存储配置对象

1. ConfigMap

应用在其初始化或运行期间要依赖一些配置信息。多数时候,存在要调整配置参数所设置的数值的需求。ConfigMap 是 Kubernetes 的一种机制,可以将配置数据注入到应用的 Pod 内部。

ConfigMap 允许将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。例如,可以下载并运行相同的容器镜像来启动容器,分别用于本地开发、系统测试或运行实时终端用户工作负载。

ConfigMap 不用来保存大量数据,如果超出,考虑用挂载存储卷或者用独立的数据库或者文件服务器。

用途

  • 用于存储非敏感的配置数据,如应用程序参数、配置文件、命令行参数等。
  • 数据以 key-value 形式保存,可供 Pod 挂载或通过环境变量读取。

1.1 创建 ConfigMap

最好使用yaml文件进行创建或修改,这样便于使用git进行管理,团队协作等.

命令行方式
复制代码
kubectl create configmap my-config \
  --from-literal=APP_MODE=production \
  --from-literal=TIMEOUT=30

由于多行内容需要转义和保持缩进,直接在命令中写入多行内容非常繁琐,不适合较大配置。

通过文件创建
  1. 先准备两个配置文件:

    echo 'server {
    listen 80;
    server_name a.example.com;
    location / {
    proxy_pass http://192.168.1.71:8080;
    }
    }' > a.conf

    echo 'server {
    listen 80;
    server_name b.example.com;
    location / {
    proxy_pass http://192.168.1.71:8081;
    }
    }' > b.conf

  2. 创建 ConfigMap:

    kubectl create configmap nginx-config --from-file=a.conf --from-file=b.conf


YAML 定义方式
复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  a.conf: |   # 竖杠"|"表示多行文本块
    server {
        listen 80;
        server_name a.example.com;
        location / {
            proxy_pass http://192.168.1.71:8080;
        }
    }
  b.conf: |
    server {
        listen 80;
        server_name b.example.com;

        location / {
            proxy_pass http://192.168.1.71:8081;
        }
    }

1.2 使用 ConfigMap

挂载到容器中
复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-proxy
spec:
  containers:
  - name: web
    image: nginx:1.23
    volumeMounts:
      - name: config
        mountPath: /etc/nginx/conf.d
  volumes:
  - name: config
    configMap:
      name: nginx-config
      items:
      - key: "a.conf"
        path: "a.com.conf"

解释: 卷定义及 ConfigMap 挂载

复制代码
volumes:
- name: config
  configMap:
    name: nginx-config
    items:
    - key: "a.conf"
      path: "a.com.conf"
  • volumes:Pod 使用的卷。
  • configMap.name: nginx-config:指定使用名为 nginx-config 的 ConfigMap。
  • items
    • key: "a.conf":ConfigMap 中的某个键。
    • path: "a.com.conf":在容器文件系统中保存为 /etc/nginx/conf.d/a.com.conf

运行效果

  • ConfigMap 中 a.conf 对应的值(通常是 nginx 的配置内容)会被写入容器中的 /etc/nginx/conf.d/a.com.conf 文件。

  • 容器启动时会加载该配置文件,提供对应的代理配置。


通过环境变量注入

在containers.env字段中定义环境变量,如:

复制代码
env:
  - name: WORKER_CONNECTION
    valueFrom: 
      configMapKeyRef:
        name: your_configmap_name
        key: your_selected_key

所有键值对都会以环境变量的形式注入容器。


2. Secret

Secret 是包含敏感数据的对象,使用 Secret 意味着不需要在代码中包含敏感数据。

Secrets 类似于配置映射,但具体用于保存机密数据,例如:为容器设置环境变量;向 Pod

提供 SSH 密钥或密码等凭证;允许 kubelet 从私有注册表中提取容器镜像等。

用途

  • 用于存储敏感数据,如密码、Token、SSH Key、TLS 证书等。

  • 数据默认以 Base64 编码存储(非加密),可启用加密存储功能。


2.1 创建 Secret

命令行方式(generic)
复制代码
kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=123456
命令行方式(docker-registry)
复制代码
kubectl create secret docker-registry my-docker-secret \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=myuser \
  --docker-password=mypass \
  --docker-email=myemail@example.com
命令行方式(tls)
复制代码
kubectl create secret tls my-tls-secret \
  --cert=server.crt \
  --key=server.key
YAML 定义方式(generic)
复制代码
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=   # base64(admin)
  password: MTIzNDU2   # base64(123456)

2.2 使用 Secret

挂载到容器中
复制代码
volumes:
- name: secret-volume
  secret:
    secretName: my-secret
containers:
- name: app
  image: busybox
  volumeMounts:
  - name: secret-volume
    mountPath: /etc/secret

容器内 /etc/secret/username/etc/secret/password 文件包含解码后的内容。


通过环境变量注入
复制代码
containers:
- name: app
  image: busybox
  envFrom:
  - secretRef:
      name: my-secret

usernamepassword 会以环境变量的形式注入容器。


3. 对比总结

特性 ConfigMap Secret
用途 存储非敏感配置数据 存储敏感数据(密码、密钥、证书)
数据存储 明文(etcd 中未加密) Base64 编码,可启用加密
使用方式 挂载 / 环境变量 挂载 / 环境变量

相关推荐
Gary董11 分钟前
高并发的微服务架构如何设计
微服务·云原生·架构
东哥爱编程13 分钟前
使用Runpod进行gpu serverless推理
云原生·serverless
跃渊Yuey17 分钟前
【Linux】线程同步与互斥
linux·笔记
舰长11520 分钟前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀25 分钟前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng34 分钟前
Linux 输出重定向
linux·运维
路由侠内网穿透.36 分钟前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon1 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq1 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux
Ankie Wan2 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc