容器技术
ubuntu使用APT安装docker并指定版本
Helm部署与使用
Helm常用命令
从Helm仓库创建应用流程示例
Helm部署与使用
K8S中部署mysql-ha高可用集群
helm启动mysql-ha
helm几个常用仓库
Kubernetes使用helm部署Mysql-Ha
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
k8s之yaml文件详解
将 MySQL 通过 bitpoke/mysql-operator 部署到 k8s 内部
k8s pvc扩容:pvc创建后扩容
K8S性能分析
部署Metrics Server
Kubernetes集群搭建
kubespray 部署常见问题和优化汇总
kubernetes-sigs/kubespray at release-2.15
K8S-pod配置文件详解
KubeSphere知识库
在 Kubernetes 上最小化安装 KubeSphere
卸载 KubeSphere 和 Kubernetes
KubeSphere 应用商店
修改pod中容器的时区
k8s之Pod安全策略
Harbor 登陆失败,用户名或者密码不正确。405 Not Allowed
Docker-leanote_n1
kubesphere/kubekey
Kubernetes Static Pod (静态Pod)
kubernets kube-proxy的代理 iptables和ipvs - 30岁再次出发 - 博客园
k8s生产实践之获取客户端真实IP - SSgeek - 博客园
kube-proxy ip-tables故障解决
k8s入门:Helm 构建 MySQL
docker批量修改tag(批量push)
prometheus operator 监控redis-exporter
Helm3 安装 ElasticSearch & Kibana 7.x 版本
kubernete强力删除namespace_redis删除namespace命令
EFK (Elasticsearch + Fluentd + Kibana) 日志分析系统
k8s日志收集实战(无坑)
fluentd收集k8s集群pod日志
Elasticsearch+Fluentd+Kibana 日志收集系统的搭建
TKE/EKS之configmap,secret只读挂载
K8s基于Reloader的ConfigMap/Secret热更新
使用 Reloader 实现热部署_k8s reloader
k8s使用Reloader实现更新configmap后自动重启pod
在 Kubernetes 上对 gRPC 服务器进行健康检查 | Kubernetes
Kubernetes ( k8s ) gRPC服务 健康检查 ( livenessProbe ) 与 就绪检查 ( readinessProbe )
排查kubernetes中高磁盘占用pod
helm 安装 MongoDB 集群
helm 安装 Redis 1 主 2 从 3哨兵
【k8s】使用 Reloader 实现热部署
k8s证书过期,更新后kubelet启动失败
kubeadm证书/etcd证书过期处理
三种监控 Kubernetes 集群证书过期方案
K8s 集群(kubeadm) CA 证书过期解决方案
k8s调度、污点、容忍、不可调度、排水、数据卷挂载
5分钟搞懂K8S的污点和容忍度(理论+实战)
Kubernetes进阶-8基于Istio实现微服务治理
macvlan案例配置
快速解决Dockerhub镜像站无法访问问题
info_scan开源漏洞扫描主系统部署
本文档使用 MrDoc 发布
-
+
首页
使用 Reloader 实现热部署_k8s reloader
我们在 k8s 中使用 `ConfigMap` 作为配置文件的时候会遇到一个问题:修改 `ConfigMap` 后无法实现热部署,也就是更改了 `ConfigMap` 配置文件后需要手动重启 Pod 配置才会生效,为了处理这个问题 github 专门有个开源的项目 **Reloader** 来解决这个问题,项目地址如下: > [Reloader](https://github.com/stakater/Reloader) 项目地址:https://github.com/stakater/Reloader **Reloader** 可以观察 ConfigMap 和 Secret 中的变化,并对 pod 及其关联的 `DeploymentConfigs`,`Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts`进行滚动升级。 本文主要对 **Reloader** 的使用进行一个简单的介绍,详细的配置与使用可以查看源码文档。 ## 二. Reloader 实现滚动升级的原理 当 Reloader 检测到 ConfigMap 发生变化的时候,会使用 SHA1 计算 ConfigMap 的哈希值(使用 SHA1 是因为它高效且不易发生冲突),计算完哈希值之后,Reloader 获取所有的 `Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts` 列表,并查找其 anotations 中是否配置了 Reloader 相关的注解,比如配置了如下 annotations : ```yaml metadata: annotations: reloader.stakater.com/auto: "true" ``` 接着 Reloader 会查找配置了 Reloader 相关 annotations 的 `Deployments`,`Daemonsets`,`Statefulsets` 中一个特殊的环境变量。 如果找到这个环境变量,则获取其值并将其与前面计算的新 ConfigMap 哈希值进行比较,如果环境变量中的旧值与新哈希值不同,则 Reloader 会更新环境变量。 如果环境变量不存在,那么它会从 ConfigMap 创建一个具有最新哈希值的新环境变量并更新相关的`deployment`,`daemonset`或者`statefulset`。 k8s 检测到这个环境变量发生变化,则会触发 pod 关联的 `deployment`,`daemonset`或者`statefulset` 的滚动升级。 > 修改 Secret 实现滚动升级的原理上述相同 ## 环境变量的名字 这个环境变量的名字定义如下: - 生成 ConfigMap 的环境变量的名称为:`STAKATER_{configmap_name}_CONFIGMAP` ,比如 ConfigMap 的名称为 foo,则生成的环境变量的名称为:`STAKATER_FOO_CONFIGMAP`。 - 生成 Secret 的环境变量的名称为:`STAKATER_{secret_name}_SECRET` ,比如 Secret 的名称为 foo,则生成的环境变量的名称为:`STAKATER_FOO_SECRET`。 ## 环境变量的值 这个环境变量的值为使用 SHA1 计算的 ConfigMap 或者 Secret 的哈希值。 ## Reloader 监控特定命名空间 默认情况下,reloader 部署在默认命名空间中并监视所有命名空间中的更改,要监视特定命名空间中的更改,请在该命名空间中部署 Reloader,并将`watchGlobally`标志设置为`false`。 ## 三. 在 k8s 中安装 Reloader 在 Reloader 的源码文档中提供了三种安装方式: 1. 使用 Manifests 安装 2. 使用 kustomize 安装 3. 使用 helm 安装 这里只介绍使用 helm 安装,个人觉得使用 helm 安装的优点是方便管理、升级和修改配置,你可以根据自己的需求选择其他的安装方式,详细的说明可以查看源码文档。 使用下面的命令添加 reloader 仓库地址: ```sh helm repo add stakater https://stakater.github.io/stakater-charts ``` 使用下面的命令更新仓库: ```sh helm repo update ``` 使用下面的命令搜索 reloader: ```sh helm search repo reloader ``` 为了方便修改配置,我们可以使用下面的命令下载 Reloader 的 chart 包: ```sh helm pull stakater/reloader ``` 下载成功后获取到一个压缩包 `reloader-v0.0.105.tgz`,使用下面的命令解压: ```sh tar -zxvf reloader-v0.0.105.tgz ``` 解压后得到 `reloader` 文件夹,其中的内容如下: ```sh [root@node01 reloader]# ll total 20 -rw-r--r-- 1 root root 789 Feb 13 20:16 Chart.yaml drwxr-xr-x 2 root root 4096 Feb 17 10:26 templates -rw-r--r-- 1 root root 341 Feb 13 20:16 values.schema.json -rw-r--r-- 1 root root 4284 Feb 13 20:16 values.yaml ``` 我们根据需要修改 `values.yaml` 文件的配置即可。 修改完成后,可以使用下面的命令根据修改后的配置进行安装: ```sh helm install -name reloader -n default ./reloader ``` 如果不通过 `-n namespace` 指定安装的命名空间,则默认安装在 `default` 命令空间,可以根据自己的需要安装到特定的命名空间。 使用下面的命令查看 reloader 是否安装成功: ```sh [root@node01 ~]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE reloader-reloader 1/1 1 1 15m ``` ## 四. 使用 Reloader 滚动升级 前面简单介绍了使用 helm 安装 reloader,接下来将介绍如何使用 reloader。 源码文档中介绍了三种 reloader 的使用场景: **1\. 检测所有命名空间中的 ConfigMap 或者 Secret 的变化,并实现滚动升级** 在`DeploymentConfigs`,`Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts` 中的 annotations 中添加如下内容: ```yaml metadata: annotations: reloader.stakater.com/auto: "true" ``` 之后 reloader 会检测**所有命名空间**中其相关联的 ConfigMap 或者 Secret 的变化,并实现滚动升级。 **2\. 限制只检测带有特殊 annotations 的 ConfigMap 或者 Secret 的变化** 首先在`DeploymentConfigs`,`Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts` 中的 annotations 中添加如下内容: ```yaml kind: Deployment metadata: annotations: reloader.stakater.com/search: "true" ``` 并且在 `ConfigMap` 或者 `Secret` 中的 annotations 中添加如下内容: ```yaml kind: ConfigMap metadata: annotations: reloader.stakater.com/match: "true" ``` **3\. 检测指定的 ConfigMap 或者 Secret 的变化** 在`DeploymentConfigs`,`Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts` 中的 annotations 中指定多个要检测的 ConfigMap 的名称: ```yaml kind: Deployment metadata: annotations: configmap.reloader.stakater.com/reload: "foo-configmap,bar-configmap,baz-configmap" spec: template: metadata: ``` 在`DeploymentConfigs`,`Deployments`,`Daemonsets`,`Statefulsets` 和 `Rollouts` 中的 annotations 中指定多个要检测的 Secret 的名称: ```yaml kind: Deployment metadata: annotations: secret.reloader.stakater.com/reload: "foo-secret,bar-secret,baz-secret" spec: template: metadata: ``` ## 五. 验证 Reloader 的滚动升级 这里使用 ConfigMap 作为 spring boot 项目的外部配置,它的原理就是将 ConfigMap 中配置的 `application.yaml` 文件挂载到容器中 spring boot 项目 jar 包所在目录的 `config` 文件夹中,因为 spring boot优先读取 `config` 目录中的配置文件并覆盖内部的配置。 挂载配置文件后,在容器中的目录内容如下: ```sh root@springboot-demo-7ddbc4dfd5-sxnqv:/app# ls -l total 99 drwxrwxrwx 3 root root 4096 Feb 16 19:28 config -rw-r--r-- 1 root root 102043 Feb 16 15:48 springboot-demo.jar ``` 其中 `config` 文件夹中的内容如下: ```sh root@springboot-demo-7ddbc4dfd5-sxnqv:/app# ls -l config/ lrwxrwxrwx 1 root root 22 Feb 17 10:28 application.yaml -> ..data/application.yaml ``` 定义一个 springboot-demo 项目,其 `Dockerfile` 文件内容如下: ```Dockerfile FROM openjdk:8u232-jdk WORKDIR /app LABEL maintainer="peterwd" app="springboot-demo" COPY target/springboot-demo.jar springboot-demo.jar EXPOSE 8080 CMD java -jar springboot-demo.jar ``` 相关的部署文件如下: `deployment.yaml` 文件内容如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo namespace: default labels: app: springboot-demo annotations: reloader.stakater.com/auto: "true" spec: replicas: 1 selector: matchLabels: app: springboot-demo template: metadata: labels: app: springboot-demo spec: containers: - name: springboot-demo image: springboot-demo imagePullPolicy: Always env: - name: TZ value: Asia/Shanghai - name: NAMESPACE value: default ports: - containerPort: 8080 volumeMounts: - mountPath: /app/config name: config volumes: - configMap: name: springboot-demo name: config imagePullSecrets: - name: docker-secret --- apiVersion: v1 kind: Service metadata: name: springboot-demo namespace: default spec: ports: - name: http-port port: 80 protocol: TCP targetPort: 8080 selector: app: springboot-demo type: ClusterIP ``` `springboot-demo-configmap.yaml` 文件的内容如下: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: springboot-demo namespace: default data: application.yaml: |- server: port: 8080 servlet: context-path: /springboot-demo spring: application: name: demo ``` 当我们修改 ConfigMap 中的 `application.yaml` 配置的 context-path 后,可以看到相关 pod 完成了自动重启,并且使用下面的命令查看 deployment 的 yaml 内容: ```sh kubectl get deploy -o yaml ``` 可以发现增加了一个环境变量: ```yaml spec: containers: - env: - name: TZ value: Asia/Shanghai - name: NAMESPACE value: default - name: STAKATER_SPRINGBOOT_DEMO_CONFIGMAP value: 7b36c3bd0a7c0a87db028cf1037eb994df4de49e ``` 参考文档 https://github.com/stakater/Reloader/blob/master/docs/How-it-works.md
adouk
2023年4月25日 09:29
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码