公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

1背景

1.1 配置中心问题

在云原生中配置中心,例如:ConfigmapSecret对象,虽然可以进行直接更新资源对象

  • 对于引用这些有些不变的配置是可以打包到镜像中的,那可变的配置呢?

  • 信息泄漏,很容易引发安全风险,尤其是一些敏感信息,比如密码、密钥等。

  • 每次配置更新后,都要重新打包一次,升级应用。镜像版本过多,也给镜像管理和镜像中心存储带来很大的负担。

  • 定制化太严重,可扩展能力差,且不容易复用。

1.2 使用方式

ConfigmapSecret使用有两种方式,一种是env系统变量赋值,一种是volume挂载赋值,env写入系统的configmap是不会热更新的,而volume写入的方式支持热更新!

  • 对于env环境的,必须要滚动更新pod才能生效,也就是删除老的pod,重新使用镜像拉起新pod加载环境变量才能生效。

  • 对于volume的方式,虽然内容变了,但是需要我们的应用直接监控configmap的变动,或者一直去更新环境变量才能在这种情况下达到热更新的目的。

应用不支持热更新,可以在业务容器中启动一个sidercar容器,监控configmap的变动,更新配置文件,或者也滚动更新pod达到更新配置的效果。

2解决方案

ConfigMap 和 Secret 是 Kubernetes 常用的保存配置数据的对象,你可以根据需要选择合适的对象存储数据。通过 Volume 方式挂载到 Pod 内的,kubelet 都会定期进行更新。但是通过环境变量注入到容器中,这样无法感知到 ConfigMap 或 Secret 的内容更新。

目前如何让 Pod 内的业务感知到 ConfigMap 或 Secret 的变化,还是一个待解决的问题。但是我们还是有一些 Workaround 的。

如果业务自身支持 reload 配置的话,比如nginx -s reload,可以通过 inotify 感知到文件更新,或者直接定期进行 reload(这里可以配合我们的 readinessProbe 一起使用)。

如果我们的业务没有这个能力,考虑到不可变基础设施的思想,我们是不是可以采用滚动升级的方式进行?没错,这是一个非常好的方法。目前有个开源工具Reloader,它就是采用这种方式,通过 watch ConfigMap 和 Secret,一旦发现对象更新,就自动触发对 Deployment 或 StatefulSet 等工作负载对象进行滚动升级。

3reloader简介

3.1 reloader简介

Reloader 可以观察 ConfigMap 和 Secret 中的变化,并通过相关的 deploymentconfiggs、 deploymentconfiggs、 deploymonset 和 statefulset 对 Pods 进行滚动升级。

3.2 reloader安装

  • helm安装

$ helm repo add stakater https://stakater.github.io/stakater-charts
$ helm repo update
$ helm install stakater/reloader
  • Kustomize

$ kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
  • 资源清单安装

$ kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml# 在此安装在common-service 名称空间下,
[root@master reloader]# kubectl apply -f reloader.yaml
clusterrole.rbac.authorization.k8s.io/reloader-reloader-role created
clusterrolebinding.rbac.authorization.k8s.io/reloader-reloader-role-binding created
deployment.apps/reloader-reloader created
serviceaccount/reloader-reloader created
[root@master reloader]# kubectl get all -n common-service
NAME                                     READY   STATUS    RESTARTS   AGE
pod/reloader-reloader-66d46d5885-nx64t   1/1     Running   0          15sNAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/reloader-reloader   1/1     1            1           16sNAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/reloader-reloader-66d46d5885   1         1         1       16s
  • 配置忽略

reloader 能够配置忽略cm或者secrets资源,可以通过配置在reader deploy中的spec.template.spec.containers.args,如果两个都忽略,那就缩小deploy为0,或者不部署reoader。

Args Description
--resources-to-ignore=configMaps To ignore configMaps
--resources-to-ignore=secrets To ignore secrets

3.3 配置

3.3.1 自动更新

reloader.stakater.com/searchreloader.stakater.com/auto 并不在一起工作。如果你在你的部署上有一个 reloader.stakater.com/auto : "true"的注释,该资源对象引用的所有configmap或secret的改变都会重启该资源,不管他们是否有 reloader.stakater.com/match : "true"的注释。

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

3.3.2 指定更新

指定一个特定的configmap或者secret,只有在我们指定的配置图或秘密被改变时才会触发滚动升级,这样,它不会触发滚动升级所有配置图或秘密在部署,后台登录或状态设置中使用。

