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

相关推荐
小猪写代码3 小时前
Ubuntu 文件权限管理
linux·ubuntu
jz_ddk3 小时前
[Linux] Linux标准块设备驱动详解:从原理到实现
linux·运维·服务器·驱动开发
Gss7773 小时前
ansible变量+管理机密
linux·运维·ansible
误入运维泥潭4 小时前
Ansible自动化运维:从入门到精通
linux·ansible·module
半梦半醒*4 小时前
ansible阶段练习题
linux·运维·自动化·ansible·负载均衡·运维开发
To_再飞行5 小时前
K8s 调度管理
linux·云原生·kubernetes
2302_799525745 小时前
【Hadoop】Hadoop集群安装中出现的问题
linux·hadoop
milanyangbo5 小时前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式·后端·云原生·架构