当前位置: 首页 > 工具软件 > Reloader > 使用案例 >

使用Reloader实现更新configmap后自动重启pod

洪开济
2023-12-01

推荐阅读

Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html

本文原文链接:https://blog.csdn.net/xzk9381/article/details/117462348,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

在我们日常使用 Kubernetes 的过程中,需要经常使用到 configmap 或者 secret 等资源来对容器内的程序进行配置。但是存在一个问题,如果对 configmap 或者 secret 进行了更新,Pod 内部是无法感知到的。如果业务自身支持 reload 操作,比如 nginx,那么我们可以使用 inotify 感知到文件更新或者直接定期 reload(可以配合 readinessProbe 一起使用)。但是如果业务不支持热加载配置,就需要使用到 Kubernetes 自身提供的滚动更新功能了。

由于更新 configmap 或 secret 不会触发 Pod 的滚动更新,所以需要引入一个开源工具 Reloader,它通过监控 Pod 引用的 configmap 或 secret 资源,如果发现变更,就会自动触发对 Deploymentconfigs、Deployment、Statefulset、Daemonsets 和 Rollouts 等资源的滚动更新。

这里我们举一个示例。例如我们现在有一个 Java 服务,为了实现日志收集,需要配置 sidecar 部署一个 filebeat ,而 filebeat 的配置文件是通过 configmap 挂载到 sidecar 容器中的。如果我们需要对 filebeat 的配置文件进行修改,那么就需要更新 configmap。但是只更新 configmap 资源后,由于 filebeat 进程没有重启,所以无法获取到最新的配置。这个时候我们就可以引入 Reloader 来解决这个问题了。

一、安装 Reloader

安装 Reloader 的方式有多种,我们接下来一一介绍。

1. 使用 Helm 安装

首先添加 Helm 仓库:

helm repo add stakater https://stakater.github.io/stakater-charts

对 Helm 的仓库进行更新:

helm repo update

最后使用 helm 安装 Reloader:

helm install ops-reloader stakater/reloader

默认会将 Reloader 部署到 default 命名空间中。

Reloader 默认是监控所有命名空间中的资源,如果只是需要监控单一命名空间,那么需要在使用 Helm 安装的时候覆盖配置,命令如下:

helm install ops-reloader stakater/reloader --set reloader.watchGlobally=false --namespace test

这样 Reloader 会安装到 test 命名空间中,并且只会监控该命名空间下的 Deployment、Statefulset、Daemonsets 和 Rollouts 资源。

如果只需要对 Configmap 和 Secret 中的一个资源进行监控,那么可以在 Helm 安装的过程中设置如下值来实现忽略 Secret 或 Configmap 资源(或者直接在 values.yaml 文件中设置):

参数描述值类型
ignoreSecrets忽略 Secret 资源,可选的值 true 或者 falseboolean
ignoreConfigMaps忽略 Configmap 资源,可选的值 true 或者 falseboolean

需要注意的是,同一时刻只能有一个资源被忽略,如果同时忽略了两种资源会导致 Reloader 出现异常。如果的确不需要再对 Configmap 和 Secret 进行监控,可以将 Reloader Pod 的副本数设置为 0 或直接卸载。

2. 使用 Kustomize 安装

我们也可以使用官方提供的 Kustomize 配置文件来部署:

kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes

这会将 Reloader 部署到 dafault 命名空间中,并且也可以监控所有命名空间中的资源。

3. 使用 Manifest 文件部署

最后一种就是我们常用的执行 YAML 文件去部署 Reloader:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

如果想要部署到其他命名空间,可以将 Manifest 文件下载到本地后再进行修改。

使用 Manifest 同样可以配置对其中一种资源进行忽略,可以在 spec.template.spec.containers.args 下面配置如下参数:

参数描述
–resources-to-ignore=configMaps忽略 configMaps 资源
–resources-to-ignore=secrets忽略 secrets 资源

还是之前说的那样,同一时刻只能有一种资源被忽略。

本文原文链接:https://blog.csdn.net/xzk9381/article/details/117462348,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

二、使用 Reloader

1. 监控所有 configMap 和 secret 并自动更新

