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