为了账号安全,请及时绑定邮箱和手机立即绑定

K8s更改配置映射并更新应用程序日志级别

K8s更改配置映射并更新应用程序日志级别

Go
慕沐林林 2023-07-26 10:08:31
我想更改在 K8S 上运行的 Golang 应用程序的日志配置,我在本地尝试了以下代码,它按预期工作我正在使用 viper 来监视配置文件更改这是带有日志配置的配置图apiVersion: v1kind: ConfigMapdata:  config.yaml: 'log.level: error'metadata:  name: app-config  namespace: logger在部署 yaml 中我添加了以下内容...spec:  containers:    - name: gowebapp      image: mvd/myapp:0.0.3        - containerPort: 80      envFrom:        - configMapRef:            name: app-config这是代码package configurationimport (   "fmt"   "os"   "strings"   "github.com/fsnotify/fsnotify"   "github.com/sirupsen/logrus"   "github.com/spf13/viper")const (   varLogLevel     = "log.level"   varPathToConfig = "config.file")type Configuration struct {   v *viper.Viper}func New() *Configuration {   c := Configuration{      v: viper.New(),   }   c.v.SetDefault(varPathToConfig, "./config.yaml")   c.v.SetDefault(varLogLevel, "info")   c.v.AutomaticEnv()   c.v.SetConfigFile(c.GetPathToConfig())   err := c.v.ReadInConfig() // Find and read the config file   logrus.WithField("path", c.GetPathToConfig()).Warn("loading config")   if _, ok := err.(*os.PathError); ok {      logrus.Warnf("no config file '%s' not found. Using default values", c.GetPathToConfig())   } else if err != nil { // Handle other errors that occurred while reading the config file      panic(fmt.Errorf("fatal error while reading the config file: %s", err))   }   setLogLevel(c.GetLogLevel())   c.v.WatchConfig()   c.v.OnConfigChange(func(e fsnotify.Event) {      logrus.WithField("file", e.Name).Warn("Config file changed")      setLogLevel(c.GetLogLevel())   })   return &c}// GetLogLevel returns the log levelfunc (c *Configuration) GetLogLevel() string {   s := c.v.GetString(varLogLevel)   return s}现在,当我再次应用 yaml 文件并将值从 更改为error或warn等debug时,什么都没有改变……知道我在这里错过了什么吗?我在 K8S 仪表板中看到配置映射已分配给应用程序,当我更改值时,我看到环境已更改...
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

envFrom 从配置映射创建环境变量。没有任何文件发生变化。如果您执行到容器中,您可能会看到一个名为 config.yaml 或 CONFIG.YAML 或类似的环境变量(不知道它是否适用于点)。

如果将 config.yaml 作为文件挂载到 pod 中,效果可能会更好。

查看完整回答
反对 回复 2023-07-26
?
茅侃侃

TA贡献1842条经验 获得超21个赞

如果您使用卷挂载 ConfigMap,则每当您更新 ConfigMap 时,卷都会自动更新。

但是,如果使用环境变量挂载 ConfigMap,即使更新 ConfigMap,环境变量也不会在容器内更新。

如果您希望在容器内更新配置,我建议您:

  • 使用卷来挂载 ConfigMap。

  • 如果您使用环境变量来挂载 ConfigMap,则每次更新 ConfigMap 时都需要重新启动容器。


查看完整回答
反对 回复 2023-07-26
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

我知道 viper 可以帮助实时更改配置,而无需使用事件重新启动应用程序OnConfigChange,但是您是否尝试过在基本 ConfigMap 中设置日志级别,然后启动应用程序,只是为了确保这不是事件的OnConfigChange问题触发和您在 k8s 中的特定配置(而不是您测试它的本地环境)。

最后,您的本地测试环境(可以正常工作)和其他不可以正常工作的环境有什么区别?

是否有任何环境变量可能会在一个环境中对此产生不同的影响?


查看完整回答
反对 回复 2023-07-26
  • 3 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信