Kubernetes 如何为多台主机生成唯一的配置文件?
我正在学习k8s,正在努力编写舵图,为我用来提升生态系统的应用程序生成配置文件。我遇到了一个有趣的问题,我需要生成对所有节点通用的配置,以及对每个节点唯一的配置。你知道我该怎么做吗 从my values.xml文件: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
# 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"
}
]
}
]
}