gpt4 book ai didi

configuration - 如何在 Kubernetes ConfigMap 中使用唯一值

转载 作者:行者123 更新时间:2023-12-02 11:36:03 25 4
gpt4 key购买 nike

问题

我有一个要部署在 DaemonSet 中的监控应用程序。在应用程序的配置中,指定了一个唯一的用户代理来将节点与其他节点分开。我为应用程序创建了一个 ConfigMap,但这仅适用于同步环境中的其他设置。

理想的解决方案?

我想指定一个唯一值,例如节点的主机名或另一个本地推断的值,以用作用户代理字符串。有没有办法可以从系统调用这些信息,Kubernetes 会用一个值(如主机名)填充所需的键?

这有意义吗,还是有更好的方法来做到这一点?我正在查看文档,但在任何地方都找不到这个特定问题的答案。

例如,这是我现在拥有的应用程序配置中的字符串,而不是我想要使用的字符串。
user_agent = "app-k8s-test"
但我更喜欢……
user_agent = $HOSTNAME
这样的事情可能吗?

最佳答案

您可以使用 init 容器从配置映射预处理配置模板。预处理步骤可以将局部变量注入(inject)到配置文件中。扩展的配置被写入 init 容器和主应用程序容器之间共享的 emptyDir。这是一个如何做到这一点的例子。

首先,为您想要扩展的任何字段制作一个带有占位符的配置映射。我用了sed以及要替换的临时名称。您也可以花哨并使用 jinja2 或任何您喜欢的东西。只需将所需的任何预处理器放入 init 容器镜像中即可。您可以为所需的配置文件使用任何文件格式。我只是在这里使用 TOML 来表明它不必是 YAML。我称它为“.tpl”,因为它还没有准备好使用:它有一个字符串,_HOSTNAME_ ,需要扩展。

$ cat config.toml.tpl 
[blah]
blah=_HOSTNAME_
otherkey=othervalue
$ kubectl create configmap cm --from-file=config.toml.tpl
configmap "cm" created

现在编写一个带有 init 容器的 pod,该容器将配置映射挂载到一个卷中,并将其扩展并写入另一个卷,与主容器共享:
$ cat personalized-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod-5
labels:
app: myapp
annotations:
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running and my config-map is && cat /etc/config/config.toml && sleep 3600']
volumeMounts:
- name: config-volume
mountPath: /etc/config
initContainers:
- name: expander
image: busybox
command: ['sh', '-c', 'cat /etc/config-templates/config.toml.tpl | sed "s/_HOSTNAME_/$MY_NODE_NAME/" > /etc/config/config.toml']
volumeMounts:
- name: config-tpl-volume
mountPath: /etc/config-templates
- name: config-volume
mountPath: /etc/config
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumes:
- name: config-tpl-volume
configMap:
name: cm
- name: config-volume
emptyDir:
$ kubctl create -f personalized-pod.yaml
$ sleep 10
$ kubectl logs myapp-pod
The app is running and my config-map is
[blah]
blah=gke-k0-default-pool-93916cec-p1p6
otherkey=othervalue

例如,我把它做成了一个裸 pod 。您可以将这种类型的 pod 嵌入到 DaemonSet 的 pod 模板中。

在这里, Downward API is used to set the MY_NODE_NAME Environment Variable ,因为节点名称在容器中不容易获得。

请注意,由于某种原因,您无法获得 spec.nodeName进入一个文件,只是一个环境变量。

如果您只需要 Env Var 中的主机名,那么您可以跳过 init 容器。

由于 Init Container 只运行一次,因此您不应更新 configMap 并期望它重新扩展。如果您需要更新,您可以执行以下两项操作之一:
  • 代替初始化容器,运行一个边车来监视配置映射卷并在它更改时重新扩展(或只是定期执行)。这要求主容器也知道如何监视配置文件更新。
  • 您可以在每次配置模板更改时创建一个新的配置映射,并编辑 daemonSet 以将其中一行更改为指向一个新的配置映射。
    然后进行滚动更新以使用新配置。
  • 关于configuration - 如何在 Kubernetes ConfigMap 中使用唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45150362/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com