Configmap&Secret 结合Reloader实现服务热更新

前提

业务环境进行服务构建或者部署时经常遇到一个问题,就是不同的环境要配置不同的资源信息.
有些资源信息还比较敏感,在构建过程总导出传递,容易产生信息泄露,存在较大的安全隐患.在容器化时代结合 K8S 集群运行服务,通常会依赖 Configmap 或者 Secret 来解决此类问题.

细分容器化配置场景如下:

1.  将配置文件直接打包到镜像中,但这种方式不推荐使用,因为修改配置不够灵活。
2. 通过定义Pod清单时,指定自定义命令行参数,即设定 args:["命令参数"],这种可在启动Pod时,传参来修改Pod的应用程序的配置文件.
3. 使用环境变量来给Pod中应用传参修改配置,但要使用此种方式,必须符合以下前提之一.
1) Pod中的应用程序必须是Cloud Native的应用程序,即支持直接通过环境变量来加载配置信息。
2) 通过定义Entrypoint脚本的预处理变量来修改Pod中应用程序的配置文件,这些Entrypoint脚本,可以使用set,sed,grep等工具来实现修改,但也要确保容器中有这些工具。
4. 存储卷: 我们可将配置信息直接放到存储卷中,如PV中,Pod启动时,自动挂载存储卷到配置文件目录,来实现给Pod中应用提供不同的配置。
5. Secret 或 ConfigMap

细聊 Secret 或 Conf应用程序安装异常103igMap

Secret

Secret:它是一种相对安全的configMap,因为它将configMap通过base64做了编码, 让数据不是明文直接存储在configMap中,起到了一定的保护作用,但对Base64进行反编码,只是相对安全。

Secret类型有三种:

generic: 通用类型,通常用于存储数据
tls:此类型仅用于存储私钥和证书。
docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。

ConfigMap

ConfigMap :是一个 API 对象, 让你可以存储其他对象所需要使用的配置。

目标:

为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

ConfigMap 使用方式:

可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
在容器命令和参数内
容器的环境变量
在只读卷里面添加一个文件,让应用来读取
编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

reloader简介

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

reloader安装

当前版本:reloader-v0.0.104
安装空间:namespace: default

极简安装

$ kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/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

部署选项

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

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

验证服务

#启动中

[root@cnvskubmdev-101-169 <sub>]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
reloader-reloader-6498bd576-8htd4 0/1 ContainerCreating 0 18s


#启动成功

[root@cnvskubmdev-101-169 </sub>]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
reloader-reloader-6498bd576-8htd4 1/1 Running 0 92s

推荐使用方法

1:暴力模式:

服务添加注释: 
reloader.stakater.com/auto: true

效果:
服务挂载使用的所有ConfigMap或Secret任意一个发生变更服务将会自动滚动更新​

2: 兼容模式:

服务添加注释: 
configmap.reloader.stakater.com/reload: cm-test-01

多个ConfigMap使用逗号分隔:

configmap.reloader.stakater.com/reload: cm-test-01,cm-test-02

效果:

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

注意事项

Reloader自动触发滚动更新,可能会导致业务中断。使用该功能时需要评估pod滚动更新对业务带来的影响。
reloader.stakater.com/search 和 reloader.stakater.com/auto 并不在一起工作。
reloader.stakater.com/auto的优先级高于reloader.stakater.com/search.

参考信息:

https://blog.csdn.net/xzk9381/article/details/117462348
https://cloud.tencent.com/developer/article/1859051
https://github.com/stakater/Reloader
https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml