我有一个ASP。. NET Core Worker服务,它从appsettings.json
获取一些信息,如线程数,批处理大小等。这些设置只在启动时生效,不能在服务运行时更改。应用程序将在kubernetes集群中运行。
在生产环境中部署时更改这些设置的最佳实践是什么?我需要做的是,更改设置并重新启动服务。
我可以想出这些解决方案:
- 将
appsetttings.json
映射到卷,以便能够更改它,以便在容器重新启动时不会还原appsettings。- 我需要移动
appsettings.json
文件到另一个文件夹然后根?是否存在不将正在运行的应用程序映射到卷的问题?
- 我需要移动
- 更新容器环境变量以覆盖设置。
- 当容器重新启动时,这些设置会恢复吗?)
还有别的主意吗?
如果您的应用程序可以使用配置文件和环境变量进行配置,那么我的经验是使用环境变量更容易。这有几个方面:
-
您可以直接在部署规范中包含环境变量
env: - name: SOME_CONFIG_SETTING value: its value
对于配置文件,您需要创建一个单独的ConfigMap对象,将其添加到每个pod卷中,并将卷挂载到容器中。这是常规的并且有充分的文档记录,但是比仅仅设置一个环境变量要困难。
-
如果您使用Helm来部署应用程序,那么在部署时替换配置值是非常容易的
- name: SOME_CONFIG_SETTING value: {{ .Values.someConfigSetting | default "its value" }}
-
如果你在部署规范中改变了环境变量的值,这个改变足以自动删除并重新创建运行容器的pod;也就是说,您将获得自动重启。如果配置设置在ConfigMap中,没有一些Helm hack,那么当配置更改时,您将需要手动重新启动部署。
您不应该在这里使用kubectl exec
,也不应该尝试手动重新启动在容器内运行的进程。如果一个pod是由部署管理的,kubectl delete pod deployment-name-12345-abcde
将导致它立即被重新创建,从而有效地重新启动该服务的副本。
在Kubernetes中,建议使用configmap api
对非机密数据进行此类配置设置。https://kubernetes.io/docs/concepts/configuration/configmap/
这为您提供了1 MB,对于典型的appsettings文件来说应该没问题。
我们建议使用yaml格式,而不是json,一个例子可以从链接:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-settings
data:
MyKey: "my-value"
MySecondKey: "my other value"
# file-like keys, completely optional naming
# the app.properties and the operation.properties are just examples
app.properties: |
obj.property=value1, value2
obj2.property-with-dash=value 3
operation.properties: |
obj3.property=value3, value1
obj4=value4, value 5
根据应用程序json的内容,您可以将其存储在ConfigMap或Secret中,然后将其挂载到pod中。
ConfigMap和Secret都存储在Kubernetes API中,并且总是挂载到只读的pod中。请阅读提供的链接,了解如何在您的pod中创建和挂载它们。
因为Kubernetes创建了一个指向settings文件的符号链接引用。因此,文件的修改日期不会更新,因此。net核心文件提供程序不会检测到更改。只有符号链接的引用发生了变化。
这里有一个替代方案:https://github.com/fbeltrao/ConfigMapFileProvider