Kubernetes的ConfigMap和Secret

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Kubernetes的ConfigMap和Secret

ConfigMap

在 Kubernetes 中,ConfigMap 是一种用于存储非敏感信息的 Kubernetes 对象。它用于存储配置数据,如键值对、整个配置文件或 JSON 数据等。ConfigMap 通常用于容器镜像中的配置文件、命令行参数和环境变量等。

ConfigMap 可以通过三种方式进行配置数据的注入:

  1. 环境变量注入:将配置数据注入到 Pod 中的容器环境变量中。
  2. 配置文件注入:将配置数据注入到 Pod 中的容器文件系统中,容器可以读取这些文件。
  3. 命令行参数注入:将配置数据注入到容器的命令行参数中。

ConfigMap 的优点如下:

  1. 避免了硬编码,将配置数据与应用代码分离。
  2. 便于维护和更新,可以单独修改 ConfigMap 而不需要重新构建镜像。
  3. 可以通过多种方式注入配置数据,更加灵活。
  4. 可以通过 Kubernetes 的自动化机制对 ConfigMap 进行版本控制和回滚。
  5. ConfigMap 可以被多个 Pod 共享,减少了配置数据的重复存储。

定义 ConfigMap

定义 ConfigMap 之前我们先了解一下 ConfigMap 的基本命令:

# 查看 configmap
kubectl get configmap/cm
# 查看详细
kubectl describe configmap/cm my-config
# 删除 cm
kubectl delete configmap/cm my-config

K8s 提供了多种方式定义 ConfigMap,分别为以下形式:

命令行创建
kubectl create configmap my-config --from-literal=name=xw --from-literal=age=23
通过配置文件创建

要求值必须是字符串。

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  name: "xw"
  age: "23"
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.yml: |
    name: "xw"
    age: "23"

然后使用 kubectl apply -f 命令来创建 ConfigMap。

通过文件创建
echo -n admin >./username
echo -n 123456 > ./password
kubectl create configmap myconfigmap --from-file=./username --from-file=./password
通过文件夹创建

可以将多个配置文件放在同一个文件夹下,然后使用 kubectl create configmap 命令来创建 configmap,例如:

kubectl create configmap my-config --from-file=config-files/

这将创建一个名为 my-config 的 configmap,其中包含 config-files/ 文件夹下所有的文件内容作为键值对

通过环境变量创建

可以将环境变量(有键有值)的值转换为 configmap。例如,使用以下命令将当前环境变量的值转换为 configmap:

当前目录存在文件 env,内容如下:

name=xw
age=23
kubectl create configmap my-config --from-env-file=env

使用 ConfigMap

环境变量中使用
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: busybox
    command: ["/bin/sh", "-c", "echo $BUSY_NAME ; sleep 3600;"]
    env:
    - name: BUSY_NAME # 容器内的环境变量名称
      valueFrom:
        configMapKeyRef:          # 值来源于 configmap   
          name: my-config         # 来源于哪个 configmap
          key: name               # 来源于哪个 configmap 中 key
          
    # 一次性注入这个 configmap
    envFrom:
    - configMapRef:
        name: my-config

注意:env 是指定 configmap 中某个 key 进行注入,envForm 将 configmap 中内容全部注入。全部注入的时候,使用的时候使用 $ 的方式。

通过 Volume 使用配置
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp-container
      image: busybox
      command: ["/bin/sh","-c","sleep 3600"]
      volumeMounts:
        - name: data-volume
          mountPath: /data
  volumes:
    - name: data-volume
      configMap:
        name: application-cm

Secret

在 Kubernetes 中,Secret 是一种用于存储和管理敏感信息的对象类型,如密码、API密钥、证书等等。它们与 ConfigMap 相似,但在处理敏感信息时,Secret 会提供更高的安全性和保密性。

Secret 可以用于将这些敏感信息注入到容器中,并确保这些信息在运行时不会被意外泄漏或暴露给其他人。Secret 可以通过多种方式定义和使用,例如直接定义、从文件中加载、从环境变量中加载等。

