困境: 部署多个应用和数据库容器对,使用相同的Docker映像和代码,但具有不同的配置(不同的客户使用子域)。
有哪些逻辑方法可以解决这个问题,因为Kubernetes似乎没有集成支持这种设置的方法?
可能的方法:
然而在kubernetes中,该功能不可用。
- 为所有应用部署使用单个应用程序服务,为所有数据库部署使用单个数据库服务。运行一个单一的Nginx静态文件服务和部署,它将从共享的静态卷中提供静态文件(所有部署都使用相同的静态文件集)。每当需要新部署时,使用bash脚本复制app和database .yaml部署文件并sed文本替换客户端名称,并指向正确的configmap(手动编写),然后kubectl apply它们。主要的nginx入口将处理传入的流量并通过应用程序部署服务指向正确的pod。
- 与上述方法类似,只是使用StatefulSet而不是单独的部署,并使用init容器将不同的配置复制到挂载的卷中(唯一的缺点是如果您不再需要特定客户端的容器,则无法删除状态集中的项目,因为它会是一个案例,这似乎是一种非常欺骗性的方法)。
理想情况下,如果StatefulSet可以使用downward API根据状态集的索引动态选择configmap名称,那么将解决此问题(您基本上会手动制作带有索引名称的配置文件,然后会被适当地选择)。例如:
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: $(POD_NAME)-config
然而在kubernetes中,该功能不可用。