例如现在有一个名为 foo 的 Deployment 资源,并且引用了一个名为 foo-configmap 的 ConfigMap 资源和一个名为 foo-secret 的 Secret 资源。那么我们可以在 Deployment 的 Manifest 的 metadata 字段中添加如下注释信息:

kind: Deployment
metadata:
  name: foo
  annotations:
    reloader.stakater.com/auto: "true"
spec:
  ...
  ...

这样 Reloader 就会发现这个 Pod 中引用的所有 ConfigMap 或者 Secret,并且在这两个资源更新的时候滚动更新这个 Pod。

如果另一个 Pod 也引用了同一个 ConfigMap 或者 Secret,但是没有添加注释信息,那么在 ConfigMap 或者 Secret 变更时,不会滚动更新这个 Pod

如果这个名称为 foo 的 Deployment 资源中引用了多个 ConfigMap 或者 Secret 资源,那么上面这样的配置就会导致任意一个 ConfigMap 或 Secret 资源更新时,都会触发 Pod 滚动更新。所以如果我们需要仅针对部分 ConfigMap 资源更新的情况再触发指定 Pod 的滚动更新,可以使用如下特殊的注释信息,首先在 Deploymentconfigs、Deployment、Statefulset、Daemonsets 或 Rollouts 的 Manifest 中定义如下注释:

kind: Deployment
metadata:
  annotations:
    reloader.stakater.com/search: "true"
spec:
  template:

那么 Reloader 就会在任何标有如下注释信息的 ConfigMap 或 Secret 资源发生更新时滚动更新这个 Pod,不管这个 ConfigMap 或 Secret 资源是通过 volume 还是 env 方式挂载的:

kind: ConfigMap
metadata:
  annotations:
    reloader.stakater.com/match: "true"
data:
  key: value

需要注意的一点是, reloader.stakater.com/searchreloader.stakater.com/auto 不能同时生效。如果已经指定了 reloader.stakater.com/auto: "true" 这个注释,那么这个 Pod 就会在任何一个 ConfigMap 或 Secret 改变时开始滚动更新,不论是否还有其他的相关注释。

2. 监控指定的 ConfigMap 资源

Reloader 也支持监控指定的 ConfigMap 或 Secret 资源,在这些资源发生变更时才会触发滚动更新。这样就避免了在 Pod 中使用的任意 ConfigMap 或 Secret 发生变化时都会滚动升级 Pod。实现这种方式之前,首先需要删除 reloader.stakater.com/auto 注释,或者将其设置为 "false"

例如现在有一个名为 foo 的 Deployment 资源,并且其中引用了多个 ConfigMap 资源,现在指定只有其中名为 foo-configmap 的资源更新时才触发 Deployment 的滚动升级,那么需要在 Deployment 的 metadata 中指定如下注释:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
spec:
  template: metadata:

也可以同时指定多个 ConfigMap 资源:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap,bar-configmap,baz-configmap"
spec:
  template: metadata:

3. 监控指定的 Secret 资源

监控指定的 Secret 资源也是同样的方式,不过注释的内容需要更改为 secret.reloader.stakater.com/reload

kind: Deployment
metadata:
  annotations:
    secret.reloader.stakater.com/reload: "foo-secret"
spec:
  template: metadata:

也可以指定多个 Secret 资源:

kind: Deployment
metadata:
  annotations:
    secret.reloader.stakater.com/reload: "foo-secret,bar-secret,baz-secret"
spec:
  template: metadata:

三、对 Reloader 配置进行修改

Reloader 在安装或更新的时候支持对其部分配置进行修改,参考如下表:

参数描述备注
--auto-annotation自定义 auto 注释的内容
--auto-search-annotation自定义 search 注释的内容
--search-match-annotation自定义 match 注释的内容
--configmap-annotation自定义指定 configmap 资源注释的内容
--secret-annotation自定义指定 secret 资源注释的内容
--namespaces-to-ignore指定忽略监控的命名空间,即便这个空间中的 Pod 添加了注释信息
--resources-to-ignore指定忽略监控的资源类型
--log-format=json指定使用 JSON 格式输出日志

本文原文链接:https://blog.csdn.net/xzk9381/article/details/117462348,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。

 类似资料: