0
点赞
收藏
分享

微信扫一扫

使用Reloader实现ConfigMap或Secret的滚动更新

1、滚动更新工作原理

当 Reloader 检测到 configmap 发生变化时。它获取 configmap 的两个对象。第一个对象是一个旧的 configmap 对象,它具有最新更改之前的状态。第二个对象是新的 configmap 对象,其中包含最新的更改。Reloader 比较两个对象并查看数据是否发生任何更改。如果 Reloader 发现新的 configmap 对象有任何变化,只有那时,它才会继续滚动升级。
之后,Reloader 获取所有列表deployments,daemonsets并statefulset查找上述 configmap 的注释。如果注释值包含 configmap 名称,则它会查找可以包含 configmap 或秘密数据更改哈希的环境变量。

2、兼容性

Reloader 与 Kubernetes >= 1.19 兼容

3、部署reloader

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

4、注解介绍

在deployment添加注解,检测所有命名空间中其相关联的 ConfigMap 或者 Secret 的变化,并实现滚动升级。

  annotations:
    reloader.stakater.com/auto: "true"

检测指定的 ConfigMap 的变化

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
spec:
  template:
    metadata:
        
使用逗号分隔列表来定义多个配置映射。
kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap,bar-configmap,baz-configmap"
spec:
  template: 
    metadata:

检测指定的  Secret 的变化

要在仅特定Secret发生更改时执行滚动升级,请使用以下注释。
kind: Deployment
metadata:
  annotations:
    secret.reloader.stakater.com/reload: "foo-secret"
spec:
  template: 
    metadata:
        
使用逗号分隔列表来定义多个Secret。
kind: Deployment
metadata:
  annotations:
    secret.reloader.stakater.com/reload: "foo-secret,bar-secret,baz-secret"
spec:
  template: 
    metadata:

5、部署nginx

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    user  nginx;
    worker_processes  auto;

    error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;


    events {
        worker_connections  1024;
    }


    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile        on;
        #tcp_nopush     on;

        keepalive_timeout  65;

        #gzip  on;

        include /etc/nginx/conf.d/*.conf;
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    reloader.stakater.com/auto: "true"
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: config-volume
        configMap:
          name:  nginx-config

6、测试自动更新

[root@172-20-8-243 ~]# kubectl edit cm nginx-config -n test  #修改cm
[root@172-20-8-243 ~]# kubectl get pod -n test -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-64f5cc9d49-np82t   1/1     Running   0          35s

nginx-b889fddc8-zqrnf   0/1   Pending   0     0s
nginx-b889fddc8-zqrnf   0/1   Pending   0     0s
nginx-b889fddc8-zqrnf   0/1   ContainerCreating   0     0s
nginx-b889fddc8-zqrnf   1/1   Running   0     7s
nginx-64f5cc9d49-np82t   1/1   Terminating   0     47s
nginx-64f5cc9d49-np82t   0/1   Terminating   0     48s
nginx-64f5cc9d49-np82t   0/1   Terminating   0     54s
nginx-64f5cc9d49-np82t   0/1   Terminating   0     54s

举报

相关推荐

0 条评论