ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
注意:
ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。
这些不同的方法适用于不同的数据使用方式。 对前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。
第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据。然而, 由于你是直接使用 Kubernetes API,因此只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新,并且在这样的情况发生的时候做出反应。 通过直接进入 Kubernetes API,这个技术也可以让你能够获取到不同的名字空间里的 ConfigMap(也就类似于通过脚本文件调用K8S api)
这里采用第5种方式更新配置
为什么不采用回调的方式呢,因为回调请求最先来到svc,svc对应多个pod,这时候可能只有一个pod更新了cm其余的没有更新
其实哪一种方式都不好,第四种方式需要在pod里面起轮询,很消耗cpu资源,可以参考operator的方式实现滚动更新
REPO
apiVersion: v1
kind: ConfigMap
metadata:
name: staging-fastapi-cm
namespace: staging-mep-server
data:
config.yml: |-
service_name: iMoA4MEP
version: 1.3.0
kind: Deployment
apiVersion: apps/v1
metadata:
name: fastapi-server
namespace: staging-mep-server
spec:
replicas: 1
template:
metadata:
labels:
app: fastapi-server
spec:
containers:
- name: fastapi-server
image: fastapi-test:v1
ports:
- containerPort: 5000
env:
- name: MEP_ENV
value: staging
volumeMounts:
- name: config-volume
mountPath: app/cm-config/ # 相对文件目录最好是空,挂载后重置
imagePullSecrets:
- name: will-harbor-secret
volumes:
- name: config-volume
configMap:
name: staging-fastapi-cm
selector:
matchLabels:
app: fastapi-server
---
kind: Service
apiVersion: v1
metadata:
name: mep-fastapi-server-service
namespace: staging-mep-server
labels:
app.kubernetes.io/component: server
app.kubernetes.io/name: fastapi-server
app.kubernetes.io/part-of: fastapi-server
spec:
selector:
app: fastapi-server
type: NodePort
ports:
- name: http
port: 5050
# 监听的端口
targetPort: 5050
nodePort: 31301
修改configmap的值
这里我们也看到了配置成功,而且pod内的文件也是更新了的
但是这个时候pod内存中的pod是没有更新的
当 ConfigMap
作为 volume 进行挂载时,它的内容是会更新的。但是我们项目是将他赌到了内存,由于没有重启项目,所以他的内存并没有更新。所以只是做到了文件的热更新,并没有做到Pod的热更新。
这里我们通过operator的方式实现Pod热更新,主要参考社区的Reloader
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
这里有两个参数,这里我没有做筛选
Args | Description |
---|---|
–resources-to-ignore=configMaps | To ignore configMaps |
–resources-to-ignore=secrets | To ignore secrets |
默认会安装到default中的ns中,但是会监听所有环境下的cm和secret
使用起来比较简单,只需要将annotations
信息中添加到需要更新的Delpoyment
(包括单不限于)中就好了,
kind: Deployment
apiVersion: apps/v1
metadata:
name: fastapi-server
namespace: staging-mep-server
annotations:
reloader.stakater.com/auto: "true" # 只要被引用的cm和secret更新便会rolling upgrade
# reloader.stakater.com/search: "true"这个是匹配的cm或者secret更新才会更新pod,需要配合cm或者secret使用,粒度更细
# secret.reloader.stakater.com/reload: "foo-secret",这个是指定的cm或者secret才会触发
extend cm
kind: ConfigMap
metadata:
annotations:
reloader.stakater.com/match: "true"
data:
key: value
这里只会监听使用的cm
pod的内容也确实更新了