返回

Kubernetes热部署利器:Reloader

后端

当我们使用k8s的ConfigMap作为配置文件时,面临着一个问题:一旦修改了ConfigMap,pod并不会自动重新加载配置,这时就需要重启pod来实现更新,在一些场景下,例如有状态应用,蓝绿部署或零宕机部署,pod的重启代价较大,为了解决这类问题,Reloader横空出世。

Reloader是一个运行在Kubernetes集群中的控制器,它可以自动监控ConfigMap的变化,并在ConfigMap发生变化时自动重启受影响的pod,从而实现热部署。

1. 部署Reloader

  1. 创建一个namespace用于部署Reloader,例如:
kubectl create namespace reloader-system
  1. 将Reloader部署到集群中:
kubectl apply -n reloader-system -f https://raw.githubusercontent.com/stakater/Reloader/master/manifests/reloader.yaml
  1. 查看Reloader是否已经成功部署:
kubectl get pods -n reloader-system

2. 使用Reloader实现热部署

  1. 创建一个ConfigMap,例如:
kubectl create configmap my-config --from-literal=key1=value1
  1. 在Deployment中使用ConfigMap:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest
        env:
        - name: KEY1
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: key1
  1. 修改ConfigMap:
kubectl patch configmap my-config --patch '{"data":{"key1":"value2"}}'
  1. 观察pod,可以看到pod会自动重启,并且新的配置已经生效。

3. 注意事项

  1. Reloader只支持对ConfigMap的键值进行修改,不支持对ConfigMap的元数据的修改。
  2. Reloader只支持对Deployment、StatefulSet和DaemonSet类型的资源进行热部署。
  3. Reloader默认只会重启发生变化的pod,如果需要重启所有受影响的pod,可以设置reloader.stakater.com/restart:always
  4. Reloader默认不会等待pod重启完成,如果需要等待pod重启完成,可以设置reloader.stakater.com/postStart:true

4. 总结

Reloader是一个非常有用的工具,它可以帮助我们轻松地实现Kubernetes中的热部署,从而提高应用程序的可用性和可靠性。