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

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

相关推荐
运维老郭8 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
AAA@峥12 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~13 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014015 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui16 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘16 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51718 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu75820 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国20 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务