一个指定 deployment 资源对象,在引用的configmap或者secret中,只有reloader.stakater.com/match: "true"为true才会出发更新,为false或者不进行标记,该资源对象都不会监视配置的变化而重启。

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

cm 配置

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

3.3.3 指定 cm

如果一个deployment挂载有多个cm或者的场景下,我们只希望更新特定一个cm后,deploy发生滚动更新,更新其他的cm,deploy不更新,这种场景可以将cm在deploy中指定为单个或者列表实现。

例如:一个deploy有挂载nginx-cm1和nginx-cm2两个configmap,只想nginx-cm1更新的时候deploy才发生滚动更新,此时无需在两个cm中配置注解,只需要在deploy中写入configmap.reloader.stakater.com/reload:nginx-cm1,其中nginx-cm1如果发生更新,deploy就会触发滚动更新。

如果多个cm直接用逗号隔开

# configmap对象
kind: Deployment
metadata:annotations:configmap.reloader.stakater.com/reload: "nginx-cm1"
spec:template: metadata:# secret对象
kind: Deployment
metadata:annotations:secret.reloader.stakater.com/reload: "foo-secret"
spec:template: metadata:

无需在cm或secret中添加注解,只需要在引用资源对象中添加注解即可。

4测试

4.1 deploy

apiVersion: apps/v1
kind: Deployment
metadata:annotations:# reloader.stakater.com/auto: "true"reloader.stakater.com/search: "true"labels:run: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginxname: nginxvolumeMounts:# 必须匹配volumes的名称,定义configmap- name: nginx-cmmountPath: /data/cfgreadOnly: truevolumes:# 定义逻辑卷的名称- name: nginx-cmconfigMap:# 使用configmap资源的名称name: nginx-cmitems:# 使用configmap中到那个key- key: config.yaml# 使用configmap中到key映射到容器中到文件名称path: config.yamlmode: 0644

4.2 configmap

apiVersion: v1
data:config.yaml: |# project settings# go2cloud_api service configDEFAULT_CONF:port: 8888# data disk apiUNITTEST_TENCENT_ZONE: ap-chongqing-1
kind: ConfigMap
metadata:name: nginx-cmannotations:reloader.stakater.com/match: "true"

4.3 测试

[root@master ns-default]# kubectl  get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-68c9bf4ff7-9gmg6   1/1     Running   0          10m
[root@master ns-default]# kubectl  get cm
NAME       DATA   AGE
nginx-cm   1      28m
# 更新cm内容
[root@master ns-default]# kubectl edit cm nginx-cm
configmap/nginx-cm edited
# 查看po发生了滚动更新,重新加载配置文件
[root@master ns-default]# kubectl get po
NAME                     READY   STATUS              RESTARTS   AGE
nginx-66c758b548-9dllm   0/1     ContainerCreating   0          4s
nginx-68c9bf4ff7-9gmg6   1/1     Running             0          10m

5Reloader 使用注意事项

  • Reloader 为全局资源对象,建议部署在一个公共服务的ns下,然后其他ns也可以正常使用reloader特性。

  • Reloader.stakater.com/auto : 如果配置configmap或者secret在 deploymentconfigmap/deployment/daemonsets/Statefulsets

  • secret.reloader.stakater.com/reload 或者 configmap.reloader.stakater.com/reload 注释中被使用,那么 true 只会重新加载 pod,不管使用的是 configmap 还是 secret。

  • reloader.stakater.com/search 和 reloader.stakater.com/auto 不能同时使用。如果你在你的部署上有一个 reloader.stakater.com/auto : "true"的注释,那么它总是会在你修改了 configmaps 或者使用了机密之后重新启动,不管他们是否有 reloader.stakater.com/match : "true"的注释。

6反思

Reloader通过 watch ConfigMap 和 Secret,一旦发现对象更新,就自动触发对 Deployment 或 StatefulSet 等工作负载对象进行滚动升级。

如果我们的应用内部没有去实时监控配置文件,利用该方式可以非常方便的实现配置的热更新。

7参考链接

  • https://github.com/stakater/Reloader

本文转载自:「 掘金 」,原文:https://tinyurl.com/j9t3knbe ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

你可能还喜欢

点击下方图片即可阅读

万字总结,体系化带你全面认识容器网络接口(CNI)


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

