Перезагрузчик горячего обновления конфигурации Kubernetes

Kubernetes
Перезагрузчик горячего обновления конфигурации Kubernetes

задний фон

1.1 Проблемы Центра конфигурации

Для центров конфигурации в облаке, таких как configmap и секретные объекты, хотя можно напрямую обновлять объекты ресурсов.

  • Для ссылки на эти несколько неизмененные конфигурации его можно упаковать в образ, но как насчет переменной конфигурации?
  • Утечка информации может легко привести к угрозе безопасности, особенно конфиденциальной информации, такой как пароли и ключи.
  • После каждого обновления конфигурации необходимо переупаковывать и обновлять приложение. Слишком большое количество версий образов также сильно затрудняет управление образами и хранилище в центре образов.
  • Настройка слишком серьезная, масштабируемость плохая, и ее не легко повторно использовать.

1.2 Как использовать

Существует два способа использования Configmap или Secret: один — назначение системной переменной env, другой — назначение монтирования тома, configmap, записанный env в систему, не будет обновляться в горячем режиме, а метод записи тома поддерживает горячее обновление!

  • Для среды env модуль должен обновляться последовательно, чтобы он вступил в силу, то есть удалить старый модуль и повторно использовать зеркало, чтобы загрузить новый модуль, чтобы загрузить переменные среды, чтобы они вступили в силу.
  • Для метода тома, несмотря на то, что содержимое изменилось, нашему приложению необходимо напрямую отслеживать изменения configmap или постоянно обновлять переменные среды для достижения цели горячего обновления в этом случае.

Приложение не поддерживает горячее обновление.Вы можете запустить sidecar-контейнер в бизнес-контейнере, отслеживать изменения configmap, обновлять файл конфигурации или обновлять pod поочередно, чтобы добиться эффекта обновления конфигурации.

Два решения

Configmap и Secret — это объекты, которые обычно используются Kubernetes, для которых вы можете выбрать данные хранилища по мере необходимости. Кублет будет регулярно обновляться в режиме громкости. Однако при внедрении переменной среды в контейнер обновление содержимого ConfigMap или SecRET невозможно воспринять.

Как сделать так, чтобы бизнес в настоящее время воспринимал изменения в Pod ConfigMap или Secret, или проблему, которую нужно решить. Но у нас все еще есть некоторые обходные пути.

Если сам бизнес поддерживает конфигурацию перезагрузки, например nginx -s reload, вы можете отслеживать обновления файлов через inotify или перезагружать напрямую и регулярно (это можно использовать вместе с нашим readinessProbe).

Если в нашем бизнесе нет такой возможности, учитывая идею неизменной инфраструктуры, можем ли мы сделать это в режиме последовательного обновления? Да, это очень хороший метод. В настоящее время существует инструмент Reloader с открытым исходным кодом, который использует этот метод для автоматического запуска последовательного обновления объектов рабочей нагрузки, таких как Deployment или StatefulSet, после обнаружения обновления объекта путем просмотра ConfigMap и Secret.

Введение в три перезагрузки

3.1 Введение в перезагрузку

Reloader может наблюдать за изменениями в ConfigMap и Secret, а также выполнять последовательные обновления подов с помощью связанных конфигов деплоя, конфигов деплоймента, деплоймонсета и статфулсета.

3.2 установка релоадера

  • Рулевая установка
helm repo add stakater https://stakater.github.io/stakater-charts

helm repo update

helm install stakater/reloader
  • Kustomize
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
  • Установка манифеста ресурса
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml


# 在此安装在common-service 名称空间下,
[root@master reloader]# kubectl apply -f reloader.yaml 
clusterrole.rbac.authorization.k8s.io/reloader-reloader-role created
clusterrolebinding.rbac.authorization.k8s.io/reloader-reloader-role-binding created
deployment.apps/reloader-reloader created
serviceaccount/reloader-reloader created
[root@master reloader]# kubectl get all -n common-service 
NAME                                     READY   STATUS    RESTARTS   AGE
pod/reloader-reloader-66d46d5885-nx64t   1/1     Running   0          15s

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/reloader-reloader   1/1     1            1           16s

NAME                                           DESIRED   CURRENT   READY   AGE
replicaset.apps/reloader-reloader-66d46d5885   1         1         1       16s
  • настроить игнорировать

Reloader можно настроить так, чтобы он игнорировал ресурсы cm или secrets. Его можно настроить с помощью spec.template.spec.containers.args в читателе. .

Args Description
--resources-to-ignore=configMaps To ignore configMaps
--resources-to-ignore=secrets To ignore secrets

3.3 Конфигурация

3.3.1 Автоматическое обновление

reloader.stakater.com/search и reloader.stakater.com/auto не работают вместе. Если у вас есть аннотация reloader.stakater.com/auto : «true» в вашем развертывании, все изменения в карте конфигурации или этом секрете, на которые ссылается этот объект ресурса, перезапустят этот ресурс, независимо от того, совпадают ли они с reloader.stakater.com/ : Аннотация к слову «правда».

