的困境:部署多个应用程序和数据库容器对,具有相同的停靠映像和代码,但配置不同(不同的客户端使用子域)。
有什么合乎逻辑的方法来解决这个问题,因为库伯内特斯似乎没有支持这种设置的集成?
可能接近
理想情况下,如果一个StatefulSet可以使用向下的api动态地根据有状态集的索引来选择一个configmap名称,这将解决这个问题(在这里,您基本上可以使用名称中的索引手动生成配置文件,并且它将被适当地选择)。类似于:
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: $(POD_NAME)-config
然而,这种功能在kubernetes中是不可用的。
发布于 2020-01-23 10:43:46
像掌舵这样的模板引擎可以在这方面有所帮助。(我相信库斯托姆也能做到这一点,但我更熟悉Helm。)基本思想是,您有一个包含Kubernetes YAML文件的图表,但是可以使用模板语言( Go text/template
库)动态填充内容。
在这个设置中,通常需要Helm同时创建ConfigMap和匹配的部署;在设置中,您将分别为每个租户安装它(一个Helm发行版)。假设Nginx配置非常不同,您希望将它们存储在外部文件中;图表的核心部分包括
values.yaml (可覆盖配置,helm install --set nginxConfig=bar.conf
):
# nginxConfig specifies the name of the Nginx configuration
# file to embed.
nginxConfig: foo.conf
templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-config
data:
nginx.conf: |-
{{ .Files.Get .Values.nginxConfig | indent 4 }}
deployment.yaml
apiVersion: v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-nginx
spec:
...
volumes:
- name: nginx-config
configMap:
name: {{ .Release.Name }}-{{ .Chart.Name }}-config
{{ .Release.Name }}-{{ .Chart.Name }}
是一个典型的约定,它允许在同一个名称空间中安装图表的多个副本;第一部分是您给出的helm install
命令的名称,第二部分是图表本身的名称。您还可以直接指定ConfigMap内容,引用来自values.yaml
文件的其他.Values...
设置,使用ConfigMap作为环境变量而不是文件,等等。
https://stackoverflow.com/questions/59872398
复制相似问题