零代码变更,巧用 Reloader 快速实现 Kubernetes 的 Configmap 和 Secret 热更新相关推荐

  1. 通过零代码ETLCloud实现马帮ERP数据自动化同步

    马帮ERP介绍 马帮ERP是一款云端跨境电商管理软件.与传统的ERP系统不同,马帮ERP专注于跨境电商领域,为电商企业提供一站式管理解决方案,包括财务管理.采购管理.进销存管理.订单管理等功能模块.该 ...

  2. [零代码工具推荐] 快速建站神器 Jeecg/Boot

    项目介绍 JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus, ...

  3. python 零代码快速开发平台_现在低代码开发平台和零代码平台区别是什么?

    低代码与零代码,可参考一下 开发平台在国内已经发展了很久了,从有代码到低代码,甚至有些厂家声称可以无代码,当然无代码只是一个噱头. 低代码开发可以解决传统的开发方式的复杂方式,提高开发效率,节省时间成 ...

  4. python 零代码快速开发平台_企业如何选择开源的零代码开发平台

    原标题:企业如何选择开源的零代码开发平台 开源零代码开发平台是指开放源代码的零代码开发平台,因为其代码是开放的,所以企业如果有自己的技术人员可以直接进行功能及性能的修改.零代码开发平台经过多年的发展已 ...

  5. mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人

    点击观看大咖分享 心疼你独自一人承担生活的苦难,寂寞夜里陪伴你的只剩无人倾诉的压抑和无处安放的焦虑.养个宠物,它却不能get到你的"宠言宠语".找个伴侣,还要浪费吵架的时间和精力. ...

  6. 低代码和零代码火了,十大利器推荐!

    [CSDN编者按]低代码和无代码的概念流行起来并引发严肃思考:这能行得通吗?不管这个趋势奖项哪个方向发展,作为一名程序员,学习和了解新潮流才能以不变应万变.本文中,作者介绍了十大优质低代码和无代码应用 ...

  7. 信息架构和零代码应用搭建

    文/明道云创始人任向晖 本文来自即将出版的<零代码企业应用搭建指南>中的关键章节,指导用户进行相对复杂应用的前期信息架构工作. 零代码平台赋能了业务开发者,让他们可以不写代码就能完成应用实 ...

  8. 三分钟,带你了解零代码开发

    企业数字化转型如火如荼的进行,五花八门的零代码.低代码工具正如雨后春笋一般出现,那么零代码开发是什么? 阅读本文您将了解: 零代码开发是什么 零代码与企业数字化转型 零代码开发带来的效益 简道云零代码 ...

  9. 零代码平台在大型企业的进化之路

    文/明道云深圳 POD Leader 兰倚 "零代码系统能够解决我们复杂的软件实现需求吗?" --来自多个明道云用户的提问 自明道云零代码产品发布以来,累计服务了数十家大型企业,并 ...

最新文章

  1. springmvc工作流程简单易懂_三极管的结构和工作特性,简单易懂
  2. js中关于new Object时传参的一些细节分析
  3. Python基础语法难点突破
  4. .Net软件UI界面测试自动化--UIAutomation技术
  5. Linux 下的 hosts文件
  6. Azure PowerShell (10) 使用PowerShell导出订阅下所有的Azure VM和Cloud Service的高可用情况...
  7. JS中的算法与数据结构——排序(Sort)
  8. cadence的PCB封装库导入Altium designer
  9. Orcad allegro 安装补丁
  10. 山西等保测评机构项目测评收费价格标准参考
  11. 计算机英语(王艺)翻译(unit1-unit5)
  12. matlab nntool 使用步骤: (以p4.3 为例),Matlab_nntool_应用实例
  13. RSA后台加密,前端解密
  14. STM32使用SPI方式读写SD 卡
  15. (转)从P1到P7——我在淘宝这7年
  16. 王者荣耀角色注销后我的服务器列表怎么删除,王者荣耀账号怎么注销 角色删除流程要求...
  17. 读书笔记_007《青鸟》
  18. 量化初步-《python与量化投资从基础到实战》——优矿策略
  19. 计算机专业读博怎么写简历,博士学位个人简历范文
  20. 微软华人软件人生经历:功夫在身外

热门文章

  1. ES8新增的常用语法
  2. xpath爬取当当网
  3. NAACL 2018 ACCEPTED PAPER
  4. 2005年5月23日星期一
  5. 2020总结与2021前瞻
  6. 基于Jeecgboot前后端分离的流程管理平台演示系统安装(二)
  7. Blender新手入门试水作品:Low poly版敲击兽
  8. C++主流IDE推荐
  9. (EPROCESS/KPROCESS/ETHREAD/KTHREAD)进程与线程内核层中的结构
  10. 今日头条校招2017.7.21编程3,PM、idea、程序员