ConfigMap 数据(yml 格式) - Kubernetes
Posted
技术标签:
【中文标题】ConfigMap 数据(yml 格式) - Kubernetes【英文标题】:ConfigMap data (yml format) - Kubernetes 【发布时间】:2019-11-13 04:29:24 【问题描述】:我有一个 application.yml (Spring) 文件,它有近 70 个字段,想将这些字段移动到 ConfigMap。 在设置 ConfigMap 的过程中,已经实现了 70 个字段全部扁平化示例:webservice.endpoint.transferfund 将所有 70 个字段转换为平面将是一项痛苦的任务,有没有其他选择。
请提出建议。
下面的配置正在运行:
apiVersion: v1
kind: ConfigMap
metadata:
name: configmapname
namespace: default
data:
webservice.endpoint.transferfund: http://www.customer-service.app/api/tf
webservice.endpoint.getbalance: http://www.customer-service.app/api/balance
webservice.endpoint.customerinfo: http://www.customer-service.app/api/customerinfo
下面的配置不行,用yml格式试了一下。
apiVersion: v1
kind: ConfigMap
metadata:
name: configmapname
namespace: default
data:
application.yaml: |-
webservice:
endpoint:
transferfund: http://www.customer-service.app/api/tf
getbalance: http://www.customer-service.app/api/balance
customerinfo: http://www.customer-service.app/api/customerinfo
在 src/main/resources/application.yml 中有以下字段来访问 ConfigMap 键:
webservice:
endpoint:
transferfund: $webservice.endpoint.transferfund
getbalance: $webservice.endpoint.getbalance
customerinfo: $webservice.endpoint.customerinfo
更新:
ConfigMap 说明:
C:\Users\deskktop>kubectl describe configmap configmapname
Name: configmapname
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
application.yaml:
----
webservice:
endpoint:
transferfund: http://www.customer-service.app/api/tf
getbalance: http://www.customer-service.app/api/balance
customerinfo: http://www.customer-service.app/api/customerinfo
Events: <none>
部署脚本:(如上图所示,configMapRef 名称作为 configmap 名称提供)
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: configmap-sample
spec:
replicas: 1
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: configmap-sample
spec:
containers:
- name: configmap-sample
image: <<image>>
ports:
- name: http-api
containerPort: 9000
envFrom:
- configMapRef:
name: configmapname
resources:
limits:
memory: 1Gi
requests:
memory: 768Mi
env:
- name: JVM_OPTS
value: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -Xms768M"
【问题讨论】:
“不工作”是什么意思? Config 映射是如何被使用的?您需要提供更多信息,例如kubectl describe configmap/configmapname
和使用它的 Pod 规范。如果您将 application.yml
引用为 ConfigMap 键,则 create from-file 选项应该可以工作。前面的示例无效(data
不采用任意 YAML 映射,只采用键/值)。
不工作我的意思是,如果我使用 ConfigMap 作为 yml 格式,或者即使我从文件创建 ConfigMap,ConfigMap 键值也不会注入到 Spring 应用程序中。用所需的详细信息更新了问题。让我知道你是否需要更多。我知道我错过了一些东西。却想不通。请帮忙。
要正确回答这个问题,我们还需要知道 application.yml
应该安装在 Pod 内的完整路径。您可以根据 Alex 的回答将配置挂载为文件,而不是 env 变量。如果您提供此信息,也许亚历克斯可以将他们的答案编辑得更具体。
【参考方案1】:
您提到过,您在 Spring 项目的上下文中使用 application.yaml。因此,如果您不关心使用 .yaml 还是 .property 配置文件,您可以只使用属性文件,因为 configMap 生成支持它们。它适用于 --from-env-file
标志:
kubectl create configmap configmapname --from-env-file application.properties
所以在您的部署文件中,您可以直接访问密钥:
...
env:
- KEYNAME
valueFrom:
configMapKeyRef:
name: configmapname
key: KeyInPropertiesFile
【讨论】:
【参考方案2】:ConfigMap 是一个配置设置字典。它由字符串的键值对组成。然后 Kubernetes 将这些值添加到您的容器中。
在你的情况下,你必须把它们弄平,因为 Kubernetes 不会理解它们。
您可以阅读有关Creating ConfigMap 的文档:
kubectl create configmap <map-name> <data-source>
其中是您要分配给 ConfigMap 的名称,并且是从中提取数据的目录、文件或文字值。
数据源对应ConfigMap中的一个键值对,其中
key = 您在命令行中提供的文件名或密钥,并且 value = 文件内容或您在命令行中提供的文字值。您可以使用
kubectl describe
或kubectl get
来检索有关 ConfigMap 的信息。
编辑
您可以从具有已定义键的文件创建 ConfigMap。
Define the key to use when creating a ConfigMap from a file
语法可能如下所示:
kubectl create configmap my_configmap --from-file=<my-key-name>=<path-to-file>
ConfigMap 可能如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2019-07-03T18:54:22Z
name: my_configmap
namespace: default
resourceVersion: "530"
selfLink: /api/v1/namespaces/default/configmaps/my_configmap
uid: 05f8da22-d671-11e5-8cd0-68f728db1985
data:
<my-key-name>: |
key=value
key=value
key=value
key=value
我也找到了Create Kubernetes ConfigMaps from configuration files。
功能
投影机可以:
获取原始文件并将它们填充到 ConfigMap 中 您的配置仓库中的 Glob 文件,并将它们全部填充到您的 configmap 中 从结构化数据中提取字段 (yaml/json) 通过提取一些字段并删除其他字段,从 yaml/json 源的子集创建新的结构化输出 在 JSON 和 YAML 之间来回转换(将 YAML 源转换为 JSON 输出等) 支持从源中提取对象+数组等复杂字段,而不仅仅是标量!
【讨论】:
我认为这将是一个更好的答案,如果它有一个文件名作为键的示例和一个 YAML 块标量及其示例 YAML 数据来说明,我可以赞成。在这方面,文档仍然令人困惑。 @AndyShinn,你是对的。我已经编辑了答案并发布了示例和更多信息。 如我原来的问题所示,目前我可以使用密钥并通过 transferfund 获得价值:$webservice.endpoint.transferfund,但是我如何使用这个密钥并获得价值?您需要将 ConfigMap 挂载为 Volume。否则内容将存在于环境变量中。我在这里发布的示例来自https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#add-configmap-data-to-a-volume
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
restartPolicy: Never
【讨论】:
Alex,感谢您的评论,我的问题是关于 ConfigMap - 'data' 字段,我怎样才能将所有 yml 文件内容保留在 'data' 字段下。 当您从文件中导入configmapname
时,您可以使用kubectl edit configmap/configmapname
查看格式。您的键是application.yaml
,值是YAML Block Scalar 中的数据。这在您的 kubectl describe configmap configmapname
输出中显示。以上是关于ConfigMap 数据(yml 格式) - Kubernetes的主要内容,如果未能解决你的问题,请参考以下文章
重新启动集群时出错:重新启动 kube-proxy:等待 kube-proxy 启动以进行 configmap 更新:等待条件超时