> 文档中心 > 【云原生 • Kubernetes】配置管理 - Secret & ConfigMap

【云原生 • Kubernetes】配置管理 - Secret & ConfigMap

在这里插入图片描述

本文导读

  • 一、机密配置抽象 Secret
    • 1. 认识 Secret
    • 2. Secret 的使用
      • (1) 创建 Secret 加密数据
      • (2) 将 Secret 以变量形式挂载到 pod 容器
  • 二、配置抽象 ConfigMap
    • 1. 认识 ConfigMap
    • 2. ConfigMap 的使用
      • (1) 创建配置文件
      • (2) 创建 ConfigMap
      • (3) 将 ConfigMap 以变量形式挂载到 pod 容器

一、机密配置抽象 Secret

Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。这样的信息可能会被放在 Pod 规约中或者镜像中。使用 Secret 意味着你不需要在应用程序代码中包含机密数据。由于创建 Secret 可以独立于使用它们的 Pod,因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret 及其数据的风险较小。

1. 认识 Secret

Secret 用于 数据加密,并将它们存储到 etcd 当中,然后让 Pod 容器以挂载 Volume 的方式进行访问。一般情况下存储的数据并不是明文,而是会将它做一些编码或者加密。例如常见的 base64 就是一种编码方式。

明文:可以直接看懂的东西。

如下使用 base64 编码方式输出字符串 ‘majinjian’;

[root@master ~]# echo -n 'majinjian' | base64bWFqaW5qaWFu[root@master ~]# 

2. Secret 的使用

(1) 创建 Secret 加密数据

首先 vi secret.yaml 创建一个 Secret 加密数据(.yaml 文件),输入以下内容;

apiVersion: v1kind: Secretmetadata:   name: mysecrettype: Opaquedata:   username: cm9vdA==  password: cXdlcnR5dWlvcDE5OTkuLg==

如下:

在这里插入图片描述
创建成功后执行该 yaml 文件;

[root@master ~]# kubectl apply -f secret.yaml 

此时查看 secret,可以看到 mysecret 已创建成功;

在这里插入图片描述

(2) 将 Secret 以变量形式挂载到 pod 容器

vi secret-val.yaml 创建新的 yaml 文件 secret-val.yaml;

apiVersion: v1kind: Podmetadata:  name: mypodspec:  containers:  - name: nginx    image: nginx    env:      - name: SECRET_USERNAME valueFrom:   secretKeyRef:     name: mysecret     key: username      - name: SECRET_PASSWORD valueFrom:   secretKeyRef:     name: mysecret     key: password

其中:‘valueFrom’ 代表以变量形式挂载,挂载点就是我们上一步创建的 mysecret;

在这里插入图片描述
创建成功后执行该 yaml 文件;

[root@master ~]# kubectl apply -f secret-val.yaml 

此时查看节点中的 pod,等待 mypod 运行(为 running 状态即可);

在这里插入图片描述
最后进入容器查看变量是否有没有我们挂载的值;

[root@master ~]# kubectl exec -it mypod bash

使用 echo $变量名(如echo $SECRET_USERNAME)即可查看我们存储的变量值。

二、配置抽象 ConfigMap

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时 Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 会将环境配置信息和容器镜像分开来,便于应用配置的修改。但是 ConfigMap 并不提供保密或者加密功能。

1. 认识 ConfigMap

ConfigMap 类似于 Secret,区别在于 Secret 储存加密数据,而 ConfigMap 存储的是 不加密数据,而且存储过程也与 Secret 基本相同。

2. ConfigMap 的使用

提示:为了便于区分操作前先删除之前创建的 secret 和容器。

[root@master ~]# kubectl delete secret --all[root@master ~]# kubectl delete Pod --all

(1) 创建配置文件

此处要创建的是 properties 文件 vi redis.properties,输入以下内容;

redis.host=127.0.0.1redis.port=6379redis.password=123456

(2) 创建 ConfigMap

[root@master ~]# kubectl create configmap redis-config --from-file=redis.properties configmap/redis-config created[root@master ~]# 

此时查看 configmap(cm为它的简称),已创建成功;

在这里插入图片描述

(3) 将 ConfigMap 以变量形式挂载到 pod 容器

vi myconfig.yaml 创建配置文件 myconfig.yaml 文件,输入以下内容;

apiVersion: v1kind: ConfigMapmetadata:  name: myconfig  namespace: defaultdata:  special.level: info  special.type: hello

创建成功后执行文件;

[root@master ~]# kubectl apply -f myconfig.yaml configmap/myconfig created

此时再次查看 ConfigMap,myconfig 也创建成功了;

在这里插入图片描述
vi config-var.yaml 创建挂载文件 config-var.yaml 文件,输入以下内容;

apiVersion: v1kind: Podmetadata:  name: mypodspec:  containers:    - name: busybox      image: busybox      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]      env: - name: LEVEL   valueFrom:     configMapKeyRef:name: myconfigkey: special.level - name: TYPE   valueFrom:     configMapKeyRef:name: myconfigkey: special.type  restartPolicy: Never

创建成功后执行文件;

[root@master ~]# kubectl apply -f config-var.yaml pod/mypod created

最受通过日志查看容器,可打印出 ‘info hello’,挂载完成;

[root@master ~]# kubectl logs mypod[root@master ~]# info hello

许愿下载