Kubernetes那点事儿——配置存储:ConfigMap、Secret

配置存储:ConfigMap、Secret


前言

前面介绍过的各种存储主要都是做数据的持久化,本节介绍的ConfigMap和Secret主要用于配置文件存储,或者环境变量的配置。

ConfigMap

创建ConfigMap后,数据实际会存储在K8s中(Etcd)Etcd,然后通过创建Pod时引用该数据。

应用场景:应用程序配置

Pod使用configmap数据有两种方式:

  • 变量注入
  • 数据卷挂载
yaml 复制代码
# cat configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  abcd: "1234"
  cdef: "5678"

   # 类文件键
  redis.properties: |
    port: 6379
    host: 192.168.31.10

#configmap pod引用#
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
  - name: configmap-pod
    image: nginx
    env:
      - name: ABCD # pod中环境变量 - echo $ABCD
        valueFrom:
          configMapKeyRef:
            name: configmap-demo # 与configmap.name一致
            key: abcd # 取值的key
      - name: CDEF # pod中环境变量 - echo $CDEF
        valueFrom:
          configMapKeyRef:
            name: configmap-demo # 与configmap.name一致
            key: cdef # 取值的key
    volumeMounts:
    - name: config
      mountPath: "/config"
      readOnly: true
  volumes:
  - name: config
    configMap:
      name: configmap-demo # 与configmap.name一致
      # 来自 ConfigMap 的一组键,将被创建为文件
      items:
      - key: "redis.properties" # 对用configmap的key名称
        path: "redis.properties" # 文件名字,/config/redis.properties
bash 复制代码
# kubectl apply -f configmap.yaml
configmap/configmap-demo created

# kubectl get configmap
NAME             DATA   AGE
configmap-demo   3      5s

# kubectl apply -f configmap-pod.yaml 
pod/configmap-demo-pod configured

# kubectl exec -it configmap-demo-pod -- bash 
root@configmap-demo-pod:/# ls /config
redis.properties
root@configmap-demo-pod:/# echo $ABCD
1234
root@configmap-demo-pod:/# echo $CDEF
5678
root@configmap-demo-pod:/# cat /config/redis.properties 
port: 6379
host: 192.168.31.10

这里使用了两种挂载方式,环境变量和配置文件。

被挂载的 ConfigMap 内容会被自动更新当卷中使用的 ConfigMap 被更新时,所投射的键最终也会被更新。

Kubelet 组件会在每次周期性同步时检查所挂载的 ConfigMap 是否为最新。Kubelet 使用的是其本地的高速缓存来获得 ConfigMap 的当前值。高速缓存的类型可以通过 KubeletConfiguration 结构,ConfigMapAndSecretChangeDetectionStrategy 字段来配置。

Secret

与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。

应用场景:凭据

kubectl create secret 支持三种数据类型:

  • docker-registry:存储镜像仓库认证信息
  • generic:从文件、目录或者字符串创建,例如存储用户名密码
  • tls:存储证书,例如HTTPS证书
bash 复制代码
# echo -n 'admin' | base64
YWRtaW4=

# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
yaml 复制代码
# cat secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: db-user-pass
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm



# cat secret-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-demo-pod
spec:
  containers:
  - name: secret-demo
    image: nginx
    env:
      - name: USER
        valueFrom:
          secretKeyRef:
            name: db-user-pass
            key: username
      - name: PASS
        valueFrom:
          secretKeyRef:
            name: db-user-pass
            key: password
    volumeMounts:
    - name: config
      mountPath: "/config"
      readOnly: true
  volumes:
  - name: config
    secret:
      secretName: db-user-pass
      items:
      - key: username
        path: my-dbusername
bash 复制代码
# kubectl exec -it secret-demo-pod  -- bash

root@secret-demo-pod:/# echo $USER $PASS
admin 1f2d1e2e67df
root@secret-demo-pod:/# cat /config/my-dbusername
admin

这里也是使用了两种挂载方式,一种是环境变量,一种是作为文件挂载

相关推荐
Charlie__ZS1 小时前
Docker安装
运维·docker·容器
BuluAI3 小时前
Lazydocker:高效便捷的Docker管理工具
运维·docker·容器
LuiChun11 小时前
docker django uwsgi 报错记录
docker·容器·django
tingting011911 小时前
docker 释放磁盘空间--常用清理命令
运维·docker·容器
Vol火山12 小时前
云原生架构中的中间件容器化:优劣势与实践探索
云原生·中间件·架构·数字化
橙子家czzj13 小时前
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
java·开发语言·kubernetes
dbcat官方14 小时前
2.微服务灰度发布落地实践(agent实现)
微服务·云原生·架构
小安运维日记16 小时前
CKA认证 | Day7 K8s存储
运维·云原生·容器·kubernetes·云计算
AR_xsy16 小时前
K8S--“ Failed to create pod sandbox: nameserver list is empty“
云原生·容器·kubernetes
码农炎可16 小时前
K8S 黑魔法之如何从 Pod 拿到节点的命令行
安全·云原生·容器·kubernetes