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

相关推荐
云雾J视界9 小时前
Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践
linux·云原生·架构·kubernetes·音视频·glusterfs·elk stack
java_logo10 小时前
Docker 部署 MinIO 全指南
运维·windows·mongodb·docker·容器
tongsound10 小时前
libmodbus 使用示例
linux·c++
拾光Ծ10 小时前
【Linux】“ 权限 “ 与相关指令
linux·运维·服务器
硬核子牙11 小时前
调试器是怎么让代码停下来的
linux
To_再飞行11 小时前
Linux Bash(一)
linux·运维·服务器·bash
李憨憨--11 小时前
掌握 Kubernetes 的可观测性 (Tracestore)、安全性 (OPA)、自动化 (Flagger) 和自定义指标
kubernetes
LCG元11 小时前
保姆级教程:CentOS 7/8 部署Nginx + MySQL + PHP(LEMP)环境,从零开始到上线项目
linux
疯癫的老码农11 小时前
【Linux环境下安装】SpringBoot应用环境安装(五)-milvus安装
linux·spring boot·milvus
孤廖11 小时前
C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
linux·服务器·开发语言·c++·人工智能·后端·深度学习