Практика применения перца в прямом эфире Kong

API

Что такое Конг

Kong — это платформа шлюза API следующего поколения для современных архитектур (гибридное облако, гибридная организация), отличающаяся облачной архитектурой, высокой производительностью, простотой использования и масштабируемостью.

Применимо к таким сценариям, как Api Gateway, Kubernetes Ingress, Service Mesh Sidecar и т. д.

Основные особенности:

  • Нативное облако: независимый от платформы, Kong может работать с «голого железа» в Kubernetes
  • Высокая производительность: при поддержке nginx с неблокирующей связью производительность само собой разумеющаяся.
  • Механизм подключаемых модулей: предоставляет множество готовых подключаемых модулей и имеет настраиваемый интерфейс подключаемых модулей, который легко расширять, пользователи могут использовать Lua для самостоятельной разработки подключаемых модулей.
  • Слияние: слияние может быть достигнуто с помощью плагинов, чтобы избежать системных лавин.
  • Ведение журнала: может регистрировать запросы и ответы HTTP, TCP, UDP через Kong.
  • Аутентификация: контроль разрешений, черный и белый список IP, а также функции OpenResty
  • SSL: Setup a Specific SSL Certificate for an underlying service or API.
  • Мониторинг: Kong предоставляет плагин для мониторинга в реальном времени.
  • Аутентификация: поддерживает распространенные протоколы, такие как HMAC, JWT, Basic, OAuth 2.0.
  • Текущее ограничение: Текущее ограничение определенных интерфейсов одной службы может быть реализовано с помощью подключаемых модулей, чтобы избежать перегрузки службы и вызвать ее недоступность.
  • REST API: управление конфигурацией через Rest API, свободное от громоздких файлов конфигурации.
  • Проверка работоспособности: автоматическая проверка, пассивная проверка, узел недоступен Синхронизация со всеми узлами kong занимает 1-2 секунды
  • Динамическая маршрутизация: OpenResty+Lua отстает от Kong, поэтому он наследует функции динамической маршрутизации от OpenResty.

Зачем использовать Конг

Проблемы, которые нам нужно решить сейчас

  1. Единый вход:В среде микросервисов на стороне сервера проверка разрешений интерфейса, ограничение IP-адресов и ограничение тока реализуются отдельно в каждом сервисе. Единого входа нет, что неудобно для единого управления.
  2. Простота использования, масштабируемость:Стек технологий на стороне сервера в основном разработан LNMP, и в настоящее время разрабатывается стек технологий микросервисов на основе Spring Boot и Spring Clound. Это процесс миграции в градациях серого, и нам нужно, чтобы Proxy был простым в эксплуатации и управлении.
  3. Выпуск непрерывной интеграции:Для интернет-продуктов 2C пользователи используют сервисы постоянно, в то же время продукты постоянно дорабатываются, а сервисы могут выпускаться постоянно, поэтому требуются возможности горячего развертывания, и они автоматизированы. Но сервис на основе Spring Boot запускается за 15-30 секунд, а нам нужны сине-зеленые возможности публикации Kong.

Kong прекрасно решает вышеперечисленные проблемы.Решения следующие:

  1. Единый вход:Его можно использовать в качестве единой точки входа для микросервисов, которые могут реализовать единую реализацию текущего ограничения, проверки разрешений, журнала, ограничения IP и т. д.

avatar

  1. Простота использования, масштабируемость:Обеспечивает спокойный режим работы и имеет инструменты управления приборной панелью.

    # 创建一个名称 hello 的 upstream
    curl -X POST http://localhost:8001/upstreams --data "name=hello"
    
    # 为 hello 添加两个负载均衡节点
    curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8080" --data "weight=100"
    
    curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8081" --data "weight=100"
    
    # 配置一个service
    curl -X POST http://localhost:8001/services --data "name=hello" --data "host=hello"
    
    # 为service 配置路由
    curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id={$service.id 配置上面service返回的}"
    

    Скриншот инструмента приборной панели

    avatar

  2. Выпуск непрерывной интеграции:В сотрудничестве с GitLab CI/CD после отправки кода в кодовую базу он автоматически упаковывается, выполняется тестовые примеры и сине-зеленое развертывание.

    avatar

Как мы используем Конг

В настоящее время используется диаграмма архитектуры Kong

avatar

Кластер Конг
  1. Все узлы подключены к дата-центру

    • Используйте механизм master-slave Postgresql для обеспечения высокой доступности базы данных, обратите внимание на использование версии 9.6 или выше.
  2. Все узлы будут периодически выполнять задачи, и данные синхронизации в конечном итоге будут согласованными.

    • Параметр конфигурации: db_update_frequency (по умолчанию: 5 секунд)
    • Каждые секунды db_update_frequency все узлы будут извлекать все обновления из базы данных, и, если есть синхронизация с изменениями обновления, очищать локальный кеш.
    • Если база данных Postgresql ненормальна, узел все еще может предоставлять услуги, используя исходные данные.
  3. У узла есть локальный кеш, и время истечения кеша можно установить

    • Параметр конфигурации: db_cache_ttl (по умолчанию: 0 с)
    • Когда центр обработки данных работает ненормально, полагаясь на локальный кеш, все еще можно предоставлять услуги.
  4. Поддержка динамического расширения, см. приведенную выше архитектурную схему, кластер Kong находится позади Lvs.

    • Добавьте новый узел, синхронизируйте конфигурацию других узлов, убедитесь, что он в норме, добавьте его в ТС ЛВС, а затем предоставьте услугу
    • Для удаления узла достаточно удалить РС Лвс, он не будет предоставлять услуги
    • Измените конфигурацию узла, сначала удалите конг RS из Lvs, перезапустите после модификации, убедитесь, что это нормально, и поместите его обратно в RS Lvs
  5. поддержка gRPC

    # /etc/kong/kong.conf
    proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl, 0.0.0.0:9080 http2
    
  6. сервисный мониторинг

    • Используйте естественную комбинацию prometheus, grafana и Kong
      avatar

