第六章 配置 ConfigMap & Secret
- ConfigMap
- Secret
1 ConfigMap
1.1 定义
ConfigMap 是 Kubernetes 中的一种 API 对象,用于存储非机密的配置数据,采用键值对的形式。它允许你将配置与容器化应用程序分离,使应用程序更加便携。使用时, Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
1.2 用途
- 存储应用程序配置:例如数据库连接字符串、API 密钥等。
- 存储环境变量:可以将环境变量传递给 Pod。
- 存储配置文件:可以将配置文件内容直接存储在 ConfigMap 中。
1.3 优点
- 配置与代码解耦
- 支持多种数据格式,包括命令行,环境变量,文件等
- 动态更新配置
- 易于版本控制
- 支持配置重用,同一份配置可以被多个pod使用
- 使用 Helm 等工具,可以将 ConfigMap 模板化和参数化,从而更方便地管理不同环境(如开发、测试、生产)下的配置
- 方便动态查看配置,方便调试与排错
1.4 操作 ConfigMap
# 查看 ConfigMap
$ kubectl get cm
# 查看特定ConfigMap的详细信息
$ kubectl get cm my-config(config的名称) -o yaml
# 查看 ConfigMap 的键值对
$ kubectl describe cm my-config(config的名称)
# 删除 ConfigMap
$ kubectl delete cm my-config(config的名称)
1.5 创建 ConfigMap
1.5.1 通过文件创建
database.url=jdbc:mysql://db.example.com:3306/mydatabase
database.user=root
database.password=secret
创建
$ kubectl create cm my-config --from-file=config.properties
1.5.2 通过命令行参数创建
$ kubectl create cm my-config --from-literal=database.url=jdbc:mysql://db.example.com:3306/mydatabase --from-literal=database.user=root --from-literal=database.password=secret
1.5.3 通过yaml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
database.url: "jdbc:mysql://db.example.com:3306/mydatabase"
database.user: "root"
database.password: "secret"
创建
$ kubectl apply -f configmap.yaml
1.5.4 通过目录创建ConfigMap
假设有一个目录 config-dir
,其中包含多个配置文件:
app.properties
database.properties
logging.properties
创建
$ kubectl create configmap my-config --from-file=config-dir/
1.6 使用 ConfigMap
先通过上述案例选一种方式先创建出ConfigMap
1.6.1 环境变量中使用
apiVersion: v1
kind: Pod
metadata:
name: my-pod-env
spec:
containers:
- name: my-container
image: busybox
command: [ "/bin/sh", "-c", "env; sleep 3600" ]
envFrom:
- configMapRef:
name: my-config
创建并验证
# 验证
$ kubectl logs my-pod-env
1.6.2 通过挂载文件使用
apiVersion: v1
kind: Pod
metadata:
name: my-pod-volume
spec:
containers:
- name: my-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: my-config
创建并验证
# 进入容器
$ kubectl exec -it my-pod-volume -- sh
# 进入挂载目录查看
$ cd etc/config/
# 查看配置
$ cat database.url
jdbc:mysql://db.example.com:3306/mydatabase/etc/config
2 Secret
2.1 定义
Secret 是一种 API 对象,用于存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。Secret 可以在 Pod 中作为环境变量或文件挂载使用,类似于 ConfigMap,但具有更高的安全性。ConfigMap有的优点Secret也有,本质上两者是一致的。区别在于一个用于存储和管理非敏感信息,一个用于存储和管理敏感信息。
2.2 操作 Secret
# 查看 Secret
$ kubectl get secret
# 查看特定 Secret 的详细信息
$
(secret 的名称) -o yaml
# 查看 Secret 的键值对
$ kubectl describe secret my-secret(secret 的名称)
# 查看 Secret 的键值对(解码后)
$ kubectl get secret my-secret -o jsonpath='{.data}' | jq -r 'to_entries|map("\(.key)=\(.value|@base64d)")|.[]'
# 删除 Secret
$ kubectl delete secret my-secret(secret 的名称)
2.3 创建 Secret
2.3.1 通过命令行
$ kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypassword
2.3.2 通过yaml文件创建
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: bXl1c2Vy # 要使用base64编码后的
password: bXlwYXNzd29yZA==
2.3.3 通过文件创建
$ echo -n root >./username
$ echo -n 123456 > ./password
$ kubectl create secret generic my-secret --from-file=./username --from-file=./password
2.4 使用Secret
2.4.1 作为环境变量使用
apiVersion: v1
kind: Pod
metadata:
name: my-pod-env-secret
spec:
containers:
- name: my-container
image: busybox
command: [ "/bin/sh", "-c", "echo $USERNAME; echo $PASSWORD; sleep 3600" ]
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
创建并验证
$ kubectl apply -f pod-env-secret.yaml
# 验证 输出配置值
$ kubectl logs my-pod-env-secret
2.4.2 使用文件挂载
apiVersion: v1
kind: Pod
metadata:
name: my-pod-volume-secret
spec:
containers:
- name: my-container
image: busybox
command: [ "/bin/sh", "-c", "sleep 3600" ]
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-secret
创建并验证
# 进入容器
$ kubectl exec -it my-pod-volume-secret -- sh
# 进入挂载目录查看
$ cd etc/secret
# 查看配置
$ cat username | cat password