在 Kubernetes 中,Secrets 通常被用于以下场景:

  • 作为卷挂载到 Pod 中,用于存储证书、密钥等敏感文件
  • 在 Pod 中使用环境变量,用于存储用户名和密码等敏感信息
  • 用于存储 Docker 镜像仓库的登录信息
  • 用于存储外部服务的 API 密钥

Secrets 可以在 Pod 的 spec 中通过 volume 和环境变量的方式引用。当容器使用 volume 来引用 Secret 时,Secret 会以文件的形式挂载到容器中。当容器使用环境变量来引用 Secret 时,Secret 中的数据会以 base64 编码后,以键值对的形式注入到容器的环境变量中。

需要注意的是,Secret 并不提供强大的安全保证,只是简单地将数据存储在 base64 编码的形式下,并不提供加密或其他安全措施,因此不要将高度敏感的信息存储在 Secret 中。在处理高度敏感的信息时,需要使用更高级别的保护机制,如使用加密数据的 Volume 类型,或者使用第三方加密解决方案等。

定义 Secret

定义 Secret 之前我们先了解一下 Secret 的基本命令:

# 查看 Secret
kubectl get secret
# 查看详细
kubectl describe secret my-secret
# 删除 cm
kubectl delete secret my-secret
命令行创建
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=admin123
通过配置文件创建
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4= # base64 编码后的用户名 admin
  password: MWYyZDFlMmU2N2Rm # base64 编码后的密码 1f2d1e2e67df

注意: 这个 YAML 文件定义了一个名为 my-secret 的 Secret 对象,其中包含了两个 base64 编码后的 key-value 对:username 和 password。

如何生成 base64 位编码,Linux 中可以使用 echo -n "加密内容" | base64

通过文件创建
echo -n admin >./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username --from-file=./password
通过环境变量创建

当前目录存在文件 env,内容如下:

name=xw
age=23
kubectl create secret generic  my-config --from-env-file=<(env)

使用 Secret

环境变量使用
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: myapp-container
      image: busybox
      command: ["/bin/sh","-c","sleep 3600"]
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
      # 一次性注入这个 secret
      envFrom:
        - secretRef:
            name: my-secret
  restartPolicy: Never
通过 Volume 使用配置
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp-container
      image: busybox
      command: ["/bin/sh","-c","sleep 3600"]
      volumeMounts:
        - name: secret-volume
          mountPath: /data
  volumes:
    - name: secret-volume
      secret:
        secretName: aaa

注意:定义 Secret 时使用的是 Base64 加密后的内容,但是在使用的时候会自动转为明文方便使用。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
运维 Kubernetes 容器
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
|
2月前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret
|
2月前
|
存储 Kubernetes 安全
在k8S中,Secret 有哪些使用方式?
在k8S中,Secret 有哪些使用方式?
|
2月前
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes(K8S) 配置管理-ConfigMap 介绍
Kubernetes(K8S) 配置管理-ConfigMap 介绍
37 1
|
2月前
|
Kubernetes 数据安全/隐私保护 容器
Kubernetes(K8S) 配置管理 Secret 介绍
Kubernetes(K8S) 配置管理 Secret 介绍
35 1
|
2月前
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
2月前
|
Prometheus Kubernetes 数据安全/隐私保护
使用kubeseal加密和管理k8s集群的secret
使用kubeseal加密和管理k8s集群的secret
49 2
|
2月前
|
Kubernetes 容器 Perl
在K8S中,请问harbor的secret创建能否直接创建资源清单?
在K8S中,请问harbor的secret创建能否直接创建资源清单?
|
2月前
|
存储 Kubernetes 安全
在k8S中,Kubernetes Secret 作用是什么?
在k8S中,Kubernetes Secret 作用是什么?
|
存储 Kubernetes 数据安全/隐私保护
kubernetes 中的 ConfigMap 和 Secret
为什么要有这俩玩意儿? 我们在kubernetes上部署应用的时候,经常会需要传一些配置给我们的应用,比如数据库地址啊,用户名密码啊之类的。我们要做到这个,有好多种方案,比如: 我们可以直接在打包镜像的时候写在应用配置文件里面,但是这种方式的坏处显而易见而且非常明显。
1502 0
下一篇
无影云桌面