Меры предосторожности

  1. Унифицированный файл шаблона kong/templates/nginx_kong.lua
  2. Чтобы бревно конга хорошо резало, мы используем logrotate.
Плагин Конга
  • Конг имеет множество подключаемых функций.Существует множество встроенных подключаемых модулей, включая аутентификацию, ограничение тока, ведение журнала и другие соответствующие подключаемые модули.Конечно, вы также можете настроить подключаемые модули.После успешной загрузки, вы можете добавлять и использовать их в этом интерфейсе.

avatar

  • Разные плагины имеют разные параметры, которые необходимо настроить, после завершения настройки они будут активированы.

    Например: это встроенный плагин key-auth, который используется для аутентификации API, после установки ключа доступ могут получить только те, кто прошел аутентификацию

  • Настройте разработку и развертывание, а также разработайте подключаемые модули в соответствии с потребностями бизнеса.

    Основной процесс

    1. Скачать шаблон

    базовая простая версия

    simple-plugin
    ├── handler.lua
    └── schema.lua
    

    передовой

    complete-plugin
    ├── api.lua
    ├── daos.lua
    ├── handler.lua
    ├── migrations
    │   ├── cassandra.lua
    │   └── postgres.lua
    └── schema.lua
    

    Необходимые файлы: handler.lua и schema.lua

    1. Измените файл handler.lua, там много функций, и в этих функциях прописана кастомная логика

      kong вызовет соответствующую функцию на определенном этапе

    local BasePlugin = require "kong.plugins.base_plugin"
    
    -- The actual logic is implemented in those modules
    local access = require "kong.plugins.my-custom-plugin.access"
    local body_filter = require "kong.plugins.my-custom-plugin.body_filter"
    
    local CustomHandler = BasePlugin:extend()
    
    function CustomHandler:new()
        CustomHandler.super.new(self, "my-custom-plugin")
    end
    
    function CustomHandler:access(config)
        CustomHandler.super.access(self)
    
        -- Execute any function from the module loaded in `access`,
        -- for example, `execute()` and passing it the plugin's configuration.
        access.execute(config)
    end
    
    function CustomHandler:body_filter(config)
        CustomHandler.super.body_filter(self)
    
        -- Execute any function from the module loaded in `body_filter`,
        -- for example, `execute()` and passing it the plugin's configuration.
        body_filter.execute(config)
    end
    
    return CustomHandler
    
    
    1. Измените файл schema.lua, в основном для настройки некоторых параметров и проверки параметров.
    return {
        no_consumer = true, -- this plugin will only be applied to Services or Routes,
        fields = {
            -- Describe your plugin's configuration's schema here.
        },
        self_check = function(schema, plugin_t, dao, is_updating)
            -- perform any custom verification
            return true
        end
    }
    
    1. Настройка развертывания

      Файл плагина находится в

      /data/kong/plugins/simple-plugin/
      

      Затем настройте Kong.conf

      lua_package_path = /data/?.lua;($default);
      plugins = bundled,simple-plugin
      

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

Проблемы онлайн
  1. Возвращаемый контент слишком велик, вам необходимо увеличить буфер (ошибка кеша ответа восходящего потока) Изменить настройку

    nginx_proxy_proxy_buffer_size=128k
    nginx_proxy_proxy_buffers=4 256k
    nginx_proxy_proxy_busy_buffers_size=256k
    
  2. Необходимо обратить внимание на свойства конфигурации

    • атрибут strip_path
    如果设置为 true, paths 设置有值,那么请求将会被替换掉
    { "paths": ["/service"], "strip_path": true, "service": { "id": "..." }}
    请求:GET /service/path/to/resource HTTP/1.1Host: …
    Proxy: GET /path/to/resource HTTP/1.1
    
    { "paths": ["/version/\d+/service"], "strip_path": true, "service": { "id": "..." }
    请求:GET /version/1/service/path/to/resource HTTP/1.1
    Proxy: GET /path/to/resource HTTP/1.1
    
    • атрибут save_host
    如果设置为 true,代理后仍然保留 header 请求 host
    请求:GET / HTTP/1.1Host: service.com
    Proxy: GET / HTTP/1.1Host: service.com
    
    设置为false,将不保留header host
    GET / HTTP/1.1Host: service.com
    GET / HTTP/1.1Host: <my-service-host.com>
    

Суммировать

Kong является относительно зрелым продуктом с открытым исходным кодом в отрасли, который хорошо работает с точки зрения производительности, простоты использования и расширения.

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

Давайте свободно летать в сложных архитектурах, таких как собственное частное облако Kunernetes, облако Hulk и облако Alibaba.