推荐阅读
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 的方式有多种,我们接下来一一介绍。
首先添加 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 或者 false | boolean |
ignoreConfigMaps | 忽略 Configmap 资源,可选的值 true 或者 false | boolean |
需要注意的是,同一时刻只能有一个资源被忽略,如果同时忽略了两种资源会导致 Reloader 出现异常。如果的确不需要再对 Configmap 和 Secret 进行监控,可以将 Reloader Pod 的副本数设置为 0 或直接卸载。
我们也可以使用官方提供的 Kustomize 配置文件来部署:
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
这会将 Reloader 部署到 dafault 命名空间中,并且也可以监控所有命名空间中的资源。
最后一种就是我们常用的执行 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,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。
例如现在有一个名为 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/search
和 reloader.stakater.com/auto
不能同时生效。如果已经指定了 reloader.stakater.com/auto: "true"
这个注释,那么这个 Pod 就会在任何一个 ConfigMap 或 Secret 改变时开始滚动更新,不论是否还有其他的相关注释。
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:
监控指定的 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 在安装或更新的时候支持对其部分配置进行修改,参考如下表:
参数 | 描述 | 备注 |
---|---|---|
--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,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。