Имеется 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]
Готово.