Kubernetes: ConfigMap и Secrets – auto-reload данных в подах

Автор: | 11/02/2020
 

Имеется ConfigMap для Gorush сервиса (см. Kubernetes: запуск push-сервера Gorush в EKS за AWS LoadBalancer).

Проблема заключается в том, что при изменении данных в ConfigMap или Secrets – они не будут сразу отображены в подах и их контейнерах.

Есть несколько костылей типа монтирования в виде volume, а потом ремаунтить разделы, или каждый раз создавать новый ConfigMap, с новым именем или лейблой, и ремапить объект конфига к поду.

Попробуем использовать Reloader – он будет отлеживать изменения в ConfigMap (или Secret) и выполнять апдейт подов.

Запуск Reloader в Kubernetes

Создаём сервис и связанные с ним объекты – конфиги, роли и т.д:

[simterm]

$ kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
deployment.apps/reloader-reloader created
clusterrole.rbac.authorization.k8s.io/reloader-reloader-role created
clusterrolebinding.rbac.authorization.k8s.io/reloader-reloader-role-binding created
serviceaccount/reloader-reloader created

[/simterm]

Деплоится в default namespace, по-умолчанию отслеживает изменения во всех ConfigMap и Secrets, но можно через аннотации задать список определённых объектов, см. документацию тут>>>.

Проверяем под:

[simterm]

$ kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
reloader-reloader-7684d7d4b5-rwp6x   1/1     Running   0          112s

[/simterm]

ConfigMap auto-reload

Проверяем текущее значение настроек Gorush:

[simterm]

$ curl push.example.com/api/config
...
ios:
  enabled: true
  key_path: /data/ssl/apns-crt.p12
  key_base64: ""
...

[/simterm]

Сам ConfigMap:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: gorush-config
  namespace: gorush
data:
  # stat
  stat.engine: redis
  stat.redis.host: redis:6379
  ios.enabled: "true"
  ios.key_path: /data/ssl/apns-crt.p12
...

Обновляем деплоймент push-сервера – добавляем в аннотации reloader.stakater.com/auto: "true" или configmap.reloader.stakater.com/reload: "gorush-config" – что бы отслеживать только нашу ConfigMap:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gorush
  namespace: gorush
  annotations:
    configmap.reloader.stakater.com/reload: "gorush-config"
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: gorush
        tier: frontend
...

Обновляем деплоймент:

[simterm]

$ kubectl apply -f gorush-deployment.yaml 
deployment.extensions/gorush configured

[/simterm]

Делаем изменения в конфиге – меняем ios.enabled: "true" на ios.enabled: "false", деплоим:

[simterm]

$ kubectl apply -f gorush-configmap.yaml 
configmap/gorush-config configured
configmap/gorush-config-file unchanged

[/simterm]

Проверяем события:

[simterm]

$ kubectl get events -n gorush
...
7s          Normal    ScalingReplicaSet        deployment/gorush              Scaled up replica set gorush-b85d7dc64 to 1
7s          Normal    ScalingReplicaSet        deployment/gorush              Scaled down replica set gorush-7b8695bf6f to 0

[/simterm]

Реплика-сеты:

[simterm]

$ kubectl -n gorush get rs
NAME                DESIRED   CURRENT   READY   AGE
gorush-7b8695bf6f   0         0         0       10m
gorush-88cdd9b4d    0         0         0       20m
gorush-b85d7dc64    1         1         1       51s
redis-7d5844c58d    1         1         1       5d

[/simterm]

И проверяем настройки теперь:

[simterm]

$ curl push.example.com/api/config
...
ios:
  enabled: false
  key_path: /data/ssl/apns-crt.p12
  key_base64: ""
  key_type: pem
...

[/simterm]

Готово.