【问题标题】:Are Kubernete's ConfigMaps Writable?Kubernetes ConfigMaps 是可写的吗?
【发布时间】:2019-02-02 10:33:59
【问题描述】:

可以直接修改configMap挂载的文件吗?我们有一个应用程序读取 configMap 类型的配置文件,并且应用程序应该能够编辑该文件,并且如果 configMap 与其他 pod 共享并且当 pod 重新启动时,更改应该保持不变。

如果configMap 不是为了这个,那么我们应该在consul 上传递什么来保存配置?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    是的,配置映射是not intended to be writeable。如果您正在与 configmap 中的文件进行交互,那么您可以将文件放在可写卷和 mount the volume 中。或者,您可以按照您的建议使用 consul 之类的集中配置。鉴于应用程序正在动态写入此数据,您可以将其视为状态而不是配置。然后它可以存储在数据库中。另一种选择可能是分布式缓存 such as redis 或 hazelcast。

    【讨论】:

    • 有趣的是,我偶然发现了这个问题,因为 Redis 的哨兵实际上试图将运行时状态写入它的配置文件,但这不起作用。
    【解决方案2】:

    AFAIK 对 ConfigMap 的更改将仅存在于本地内存中。
    也就是说,更改对其他 pod 不可见,并且在 pod 重新启动时,更改将丢失。

    一种解决方案是使用配置应用程序中的kubectl 二进制文件或kubernetes API 在配置更改后重新创建ConfigMap

    例如kubectl apply -f /path/to/updated/config.yaml

    【讨论】:

    • 可能值得一提的是,这需要 ServiceAccount-RoleBinding-Role 舞蹈? (我只是这样做了,如果需要,我可以发布一个示例配置。)
    【解决方案3】:

    从 Kubernetes 文档,可以更新看到link

    当卷中已经使用的 ConfigMap 被更新时,预计的键最终也会被更新。 Kubelet 在每次定期同步时检查挂载的 ConfigMap 是否是新的。但是,它使用本地基于 ttl 的缓存来获取 ConfigMap 的当前值。这样一来,从 ConfigMap 更新到新的 key 投射到 pod 的总延迟可以达到 kubelet 同步周期 + kubelet 中 ConfigMaps 缓存的 ttl 时间。

    【讨论】:

    • 这是关于从 pod 外部更新 ConfigMap,作为 Kubernetes 命令。编写 ConfigMap 卷的文件(相当于 ConfigMap 键)是不可能的,但如果是这样,它不会在使用 ConfigMap 的其他 pod 之间更新等效文件。
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2020-05-14
    • 2018-11-21
    • 2018-08-02
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多