ConfigMap
在 Kubernetes 中,ConfigMap 是一种用于存储非敏感信息的 Kubernetes 对象。它用于存储配置数据,如键值对、整个配置文件或 JSON 数据等。ConfigMap 通常用于容器镜像中的配置文件、命令行参数和环境变量等。
ConfigMap 可以通过三种方式进行配置数据的注入:
- 环境变量注入:将配置数据注入到 Pod 中的容器环境变量中。
- 配置文件注入:将配置数据注入到 Pod 中的容器文件系统中,容器可以读取这些文件。
- 命令行参数注入:将配置数据注入到容器的命令行参数中。
ConfigMap 的优点如下:
- 避免了硬编码,将配置数据与应用代码分离。
- 便于维护和更新,可以单独修改 ConfigMap 而不需要重新构建镜像。
- 可以通过多种方式注入配置数据,更加灵活。
- 可以通过 Kubernetes 的自动化机制对 ConfigMap 进行版本控制和回滚。
- 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 加密后的内容,但是在使用的时候会自动转为明文方便使用。