码字不易,戳下方名片,关注+星标
1. ConfigMap
1.1 用途
用于将非敏感配置数据存储为键值对,并可以动态地注入到容器中。这使得容器化应用程序的配置与代码分离,支持配置变更而无需重建镜像或重启服务。
1.2 主要特点
数据类型:ConfigMap 的数据存储在 Kubernetes 的 etcd 数据库中,数据为明文存储。 存储数据:可以存储多个键值对。
1.3 用途场景:
应用程序的配置文件。 环境变量配置。 命令行参数。
1.4 创建方法
1.4.1 使用 YAML 创建
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
# 配置内容以键值对形式存储
app.properties: |
app.name=App1
app.version=1.0.0
log_level: "INFO"
应用:
kubectl apply -f configmap.yaml
1.4.2 使用命令行创建
kubectl create configmap my-configmap2 --from-literal=log_level=ERROR --from-literal=app.name=App2
1.4.3 使用文件创建
在文件中需要提前创建键值对
kubectl create configmap my-configmap3 --from-file=app.properties
1.5 查看configmap
[root@k8s-master data]# kubectl get configmap
NAME DATA AGE
kube-root-ca.crt 1 32d
my-configmap 2 18s
my-configmap2 2 9s
my-configmap3 1 6s
[root@k8s-master data]# kubectl describe configmap my-configmap
Name: my-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
log_level:
----
INFO
app.properties:
----
app.name=App1
app.version=1.0.0
BinaryData
====
Events: <none>
如果 ConfigMap 中的值发生更改,Pod 中引用该值的应用程序会动态感知变化
1.6 使用 ConfigMap
1.6.1 作为环境变量:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
1.6.2 挂载为文件:
volumes:
- name: config-volume
configMap:
name: my-configmap2
containers:
- name: app-container
volumeMounts:
- name: config-volume
mountPath: /etc/config
1.7 动态更新 ConfigMap
如果 ConfigMap 更新了,Pod 中挂载的文件会动态更新,但 环境变量不会自动更新。
应用动态感知需要依赖重新加载挂载的文件,或者手动重启 Pod。
2 Secret
2.1 用途
用于存储和管理敏感信息(例如密码、密钥、证书等)。与 ConfigMap 类似,Secret 也可以将数据以环境变量或挂载文件的方式注入到 Pod 中。数据以加密的方式存储在 etcd 中(但不是完全安全,需额外保护)。
2.2 主要特点
数据类型:支持 Base64 编码的文本数据。 存储数据:也以键值对的形式存储。
2.3 用途场景:
数据库密码。 云服务认证密钥。 SSL/TLS 证书。
2.4 创建方法
2.4.1 使用 YAML 创建
默认情况下,Secret 的数据以 Base64 编码存储和传递。数据需要先用 Base64 编码:
echo -n "123456" | base64
编写yaml文件
apiVersion: v1
kind: Secret
metadata:
name: harbor-secret
type: Opaque
data:
username: YWRtaW4= # "admin" 的 Base64 编码
password: MTIzNDU2 # "123456" 的 Base64 编码
应用
kubectl apply -f my-secret1.yaml
2.4.2 使用命令行创建
kubectl create secret generic my-secret2 --from-literal=username=admin --from-literal=password=my-secret-password
2.4.3 从文件创建
需要提前文件 username.txt 和 password.txt,每个文件包含一个值:
kubectl create secret generic my-secret3 \
--from-file=username=username.txt \
--from-file=password=password.txt
2.5 查看Secret
kubectl get secret
kubectl describe secret my-secret
2.6 使用 Secret
2.6.1 作为环境变量:
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: my-secret1
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret1
key: password
2.6.2 挂载为文件:
volumes:
- name: secret-volume
secret:
secretName: my-secret2
containers:
- name: app-container
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
挂载后,username 和 password 会成为 /etc/secret/username 和 /etc/secret/password 两个文件。
2.7 Secret 的类型
Kubernetes 中的 Secret 可以有多种类型,常见的有:
Opaque:默认类型,用于一般数据存储。 kubernetes.io/dockerconfigjson:用于 Docker 镜像拉取密钥。 kubernetes.io/tls:用于存储 TLS 密钥和证书。
3. ConfigMap 与 Secret 的比较
特性 | ConfigMap | Secret |
---|---|---|
数据类型 | 非敏感配置 | 敏感信息 |
数据存储格式 | 明文 | Base64 编码(etcd 中加密存储) |
安全性 | 无需加密 | 提供一定程度的安全性 |
使用场景 | 应用的普通配置 | 密码、密钥等敏感信息 |
存储方式 | 键值对 | 键值对 |
4. 注意事项
(1)ConfigMap 与 Secret 的限制
数据总大小不得超过 1MB,适用于小型配置文件。 必须创建Pod之前创建,Pod才能引用它们 configMap和Secret受namespace限制,只有处于相同命名空间才能引用他们 无法用于静态Pod
(2)配置管理最佳实践
将 ConfigMap 和 Secret 配置文件放在版本控制中,敏感数据除外。 使用工具(如 Helm 或 Kustomize)管理 ConfigMap 和 Secret 的生成。
(3)提高 Secret 的安全性
启用 Kubernetes 的 加密静态数据 功能。 限制对 Secret 的访问权限。 欢迎转发,点亮下方“在看”图标让更多的人看到
END
往期推荐
1 | |
2 | |
3 |
4 | |
5 | |
6 |