kind: Deployment
metadata:
  annotations:
    reloader.stakater.com/auto: "true"
spec:
  template: metadata:

3.3.2 Разработка обновления

Укажите конкретную карту конфигурации или секрет, который будет запускать последовательное обновление только при изменении указанной нами карты конфигурации или секрета, таким образом, он не будет запускать последовательное обновление для всех карт конфигурации или секретов, используемых в развертываниях, фоновых входах в систему или параметрах состояния.

Указанный объект ресурса развертывания только в упомянутой карте конфигурации или секретеreloader.stakater.com/match: "true"Если оно равно true, обновление будет запущено, если false или не отмечено, ресурсный объект не будет отслеживать изменения конфигурации и перезапустится.

kind: Deployment
metadata:
  annotations:
    reloader.stakater.com/search: "true"
spec:
  template:

конфигурация см

kind: ConfigMap
metadata:
  annotations:
    reloader.stakater.com/match: "true"
data:
  key: value

3.3.3 Укажите см

Если развертывание смонтировано с несколькими cm или сценариями, мы надеемся только на то, что после обновления определенного cms развертывание будет обновляться последовательно, а другие cms будут обновляться, но развертывание обновляться не будет. быть указан в развертывании как одиночная реализация или реализация списка.

Например: деплой имеет две configmaps, nginx-cm1 и nginx-cm2, и только когда обновляется nginx-cm1, деплой будет обновляться последовательно.В настоящее время нет необходимости настраивать аннотации в двух cms, только нужно написать в деплоеconfigmap.reloader.stakater.com/reload:nginx-cm1, где при обновлении nginx-cm1 развертывание запускает непрерывное обновление.

Если несколько см непосредственно разделены запятыми

# configmap对象
kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "nginx-cm1"
spec:
  template: metadata:
# secret对象
kind: Deployment
metadata:
  annotations:
    secret.reloader.stakater.com/reload: "foo-secret"
spec:
  template: metadata:

Нет необходимости добавлять аннотации к cm или secret, просто добавьте аннотации к объекту ссылочного ресурса.

Четыре теста

4.1 deploy

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
   # reloader.stakater.com/auto: "true"
    reloader.stakater.com/search: "true"
  labels:
    run: nginx
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        # 必须匹配volumes的名称,定义configmap
        - name: nginx-cm
          mountPath: /data/cfg
          readOnly: true
      volumes:
      # 定义逻辑卷的名称
      - name: nginx-cm
        configMap:
          # 使用configmap资源的名称
          name: nginx-cm
          items:
          # 使用configmap中到那个key
          - key: config.yaml
            # 使用configmap中到key映射到容器中到文件名称
            path: config.yaml
            mode: 0644 

4.2 configmap

apiVersion: v1
data:
  config.yaml: |
    # project settings

    # go2cloud_api service config
    DEFAULT_CONF:
      port: 8888
    # data disk api
    UNITTEST_TENCENT_ZONE: ap-chongqing-1
kind: ConfigMap
metadata:
  name: nginx-cm
  annotations:
    reloader.stakater.com/match: "true"

4.3 Тестирование

[root@master ns-default]# kubectl  get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-68c9bf4ff7-9gmg6   1/1     Running   0          10m
[root@master ns-default]# kubectl  get cm
NAME       DATA   AGE
nginx-cm   1      28m
# 更新cm内容
[root@master ns-default]# kubectl edit cm nginx-cm 
configmap/nginx-cm edited
# 查看po发生了滚动更新,重新加载配置文件
[root@master ns-default]# kubectl get po
NAME                     READY   STATUS              RESTARTS   AGE
nginx-66c758b548-9dllm   0/1     ContainerCreating   0          4s
nginx-68c9bf4ff7-9gmg6   1/1     Running             0          10m

Пять вопросов, требующих внимания

  • Reloader — это глобальный ресурсный объект, его рекомендуется развернуть под ns общедоступной службы, тогда другие ns также смогут нормально использовать функцию reloader.

  • Reloader.stakater.com/auto : если configmap или secret настроены в deploymentconfigmap/deployment/daemonsets/Statefulsets

  • Если используется аннотация secret.reloader.stakater.com/reload или configmap.reloader.stakater.com/reload, тогда значение true перезагрузит только модуль, независимо от того, используется ли configmap или secret.

  • reloader.stakater.com/search и reloader.stakater.com/auto нельзя использовать одновременно. Если у вас есть аннотация reloader.stakater.com/auto: «true» в вашем развертывании, то оно всегда будет перезапускаться после того, как вы изменили configmaps или использовали секреты, независимо от того, есть ли у них reloader.stakater.com или нет /match : Comment for « истинный".

Шесть отражений

Отслеживая ConfigMap и Secret, Reloader автоматически запускает последовательное обновление объектов рабочей нагрузки, таких как Deployment или StatefulSet, как только обнаруживает, что объект обновлен.

Если мы не заходили во внутренний файл конфигурации приложения в режиме реального времени, используйте этот метод, может быть очень легко добиться конфигурации горячего обновления.

Ссылка на ссылку