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 编码,可启用加密
使用方式 挂载 / 环境变量 挂载 / 环境变量

相关推荐
蝎子莱莱爱打怪18 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件1 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
阿里云云原生4 天前
阿里云获评 Agentic AI 开发平台领导者,函数计算 AgentRun 赢下关键分!
云原生