K8S configmap做配置中心

ConfigMap

ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。

注意:

ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。

ConfigMap配置Pod中的容器

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
  5. 参考operator滚动更新pod

这些不同的方法适用于不同的数据使用方式。 对前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。

第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据。然而, 由于你是直接使用 Kubernetes API,因此只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新,并且在这样的情况发生的时候做出反应。 通过直接进入 Kubernetes API,这个技术也可以让你能够获取到不同的名字空间里的 ConfigMap(也就类似于通过脚本文件调用K8S api)

这里采用第5种方式更新配置

为什么不采用回调的方式呢,因为回调请求最先来到svc,svc对应多个pod,这时候可能只有一个pod更新了cm其余的没有更新

其实哪一种方式都不好,第四种方式需要在pod里面起轮询,很消耗cpu资源,可以参考operator的方式实现滚动更新

代码仓库

REPO

ConfigMap文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: staging-fastapi-cm
  namespace: staging-mep-server
data:
  config.yml: |-
    service_name: iMoA4MEP
    version: 1.3.0

Deployment文件

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

查看

K8S configmap做配置中心_第1张图片

修改configmap的值

K8S configmap做配置中心_第2张图片

image-20220922200150839

这里我们也看到了配置成功,而且pod内的文件也是更新了的

K8S configmap做配置中心_第3张图片

但是这个时候pod内存中的pod是没有更新的

K8S configmap做配置中心_第4张图片

ConfigMap 作为 volume 进行挂载时,它的内容是会更新的。但是我们项目是将他赌到了内存,由于没有重启项目,所以他的内存并没有更新。所以只是做到了文件的热更新,并没有做到Pod的热更新。

热更新

这里我们通过operator的方式实现Pod热更新,主要参考社区的Reloader

安装reload

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

image-20220923111643396

默认会安装到default中的ns中,但是会监听所有环境下的cm和secret

使用

Deployment

使用起来比较简单,只需要将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

K8S configmap做配置中心_第5张图片

K8S configmap做配置中心_第6张图片

pod的内容也确实更新了

K8S configmap做配置中心_第7张图片

你可能感兴趣的:(K8S,kubernetes,docker,容器)