Что такое Конг
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.
Зачем использовать Конг
Проблемы, которые нам нужно решить сейчас
- Единый вход:В среде микросервисов на стороне сервера проверка разрешений интерфейса, ограничение IP-адресов и ограничение тока реализуются отдельно в каждом сервисе. Единого входа нет, что неудобно для единого управления.
- Простота использования, масштабируемость:Стек технологий на стороне сервера в основном разработан LNMP, и в настоящее время разрабатывается стек технологий микросервисов на основе Spring Boot и Spring Clound. Это процесс миграции в градациях серого, и нам нужно, чтобы Proxy был простым в эксплуатации и управлении.
- Выпуск непрерывной интеграции:Для интернет-продуктов 2C пользователи используют сервисы постоянно, в то же время продукты постоянно дорабатываются, а сервисы могут выпускаться постоянно, поэтому требуются возможности горячего развертывания, и они автоматизированы. Но сервис на основе Spring Boot запускается за 15-30 секунд, а нам нужны сине-зеленые возможности публикации Kong.
Kong прекрасно решает вышеперечисленные проблемы.Решения следующие:
- Единый вход:Его можно использовать в качестве единой точки входа для микросервисов, которые могут реализовать единую реализацию текущего ограничения, проверки разрешений, журнала, ограничения IP и т. д.
-
Простота использования, масштабируемость:Обеспечивает спокойный режим работы и имеет инструменты управления приборной панелью.
# 创建一个名称 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返回的}"
Скриншот инструмента приборной панели
-
Выпуск непрерывной интеграции:В сотрудничестве с GitLab CI/CD после отправки кода в кодовую базу он автоматически упаковывается, выполняется тестовые примеры и сине-зеленое развертывание.
Как мы используем Конг
В настоящее время используется диаграмма архитектуры Kong
Кластер Конг
-
Все узлы подключены к дата-центру
- Используйте механизм master-slave Postgresql для обеспечения высокой доступности базы данных, обратите внимание на использование версии 9.6 или выше.
-
Все узлы будут периодически выполнять задачи, и данные синхронизации в конечном итоге будут согласованными.
- Параметр конфигурации: db_update_frequency (по умолчанию: 5 секунд)
- Каждые секунды db_update_frequency все узлы будут извлекать все обновления из базы данных, и, если есть синхронизация с изменениями обновления, очищать локальный кеш.
- Если база данных Postgresql ненормальна, узел все еще может предоставлять услуги, используя исходные данные.
-
У узла есть локальный кеш, и время истечения кеша можно установить
- Параметр конфигурации: db_cache_ttl (по умолчанию: 0 с)
- Когда центр обработки данных работает ненормально, полагаясь на локальный кеш, все еще можно предоставлять услуги.
-
Поддержка динамического расширения, см. приведенную выше архитектурную схему, кластер Kong находится позади Lvs.
- Добавьте новый узел, синхронизируйте конфигурацию других узлов, убедитесь, что он в норме, добавьте его в ТС ЛВС, а затем предоставьте услугу
- Для удаления узла достаточно удалить РС Лвс, он не будет предоставлять услуги
- Измените конфигурацию узла, сначала удалите конг RS из Lvs, перезапустите после модификации, убедитесь, что это нормально, и поместите его обратно в RS Lvs
-
поддержка gRPC
# /etc/kong/kong.conf proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl, 0.0.0.0:9080 http2
-
сервисный мониторинг
- Используйте естественную комбинацию prometheus, grafana и Kong
Меры предосторожности
- Унифицированный файл шаблона kong/templates/nginx_kong.lua
- Чтобы бревно конга хорошо резало, мы используем logrotate.
Плагин Конга
- Конг имеет множество подключаемых функций.Существует множество встроенных подключаемых модулей, включая аутентификацию, ограничение тока, ведение журнала и другие соответствующие подключаемые модули.Конечно, вы также можете настроить подключаемые модули.После успешной загрузки, вы можете добавлять и использовать их в этом интерфейсе.
-
Разные плагины имеют разные параметры, которые необходимо настроить, после завершения настройки они будут активированы.
Например: это встроенный плагин key-auth, который используется для аутентификации API, после установки ключа доступ могут получить только те, кто прошел аутентификацию
-
Настройте разработку и развертывание, а также разработайте подключаемые модули в соответствии с потребностями бизнеса.
Основной процесс
- Скачать шаблон
базовая простая версия
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
-
Измените файл 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
- Измените файл 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 }
-
Настройка развертывания
Файл плагина находится в
/data/kong/plugins/simple-plugin/
Затем настройте Kong.conf
lua_package_path = /data/?.lua;($default); plugins = bundled,simple-plugin
затем перезагрузить конг Если в плагине lua нет ошибок, вы можете увидеть, как он загружается в фоновом режиме.
Проблемы онлайн
-
Возвращаемый контент слишком велик, вам необходимо увеличить буфер (ошибка кеша ответа восходящего потока) Изменить настройку
nginx_proxy_proxy_buffer_size=128k nginx_proxy_proxy_buffers=4 256k nginx_proxy_proxy_busy_buffers_size=256k
-
Необходимо обратить внимание на свойства конфигурации
- атрибут 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.