Kubernetes 如何为多台主机生成唯一的配置文件?

Kubernetes 如何为多台主机生成唯一的配置文件?,kubernetes,kubernetes-helm,go-templates,Kubernetes,Kubernetes Helm,Go Templates,我正在学习k8s,正在努力编写舵图,为我用来提升生态系统的应用程序生成配置文件。我遇到了一个有趣的问题,我需要生成对所有节点通用的配置,以及对每个节点唯一的配置。你知道我该怎么做吗 从my values.xml文件: # number of nodes / replicas nodeCount: 5 replicaCount: 3 跨所有节点的公共配置称为node_map.xml: <default> <no

我正在学习k8s,正在努力编写舵图,为我用来提升生态系统的应用程序生成配置文件。我遇到了一个有趣的问题,我需要生成对所有节点通用的配置,以及对每个节点唯一的配置。你知道我该怎么做吗

从my values.xml文件:

# number of nodes / replicas
nodeCount: 5
replicaCount: 3
跨所有节点的公共配置称为node_map.xml:

              <default>
                    <node>
                        <replica>
                            <host>wild-wallaby-0</host>
                            <port>8000</port>
                        </replica>
                        <replica>
                            <host>scary-rapids-1</host>
                            <port>8000</port>
                        </replica>
                    </node>
                    <node>
                        <replica>
                            <host>wild-wallaby-1</host>
                            <port>8000</port>
                        </replica>
                        <replica>
                            <host>scary-rapids-2</host>
                            <port>8000</port>
                        </replica>
                    </node>
                    <node>
                        <replica>
                            <host>wild-wallaby-2</host>
                            <port>8000</port>
                        </replica>
                        <replica>
                            <host>scary-rapids-0</host>
                            <port>8000</port>
                        </replica>
                    </node>
              </default>

野生袋鼠-0
8000
恐怖-急流-1
8000
野生小袋鼠-1
8000
可怕的急流2
8000
野生小袋鼠2
8000
恐怖-rapids-0
8000
上面的内容很容易生成,每个pod都可以使用这个配置文件,但现在每个pod还需要编写一个额外的配置文件,让该pod知道该实例是什么节点和副本,称为instance.xml。请注意,该文件不需要称为instance.xml。。。只要我知道start命令中包含的名称,我就可以灵活地指向并加载任何命名文件

例如

两个实例将在节点wild-wallaby-0、节点0副本1和节点0副本2上运行。每个实例都需要生成如下配置文件:

首先

    <!-- node 0 replica 1 instance.xml -->
    <id>
        <node>0</node>
        <replica>1</replica>
    </id>

0
1.
第二个例子

<!-- node 0 replica 2 instance.xml -->
    <id>
        <node>0</node>
        <replica>2</replica>
    </id>

0
2.
当然,这可以遵循一些基于我的值文件中定义的节点和副本数量的约定。虽然生成所有节点通用的文件很容易,但我不清楚如何从instance.xml文件的helm图表为每个节点生成自定义配置文件


有什么想法或建议吗

您可以将其部署为StatefulSet,并使用
initContainers:
在pod的主要任务真正启动之前创建配置文件

Kubernetes文档以复制的MySQL集群为中心,但具有相同的基本设置:有一个主节点和一些副本,每个副本都需要知道自己的ID,并且主节点和副本上的配置文件不同

看起来您可以使用的重要细节是pod的
主机名
(如shell命令中所示)是
statefulsetname-123
,其中数字是连续的,并且各个pod保证按顺序启动。中有相同的详细信息,您可以通过检索

我可能会创建一个ConfigMap,如:

version: v1
kind: ConfigMap
metadata:
  name: config-templates
data:
  config.xml.tmpl: >-
    <id>
      <node>NODE</node>
      <replica>REPLICA</replica>
    </id>
在该设置中,您要求Kubernetes创建一个在容器之间共享的空临时卷(
config
),并将配置映射作为卷提供。init容器提取顺序pod ID,将其拆分为两个数字,并将实际配置文件写入临时卷。然后,主容器将共享配置目录装载到它希望其配置文件所在的任何位置。

旨在通过StatefulSet解决这个问题。它允许您将专用的
configmap
secret
装载到状态集中的单个Pod

本质上,它在
PodSpec
模板上使用自定义注释,如:

      annotations:
        spoditor.io/mount-volume: |
          {
            "volumes": [
              {
                "name": "my-volume",
                "secret": {
                  "secretName": "my-secret"
                }
              }
            ],
            "containers": [
              {
                "name": "nginx",
                "volumeMounts": [
                  {
                    "name": "my-volume",
                    "mountPath": "/etc/secrets/my-volume"
                  }
                ]
              }
            ]
          }
现在,StatefulSet的每个Pod中的
nginx
容器将尝试以
my secret-{Pod ordinal}
的模式装载自己的专用机密

您只需确保
my-secret-0
my-secret-1
等存在于StatefulSet的相同命名空间中

在项目的文档中有更高级的注释用法

      annotations:
        spoditor.io/mount-volume: |
          {
            "volumes": [
              {
                "name": "my-volume",
                "secret": {
                  "secretName": "my-secret"
                }
              }
            ],
            "containers": [
              {
                "name": "nginx",
                "volumeMounts": [
                  {
                    "name": "my-volume",
                    "mountPath": "/etc/secrets/my-volume"
                  }
                ]
              }
            ]
          }