ConfigMap与Secret为K8s应用提供配置与敏感信息的管理能力,是配置分离原则在容器化环境中的实现。文章介绍ConfigMap与Secret的创建与消费方式、数据注入机制(环境变量/挂载卷)、Secret加密配置以及配置热更新方案及安全审计与版本管理配置实践方案。
需要学习ConfigMap/Secret配置管理,ConfigMap与Secret为K8s应用提供配置与敏感信息的管理能力,是配置分离原则在容器化环境中的实现。在云原生与微服务架构进阶 > Kubernetes核心与Operator开发方向上,ConfigMap/Secret配置管理为后续进阶内容提供必要前置支撑。
目录
可视化演示
展示ConfigMap与Secret配置管理:配置注入机制、消费方式(环境变量/挂载卷)、Secret加密与热更新,通过交互理解K8s配置分离原则。
本节配有交互动效(进入视口后自动加载,约 3KB)。
配置注入:分离原则 ConfigMap注入配置 Secret加密敏感信息 In 配置与代码分离
配置管理与应用镜像解耦的设计理念
在云原生架构中,十二要素应用方法论明确要求将配置与代码严格分离。传统应用部署方式将配置文件打包在镜像中,或通过环境变量硬编码在启动脚本里,导致每次环境切换都需要重新构建镜像。Kubernetes通过ConfigMap和Secret两种资源对象,将配置从容器镜像中剥离出来,实现了配置与镜像的解耦。
ConfigMap用于存储非敏感的配置数据,如应用配置文件、环境变量、命令行参数等。Secret用于存储敏感数据,如密码、令牌、密钥等。两者都通过键值对的形式组织数据,可以被Pod以环境变量或卷挂载的方式消费。这种设计使得同一份容器镜像可以在开发、测试、生产等不同环境中使用不同的配置,无需重新构建镜像。
配置解耦对CI/CD流程的提升是显著的。开发团队只需构建一次镜像,然后通过引用不同的ConfigMap和Secret实现多环境部署。运维团队可以独立管理配置变更,无需触碰应用代码仓库。这种分离也简化了配置审计和版本管理,因为配置变更可以通过Kubernetes的API Server进行完整的操作记录。
在实际生产中,配置解耦还带来了安全收益。敏感信息不再出现在代码仓库或CI日志中,而是通过Secret进行管理,配合RBAC权限控制,只有授权的服务账户才能读取特定的Secret。这大大降低了凭证泄露的风险,同时便于密钥轮换等安全运维操作。
import yaml # 传统方式:配置硬编码在代码中class AppConfig: DB_HOST = "10.0.1.100" # 生产环境地址,硬编码 DB_PORT = 3306 DB_USER = "appuser" DB_PASS = "s3cr3t" # 安全隐患! # 云原生方式:配置通过ConfigMap/Secret注入import osclass CloudNativeConfig: DB_HOST = os.environ.get("DB_HOST", "localhost") DB_PORT = int(os.environ.get("DB_PORT", "3306")) DB_USER = os.environ.get("DB_USER", "default") DB_PASS = os.environ.get("DB_PASSWORD", "") # 从Secret注入
ConfigMap的创建方式与数据组织格式
ConfigMap支持四种创建方式:从字面量创建、从文件创建、从目录创建、从环境文件创建。从字面量创建使用 --from-literal 参数,适合少量键值对配置。从文件创建使用 --from-file 参数,会将文件内容作为值,文件名作为键。从目录创建会递归读取目录下所有文件。从环境文件创建使用 --from-env-file 参数,按照 KEY=VALUE 格式解析文件内容。
ConfigMap的数据组织有两种字段:data字段用于存储文本数据(UTF-8编码),binaryData字段用于存储二进制数据(Base64编码)。每个ConfigMap的大小限制为1MB,这是受etcd单次请求大小限制所致。如果配置文件超过1MB,应考虑使用持久卷或对象存储服务来管理。
ConfigMap是命名空间级别的资源,不同命名空间中的ConfigMap相互隔离。通过设置immutable: true字段可以将ConfigMap标记为不可变,这样kubelet不再监视该ConfigMap的变更,减少了API Server的负载,适合稳定不变的配置。不可变ConfigMap在Kubernetes 1.21版本后进入稳定阶段。
在数据组织方面,ConfigMap的data字段中每个键对应一个值,值可以是简单的字符串也可以是多行的配置文件内容。例如一个键为app.properties的条目,其值可以是整个properties文件的内容。当通过卷挂载方式使用时,每个键会变成挂载目录下的一个文件,文件名就是键名,文件内容就是键对应的值。
# ConfigMap YAML 示例configmap_yaml = '''apiVersion: v1kind: ConfigMapmetadata: name: app-config namespace: production labels: app: myappimmutable: falsedata: # 简单键值对 LOG_LEVEL: "info" MAX_CONNECTIONS: "100" # 多行配置文件 application.yml: | server: port: 8080 spring: datasource: url: jdbc:mysql://db-svc:3306/appdb nginx.conf: | server { listen 80; location / { proxy_pass http://backend:8080; } }'''print(configmap_yaml)
ConfigMap的两种挂载方式:环境变量与卷挂载
ConfigMap提供了两种在Pod中消费数据的方式:环境变量注入和卷挂载。环境变量方式又分为两种:使用env.valueFrom引用单个键值对,使用envFrom将整个ConfigMap的所有键值对批量注入为环境变量。环境变量方式适用于少量配置项,且配置在Pod启动后不再变化的场景。
卷挂载方式将ConfigMap作为一个特殊的卷类型挂载到容器的指定路径。每个键变成该路径下的一个文件,文件内容就是键对应的值。卷挂载方式支持子路径(subPath)挂载单个键对应的文件,也支持设置defaultMode来控制文件权限。
两种方式的关键区别在于热更新支持。卷挂载方式下,当ConfigMap更新后,kubelet会在下一次周期性同步时自动更新挂载的文件内容(通常延迟约1分钟)。而环境变量方式在容器进程启动时就已固定,ConfigMap的更新不会影响已运行的Pod,需要重启Pod才能生效。这是选择挂载方式时需要重点考虑的因素。
在实际应用中,需要根据配置的消费方式选择挂载策略。如果应用通过读取配置文件来加载配置(如Spring Boot读取application.yml),且支持文件变更后重新加载,则卷挂载是更好的选择。如果应用仅在启动时读取环境变量(如很多Go和Python应用),则环境变量方式更简洁,但需要配合滚动更新来实现配置变更。
pod_yaml = '''apiVersion: v1kind: Podmetadata: name: config-demospec: containers: - name: app image: myapp:v1 # 方式1: 环境变量注入(不支持热更新) env: - name: LOG_LEVEL valueFrom: configMapKeyRef: name: app-config key: LOG_LEVEL # 方式1b: 批量环境变量注入 envFrom: - configMapRef: name: app-config # 方式2: 卷挂载(支持热更新) volumeMounts: - name: config-volume mountPath: /etc/config readOnly: true volumes: - name: config-volume configMap: name: app-config defaultMode: 0644'''print(pod_yaml)
Secret的类型体系与敏感数据编码机制
Kubernetes Secret提供了五种内置类型:Opaque(通用类型,可存储任意键值对)、kubernetes.io/dockerconfigjson(用于镜像仓库认证)、kubernetes.io/tls(用于TLS证书和私钥)、kubernetes.io/service-account-token(用于服务账户令牌)、kubernetes.io/basic-auth(用于基本认证凭证)。每种类型对应特定的数据结构和用途。
Secret中的数据默认使用Base64编码存储,而非加密。Base64是一种编码方式而非加密算法,任何人都可以无密钥解码。这意味着任何拥有Secret读取权限的用户都可以轻松获取明文数据。Secret的安全性主要依赖于Kubernetes的RBAC权限控制,限制谁可以读取Secret资源。
要实现真正的数据加密,需要配置etcd的EncryptionConfiguration。启用后,Secret数据在写入etcd之前会被加密,从etcd读取时自动解密。此外,还可以使用External Secrets Operator等工具,将Secret数据存储在外部密钥管理服务(如AWS KMS、HashiCorp Vault)中,仅在需要时动态拉取到Kubernetes集群。
Secret在节点上的存储方式也与ConfigMap不同。Secret默认使用tmpfs(内存文件系统)存储,而非磁盘,这意味着Secret数据不会写入节点的持久化存储,Pod删除后Secret数据即从内存中清除。这种设计进一步降低了敏感数据泄露的风险。相比之下,ConfigMap的数据可以缓存在节点的磁盘上。
import base64 # Secret数据的Base64编码演示# 注意:Base64是编码不是加密!original_data = "my-super-secret-password"encoded = base64.b64encode(original_data.encode()).decode()decoded = base64.b64decode(encoded).decode() print(f"原始数据: {original_data}")print(f"Base64编码: {encoded}") # bXktc3VwZXItc2VjcmV0LXBhc3N3b3Jkprint(f"Base64解码: {decoded}") # 无需密钥即可解码 # Secret YAML 示例secret_yaml = '''apiVersion: v1kind: Secretmetadata: name: db-credentialstype: Opaquedata: username: YWRtaW4= # base64(admin) password: czNjcjN0UA== # base64(s3cr3tP)'''print(secret_yaml)
Secret的创建使用与镜像拉取认证实践
创建Secret可以使用kubectl create secret命令的四种子命令:docker-registry用于创建镜像仓库认证Secret,tls用于创建TLS证书Secret,generic用于创建通用Opaque类型Secret。也可以通过YAML文件直接定义Secret资源对象,但需要提前对数据做Base64编码。
镜像拉取认证是Secret最常见的使用场景之一。当需要从私有镜像仓库(如Docker Hub私有仓库、Harbor、AWS ECR等)拉取镜像时,需要创建docker-registry类型的Secret,并在Pod定义中通过imagePullSecrets字段引用。也可以将Secret关联到ServiceAccount,使该命名空间下所有使用该ServiceAccount的Pod自动获得镜像拉取凭证。
Secret同样支持环境变量注入和卷挂载两种消费方式。通过环境变量注入Secret数据时需要注意,环境变量可能通过进程的/proc/PID/environ文件或崩溃日志泄露,因此对于特别敏感的数据,建议使用卷挂载方式,并配合securityContext设置文件权限。
在实际生产中,建议使用外部密钥管理工具(如External Secrets Operator)来管理Secret的生命周期。这些工具可以将Secret数据存储在HashiCorp Vault、AWS Secrets Manager等专业密钥管理服务中,然后自动同步到Kubernetes Secret中。这既保证了密钥的安全存储,又便于密钥的自动轮换和审计。
# 镜像拉取Secret创建与使用示例commands = '''# 1. 创建docker-registry类型的Secretkubectl create secret docker-registry regcred \ --docker-server=registry.example.com \ --docker-username=admin \ --docker-password=s3cr3t \ --docker-email=admin@example.com # 2. 在Pod中使用imagePullSecrets# pod-with-secret.yaml''' pod_yaml = '''apiVersion: v1kind: Podmetadata: name: private-appspec: containers: - name: app image: registry.example.com/myapp:v1 imagePullSecrets: - name: regcred'''print(commands)print(pod_yaml)
ConfigMap与Secret的更新策略与热加载机制
ConfigMap和Secret的更新方式包括直接kubectl edit、kubectl apply替换YAML文件、kubectl patch局部更新等。更新后,通过卷挂载方式消费的Pod会自动感知变更,kubelet在周期性同步(默认约1分钟)时更新挂载的文件内容。但通过环境变量方式消费的Pod不会自动更新,需要删除重建Pod才能让新配置生效。
卷挂载方式的热更新存在一定延迟。kubelet通过API Server的Watch机制感知ConfigMap变更,然后在下一次周期性同步时更新节点上的文件。这个延迟通常在几秒到一分钟之间。如果应用需要立即感知配置变更,可以使用Reloader等工具监听ConfigMap/Secret变更并自动触发关联Deployment的滚动更新。
对于不可变ConfigMap和Secret(immutable: true),更新操作需要先删除原对象再创建新对象。虽然操作不够方便,但不可变配置减少了API Server的监视负载,适合稳定不变的配置。在Kubernetes 1.21及以后版本中,不可变Secret和ConfigMap已进入稳定阶段。
在配置更新策略上,推荐采用版本化命名的方式管理ConfigMap和Secret。例如使用app-config-v1、app-config-v2等命名,每次配置变更创建新版本而非直接修改原有对象。这样可以通过Deployment的滚动更新确保所有Pod使用一致的配置版本,避免部分Pod使用旧配置、部分使用新配置的不一致状态。同时,版本化命名也便于配置回滚。
# 配置更新策略对比update_strategies = { "env_var": { "method": "环境变量注入", "hot_reload": False, "update_delay": "需重建Pod", "use_case": "启动时固定配置" }, "volume_mount": { "method": "卷挂载", "hot_reload": True, "update_delay": "约1分钟", "use_case": "运行时可重载配置" }, "immutable": { "method": "不可变配置", "hot_reload": False, "update_delay": "需删除重建", "use_case": "稳定不变的配置" }} for name, strategy in update_strategies.items(): print(f"策略: {strategy['method']}") print(f" 热更新: {strategy['hot_reload']}") print(f" 更新延迟: {strategy['update_delay']}") print(f" 适用场景: {strategy['use_case']}") print()
生产环境配置管理最佳实践
在生产环境中,配置管理需要遵循以下最佳实践:首先,严格区分ConfigMap和Secret的使用边界,任何敏感数据(密码、密钥、令牌)必须使用Secret管理,绝不能放入ConfigMap。其次,为不同环境使用不同的命名空间或不同的ConfigMap/Secret实例,避免配置混淆。
配置版本化管理是另一个关键实践。将ConfigMap和Secret的YAML定义纳入Git仓库管理,通过GitOps工作流(如Argo CD、Flux)实现配置的自动化部署和审计。这样每次配置变更都有完整的提交记录,便于追溯和回滚。同时,使用Kustomize等工具可以为不同环境生成不同的配置覆盖层。
对于大型集群,建议使用不可变ConfigMap来减少API Server的负载。对于频繁变更的配置,可以考虑使用版本化命名配合滚动更新的策略。此外,应该为ConfigMap和Secret设置资源配额和LimitRange,防止单个命名空间中配置资源过多影响集群稳定性。
安全方面,应该为Secret配置严格的RBAC策略,仅允许特定的ServiceAccount和用户读取特定的Secret。建议启用etcd加密存储,并定期轮换敏感凭证。对于合规性要求高的场景,使用External Secrets Operator与专业密钥管理服务集成是最佳选择,它提供了自动轮换、访问审计和密钥生命周期管理等企业级功能。
# Kustomize 多环境配置管理示例kustomize_structure = '''base/ configmap.yaml # 基础配置 secret.yaml # 基础Secret deployment.yaml kustomization.yamloverlays/ dev/ configmap-patch.yaml # 开发环境覆盖 kustomization.yaml staging/ configmap-patch.yaml # 预发环境覆盖 kustomization.yaml prod/ configmap-patch.yaml # 生产环境覆盖 kustomization.yaml'''print(kustomize_structure)print()print("# 部署到不同环境:")print("kubectl apply -k overlays/dev")print("kubectl apply -k overlays/staging")print("kubectl apply -k overlays/prod")
AI 应用场景
AI推理服务的模型配置与环境差异化管理
阶段:模型部署与在线推理
解决的问题:AI模型推理服务在不同环境需要不同的模型路径、推理超时参数、批处理大小和日志级别,传统方式需为每个环境构建独立镜像,导致镜像管理混乱和部署效率低下。
具体案例:某NLP模型推理服务使用同一份镜像部署到三个Kubernetes集群。开发环境ConfigMap配置了debug日志级别、单条推理超时5秒和批处理大小1,方便调试。预发环境ConfigMap配置info日志级别、超时3秒和批处理大小8,模拟生产负载。生产环境ConfigMap配置warn日志级别、超时2秒和批处理大小16,追求最大吞吐。模型权重文件路径和API密钥通过Secret管理,不同环境使用不同的Secret实例。当需要调整生产环境推理超时参数时,运维人员只需更新生产环境ConfigMap,通过卷挂载方式自动同步到Pod,无需重新构建镜像或重启服务。
AI训练任务的超参数配置管理
阶段:模型训练
解决的问题:AI模型训练涉及大量超参数(学习率、批次大小、优化器参数等),不同实验需要不同超参数组合,同时训练数据集的访问凭证和云存储密钥需要安全管理。
具体案例:某计算机视觉团队使用Kubernetes Job运行分布式训练,将训练超参数(学习率0.001、权重衰减0.0001、批次大小64、训练轮数100)存储在ConfigMap中,将云存储访问密钥(AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)存储在Secret中。训练Pod启动时通过环境变量方式注入ConfigMap和Secret中的配置。团队可以快速创建多个ConfigMap副本并行运行不同超参数组合的训练实验,每个实验使用相同的训练镜像但不同的ConfigMap配置,训练完成后通过对比实验结果快速确定最佳超参数组合,同时Secret中的云存储密钥得到安全保护。
AI模型服务的灰度发布与模型版本配置管理
阶段:模型部署与在线推理
解决的问题:AI模型服务需要同时运行多个模型版本进行灰度发布和A/B测试,每个模型版本有不同的模型文件路径、推理引擎配置和资源限制。
具体案例:某推荐系统团队同时部署了三个模型版本(v2.1稳定版、v2.2候选版、v3.0实验版),每个版本的模型文件路径、TensorRT引擎优化参数、batch_size和推理超时配置各不相同。团队为每个模型版本创建独立的ConfigMap和Secret,通过Deployment的滚动更新策略切换Pod引用的ConfigMap。当v2.2候选版需要从5%流量升级到50%时,只需修改对应Service的路由规则,同时更新ConfigMap中的推理参数,新启动的Pod自动加载新配置。整个过程中敏感信息如模型API密钥通过Secret管理,避免了配置泄露风险。
Python 演示
import base64import jsonimport osimport yamlfrom kubernetes import client, config # 模拟Kubernetes ConfigMap/Secret管理工具 class ConfigManager: """Kubernetes配置管理器:封装ConfigMap和Secret的常见操作""" def __init__(self, namespace="default"): config.load_kube_config() self.namespace = namespace self.core_v1 = client.CoreV1Api() def create_configmap(self, name, data): """创建ConfigMap""" cm = client.V1ConfigMap( metadata=client.V1ObjectMeta(name=name), data=data ) self.core_v1.create_namespaced_config_map(self.namespace, cm) print(f"ConfigMap '{name}' created") def create_secret(self, name, data, secret_type="Opaque"): """创建Secret(自动Base64编码)""" encoded = {k: base64.b64encode(v.encode()).decode() for k, v in data.items()} secret = client.V1Secret( metadata=client.V1ObjectMeta(name=name), data=encoded, type=secret_type ) self.core_v1.create_namespaced_secret(self.namespace, secret) print(f"Secret '{name}' created") def get_configmap(self, name): """获取ConfigMap内容""" cm = self.core_v1.read_namespaced_config_map(name, self.namespace) return cm.data def get_secret(self, name): """获取Secret内容(自动Base64解码)""" secret = self.core_v1.read_namespaced_secret(name, self.namespace) decoded = {k: base64.b64decode(v).decode() for k, v in secret.data.items()} return decoded def update_configmap(self, name, new_data): """更新ConfigMap(卷挂载方式约1分钟生效)""" cm = self.core_v1.read_namespaced_config_map(name, self.namespace) cm.data = new_data self.core_v1.patch_namespaced_config_map(name, self.namespace, cm) print(f"ConfigMap '{name}' updated") def list_configs(self): """列出命名空间下所有ConfigMap和Secret""" cms = self.core_v1.list_namespaced_config_map(self.namespace) secrets = self.core_v1.list_namespaced_secret(self.namespace) print(f"ConfigMaps: {[cm.metadata.name for cm in cms.items]}") print(f"Secrets: {[s.metadata.name for s in secrets.items]}") if False and __name__ == "__main__": mgr = ConfigManager(namespace="production") mgr.create_configmap("app-config", {"LOG_LEVEL": "info", "MAX_CONN": "100"}) mgr.create_secret("db-cred", {"user": "admin", "pass": "s3cr3t"})
config.load_kube_config()加载kubeconfig文件,建立与Kubernetes API Server的连接,默认读取~/.kube/configself.core_v1 = client.CoreV1Api()创建CoreV1 API客户端实例,ConfigMap和Secret属于核心API组的资源cm = client.V1ConfigMap(metadata=client.V1ObjectMeta(name=name), data=data)构造ConfigMap资源对象,metadata中设置名称,data字段存放键值对配置数据self.core_v1.create_namespaced_config_map(self.namespace, cm)调用API Server在指定命名空间创建ConfigMap资源encoded = {k: base64.b64encode(v.encode()).decode() for k, v in data.items()}对Secret数据进行Base64编码,Kubernetes要求Secret的data字段值必须是Base64编码字符串secret = client.V1Secret(metadata=client.V1ObjectMeta(name=name), data=encoded, type=secret_type)构造Secret资源对象,type字段指定Secret类型,默认为Opaque通用类型self.core_v1.create_namespaced_secret(self.namespace, secret)调用API Server在指定命名空间创建Secret资源cm = self.core_v1.read_namespaced_config_map(name, self.namespace)从API Server读取指定ConfigMap的完整内容decoded = {k: base64.b64decode(v).decode() for k, v in secret.data.items()}对Secret数据进行Base64解码,还原为明文内容,注意Base64解码无需密钥self.core_v1.patch_namespaced_config_map(name, self.namespace, cm)通过patch方式更新ConfigMap,卷挂载的Pod约1分钟后自动同步新配置cms = self.core_v1.list_namespaced_config_map(self.namespace)列出指定命名空间下所有ConfigMap资源,返回列表对象secrets = self.core_v1.list_namespaced_secret(self.namespace)列出指定命名空间下所有Secret资源,注意需要有list secrets的RBAC权限
常见问答
ConfigMap和Secret有什么本质区别?
ConfigMap更新后Pod会自动获取新配置吗?
Secret中的数据是加密的吗?
ConfigMap有大小限制吗?
如何实现ConfigMap的版本化管理?
常见误区
误区认为Secret的数据是安全的,因为它在Kubernetes中经过了加密处理
正解Secret中的数据默认只做了Base64编码,并非加密。任何拥有Secret get权限的用户都可以轻松解码Base64数据获取明文。真正的加密需要额外配置etcd的EncryptionConfiguration,或者使用External Secrets Operator等第三方工具与云厂商密钥管理服务集成。Secret的安全性主要依赖于RBAC权限控制,而非数据本身的编码方式。
为何常见:Secret这个名称本身就暗示了安全性,而Base64编码看起来像乱码,容易让人误以为数据已经加密。实际上Base64只是一种编码方式,不是加密算法,解码不需要任何密钥。
误区认为ConfigMap更新后,所有使用该ConfigMap的Pod都会立即自动更新配置
正解通过卷挂载方式使用ConfigMap的Pod,在ConfigMap更新后确实会自动同步更新文件内容,但存在一定的延迟时间(通常为几秒到几分钟),且同步机制依赖于kubelet的周期性同步。更关键的是,通过环境变量方式注入的ConfigMap在Pod整个生命周期内都不会更新,因为环境变量在进程启动时就已经固定。要让环境变量方式生效,需要删除并重新创建Pod。
为何常见:Kubernetes文档中提到的ConfigMap热更新能力让用户以为所有使用方式都支持自动更新,但实际上热更新仅适用于卷挂载方式,环境变量方式并不支持,这是初学者最容易踩的坑。
误区认为应该把所有配置都放在ConfigMap中,包括数据库密码和API密钥等敏感信息
正解ConfigMap中的数据以明文形式存储和传输,不适合存放任何敏感信息。数据库密码、API密钥、TLS私钥、服务账户令牌等敏感数据必须使用Secret资源管理。Secret默认使用tmpfs存储而非磁盘,支持更细粒度的访问控制,并且可以配置etcd加密。即使ConfigMap使用起来更方便,也绝不能将敏感信息放入ConfigMap。
为何常见:ConfigMap和Secret的使用方式非常相似(创建、挂载、引用),初学者容易用习惯了的ConfigMap方式处理所有配置,忽视了敏感数据的安全风险。尤其是在快速原型开发阶段,直接将密码写在ConfigMap中看似省事,但会在生产环境中埋下严重的安全隐患。
误区认为ConfigMap中的数据量没有限制,可以在其中存放大型配置文件
正解ConfigMap的设计目的是存放小型配置数据,单个ConfigMap的大小限制在1MB以内(etcd的默认请求大小限制)。如果需要存放大型配置文件,应该考虑使用持久卷(PV)或对象存储服务,而不是ConfigMap。此外,ConfigMap中的大量数据会被复制到每个使用它的Pod中,造成不必要的资源浪费和启动延迟。
为何常见:ConfigMap的名字中带有Map(映射),容易让人误以为它像普通的键值存储一样可以存放任意大小的数据。实际上Kubernetes对ConfigMap有明确的大小限制,因为ConfigMap数据最终会存储在etcd中,而etcd对单个请求的数据大小有限制。
参考来源
- docKubernetes官方文档 - ConfigMapKubernetes官方ConfigMap文档,详细介绍ConfigMap的创建、使用方式、数据组织格式和最佳实践
- docKubernetes官方文档 - SecretKubernetes官方Secret文档,涵盖Secret的类型体系、Base64编码机制、安全特性和使用方法
- docKubernetes官方文档 - Configure a Pod to Use a ConfigMapKubernetes官方教程,展示Pod消费ConfigMap数据的环境变量注入和卷挂载两种方式的完整配置示例
- docKubernetes官方文档 - Pull an Image from a Private RegistryKubernetes官方教程,介绍使用docker-registry类型Secret实现私有镜像仓库认证的完整流程
- docExternal Secrets Operator官方文档External Secrets Operator官方文档,介绍如何从外部密钥管理服务同步密钥到Kubernetes Secret,实现企业级密钥管理