Secret 和 ConfigMap 是 Kubernetes 中用于存储敏感配置信息的两种对象类型。它们的主要区别在于数据的加密和用途。

Secret 对象用于存储敏感数据,如密码、API 密钥、证书等。Secret 对象中的数据会以加密的方式存储在 etcd 中,并且只能以 base64 编码的形式在 Pod 中使用。Secret 对象可以用于在容器中安全地传递敏感信息。

ConfigMap 对象用于存储非敏感的配置数据,如环境变量、配置文件等。ConfigMap 对象中的数据以明文形式存储在 etcd 中,并且可以直接在 Pod 中使用。ConfigMap 对象可以用于在容器中传递配置信息,例如设置环境变量或者挂载配置文件。

总结一下 Secret 和 ConfigMap 的区别:

  1. 数据加密:Secret 对象中的数据会以加密的方式存储在 etcd 中,而 ConfigMap 对象中的数据以明文形式存储在 etcd 中。

  2. 用途:Secret 对象用于存储敏感数据,如密码、API 密钥、证书等;ConfigMap 对象用于存储非敏感的配置数据,如环境变量、配置文件等。

  3. 数据编码:Secret 对象的数据以 base64 编码的形式在 Pod 中使用,而 ConfigMap 对象的数据可以直接在 Pod 中使用。

在实际使用中,您可以根据数据的敏感性来选择使用 Secret 还是 ConfigMap。如果数据需要加密或者包含敏感信息,建议使用 Secret 对象。如果数据不敏感,并且只需要进行配置传递,可以使用 Config

Secret对象创建

Secret 对象是 Kubernetes 中的一种资源对象,用于存储和管理敏感的配置数据,如密码、API 密钥、证书等。Secret 对象会将这些敏感数据以加密的方式存储在 etcd 中,确保数据的安全性。

Secret 对象通常用于以下场景:

  1. 存储密码和凭证:可以将数据库密码、API 密钥、SSH 密钥等敏感信息存储在 Secret 对象中,然在 Pod 中引用这些 Secret 对象,以安全的方式访问相关资源。

  2. 存储证书和密钥:可以将 TLS 证书、私钥等安全相关的数据存储在 Secret 对象中,然后在需要使用这些证书和密钥的地方进行引,如 HTTPS 认证、TLS 加密等场景。

  3. 存储其他敏感数据:除了密码、凭证和证书,Secret 对象还可以用于存储其他敏感数据,如 OAuth 令牌、密钥文件等。

---
apiVersion: v1
kind: Secret
metadata:
  name: secret-test #自定义Secret名字
type: Opaque  #表示 Secret 的值是一个不透明的字节数组
data:  #可以设置多个键值对,比如user:root pass:world
  键: 值
  键: 值

为了保证信息的安全性,键值对的值通过base64进行加密,然后写入data内,当pod调用该secret时,会自动解密运用到自己的环境内

echo -n world| base64
d29ybGQK

metadata:
  name: secret-test
type: Opaque
data:
  username: YWRtaW4K
  password: YXNk
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
  nodeName: node1
  containers:
  - name: mysql
    image: daocloud.io/library/mysql:5.7.5-m15
    env:
    - name: MYSQL_ROOT_PASSWORD  #内置mysql的root密码变量
      valueFrom:
        secretKeyRef:
          name: secret-test #调用secret
          key: password #调用secret的password键

使用该yaml文件会创建secret并且被mysql的pod调用,密码是自己设置的password的值

ConfigMap 对象是 Kubernetes 中的一种资源对象,用于存储配置数据。它允许将配置数据以键值对的形式存储在 Kubernetes 集群中,并且可以在容器中通过环境变量或挂载文件的方式使用这些配置数据。

ConfigMap 对象通常用于以下场景:

  1. 存储应用程序配置:可以将应用程序的配置信息,如数据库连接字符串、日志级别、调试标志等,存储在 ConfigMap 对象中。这样,在应用程序中可以通过读取环境变量或挂载配置文件的方式获取这些配置数据。

  2. 共享配置数据:多个应用程序可能共享一些相同的配置数据,如公共的 SSL 证书、代理配置等。通过将这些配置数据存储在 ConfigMap 对象中,可以方便地在不同的应用程序之间共享和复用。

  3. 动态配置更新:当配置数据发生变化时,可以直接更新 ConfigMap 对象中的数据,而无需重新启动应用程序。这样可以实现动态的配置更新,避免了重启应用程序的操作。

ConfigMap 对象可以通过命令行工具(如 kubectl)或配置文件进行创建和管理。它可以直接定义在 Pod 的配置文件中,也可以独立创建并与 Pod 进行关联。

注意

1>使用该 ConfigMap 挂载的 Env 不会同步更新

2>使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

而且必须是yaml文件的方式创建出来的ConfigMap才可以;不能使用subPath参数;

如果不使用subPath挂载,比如将键值对内容时nginx配置文件挂载到/etc/nginx目录,会导致整个nginx目录只剩下这个配置文件,但是不使用可以用热加载,实时更新配置文件,根据需求选择是否使用该参数

ConfigMap对象创建

kind: ConfigMap #对象
apiVersion: v1
metadata:
  name: test #自定义名字
  labels:
    app: map #键值对
data:
  server1.conf: |   #键值对,server1.conf是键,配置文件全部是值,注意缩进
    upstream ping1 {
      server 192.168.48.132:8082;
    }
    server {
      listen 80;
      server_name 8081.max.com;
      location / {
        proxy_pass http://ping1;
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
      }
    }

在同一个配置文件内创建一个pod引用该configmap对象的值,修改自己的配置文件

---
kind: Pod
apiVersion: v1
metadata:
  name: nginx-pod #容器名
  labels:
    app: nginx #标签
spec:
  containers:
    - name: nginx # 定义容器的名称
      image: daocloud.io/library/nginx:1.12.0-alpine #容器所使用的镜像
      ports:
        - containerPort: 80
      volumeMounts:
        - mountPath: /etc/nginx/conf.d #挂载到容器的这个目录
          name: nginx #自定义的挂载名字
  volumes:  #定义挂载引用的ConfigMap
    - name: nginx #定义Volume的名称
      configMap:  #指定该Volume使用ConfigMap类型
        name: test #调用的ConfigMap的名称
        items:
          - key: server1.conf  #ConfigMap中的key
            path: www.conf  #保存到Pod中的路径,自定义名称