Como Instalar e Configurar o Kong Gateway e o Kong Manager Usando Docker

Como Instalar e Configurar o Kong Gateway e o Kong Manager Usando Docker

Estava testando o Kong Manager, pois estava acostumado a usar somente kong deck ou KONGA. E após testar bastante, decidi resumir o teste para um post sobre como rodar do zero o Kong Gateway da sua máquina com docker e configurar um serviço e 2 rotas para o funcionamento básico via Kong Manager.

Caso exista o interesse de algumas pessoas, posso fazer outras partes falando sobre outras features que o Kong Gateway possui, desde como habilitar os logs de todas requisições e gerar dashboards no kibana / grafana, utilização de alguns plugins, consumers, entre outras features.

Mas o que é o Kong Gateway?

O Kong Gateway é uma plataforma open-source amplamente reconhecida como um API Gateway, projetada para gerenciar e proteger APIs de forma centralizada, operando na borda da infraestrutura. Ele atua como um intermediário entre os clientes e os serviços de backend, facilitando o controle e a escalabilidade das APIs. Com o Kong, você pode realizar um gerenciamento eficiente, seguro e centralizado de suas interfaces. A plataforma oferece uma ampla gama de funcionalidades avançadas, incluindo:

  • Roteamento de APIs: permite que você direcione o tráfego para diferentes serviços backend de forma inteligente.

  • Autenticação e Segurança: protege suas APIs com métodos de autenticação como OAuth, JWT, ou API keys.

  • Escalabilidade e Performance: projetado para lidar com grandes volumes de requisições em ambientes de produção de alto tráfego.

  • Monitoramento e Logs: permite rastrear e monitorar todo o tráfego através do gateway, essencial para manter o controle e otimizar o desempenho.

  • Flexibilidade com Plugins: você pode adicionar funcionalidades como cache, rate-limiting, gRPC, AWS Lambda diretamente na rota, entre outros, através de plugins customizáveis, ou criando o seu próprio plugin em Lua ou Go.

Além disso, nas novas versões do Kong temos o gerenciamento através do Kong Manager, uma interface gráfica simples e intuitiva, acessível pela porta 8002. Com ela, você pode configurar e monitorar APIs sem a necessidade de lidar com comandos complexos.

Existe outra possibilidade de configurar diretamente todo o kong via porta 8001 via cURL.

Ou se deseja manter suas rotas e configurações versionadas, é possível integrar utilizando o projeto https://github.com/Kong/deck, mas deixaremos isso para outro post.

Passo a Passo para rodar e configurar o Kong:

  1. Configurar o Docker Compose

    Crie o seguinte arquivo docker-compose.yml para rodar o Kong, o PostgreSQL e o Kong Manager:

     version: '3.5'
    
     services:
    
       kong-migrations:
         image: kong:latest
         command: kong migrations bootstrap
         environment:
           KONG_DATABASE: postgres
           KONG_PG_HOST: db_postgres
           KONG_PG_USER: kong
           KONG_PG_PASSWORD: kong
           KONG_PG_DATABASE: kong
         depends_on:
           - db_postgres
         networks:
           - kong-net
         restart: "no"
    
       kong:
         image: kong:latest
         environment:
           KONG_DATABASE: postgres
           KONG_PG_HOST: db_postgres
           KONG_PG_USER: kong
           KONG_PG_PASSWORD: kong
           KONG_PG_DATABASE: kong
           KONG_PROXY_ACCESS_LOG: /dev/stdout
           KONG_PROXY_ERROR_LOG: /dev/stderr
           KONG_ADMIN_ACCESS_LOG: /dev/stdout
           KONG_ADMIN_ERROR_LOG: /dev/stderr
           KONG_ADMIN_LISTEN: 0.0.0.0:8001
           KONG_PROXY_LISTEN: 0.0.0.0:8000
           KONG_ADMIN_GUI_LISTEN: 0.0.0.0:8002
           KONG_PORTAL_GUI_HOST: localhost:8002
         ports:
           - "8000:8000"  # Proxy
           - "8001:8001"  # Admin API
           - "8002:8002"  # Kong Manager (Admin GUI)
         depends_on:
           - kong-migrations
           - db_postgres
         restart: on-failure
         networks:
           - kong-net
    
       db_postgres:
         image: postgres:latest
         environment:
           POSTGRES_DB: kong
           POSTGRES_USER: kong
           POSTGRES_PASSWORD: kong
           POSTGRES_HOST_AUTH_METHOD: trust
         healthcheck:
           test: ["CMD", "pg_isready", "-U", "kong"]
           interval: 5s
           timeout: 10s
           retries: 5
         networks:
           - kong-net
         restart: on-failure
    
     networks:
       kong-net:
         driver: bridge
    

    Esta configuração do Docker Compose cria um ambiente para o Kong Gateway e um banco de dados PostgreSQL.

    1. kong-migrations: Executa as migrations para configurar o banco de dados do Kong.

    2. kong: Configura o Kong para gerenciar APIs, ouvindo nas portas 8000 (proxy), 8001 (admin) e 8002 (Kong Manager).

    3. db_postgres: Inicia um banco de dados PostgreSQL para armazenar dados do Kong, com verificações de saúde para garantir que está ativo.

    4. kong-net: Cria uma rede bridge para facilitar a comunicação entre os serviços.

  2. Rodar o Docker Compose

    No terminal, execute o comando:

     docker-compose up
    

    Isso iniciará o Kong, o PostgreSQL e o Kong Manager.

  3. Entendendo as portas do Kong:

    • 8000: Porta padrão para o Proxy, onde suas APIs serão expostas.

    • 8001: Porta para a Admin API, usada para configurar serviços, rotas, plugins e mais.

    • 8002: Porta do Kong Manager, a interface gráfica que facilita a administração das APIs.

  4. Acessar o Kong Manager

    Após subir os containers, acesse o Kong Manager em http://localhost:8002. Aqui você pode gerenciar seus serviços e rotas de maneira fácil e visual.

  5. Criar um Serviço

    No Kong Manager:

    • Vá para a aba Gateway Services.

    • Crie um novo serviço com as seguintes configurações:

  1. Criar uma Rota para /api/v2/pokemon/ditto

    Após criar o serviço, configure uma rota:

    • Name: Nome da Rota (meu caso, PokemonDitto)

    • Service: Selecionar o PokeAPI (ID do service (host) onde vai intermediar a rota)

    • Path: /api/v2/pokemon/ditto

    • View Advanced Fields

    • Desmarcar opção: Strip Path

    • Save

Agora, toda vez que você fizer uma requisição para http://localhost:8000/api/v2/pokemon/ditto, o Kong encaminhará a chamada para o serviço https://pokeapi.co/api/v2/pokemon/ditto.

O problema de ter somente uma rota mapeada e para o pokemon ditto, é que qualquer outro pokemon não será encontrado. Por exemplo se acessarmos agora http://localhost:8000/api/v2/pokemon/pikachu, teremos a pagina de rota não encontrada:

Criar uma Rota para acessar qualquer pokemon

Para permitir que qualquer rota dentro de /api/v2/pokemon seja capturada, crie uma nova rota:

    • Name: Nome da Rota (meu caso, Pokemon)

      • Service: Selecionar o PokeAPI (ID do service (host) onde vai intermediar a rota)

      • Path: /api/v2/pokemon

      • View Advanced Fields

      • Desmarcar opção: Strip Path

      • Save

Isso permitirá que qualquer chamada para /api/v2/pokemon/<nome> seja roteada corretamente, como /api/v2/pokemon/pikachu.

Agora você pode gerenciar suas APIs com facilidade através do Kong Manager!

Lembrando que a ideia não era trazer muita complexidade para este primeiro post, mas conseguir rodar o kong local e fazer upstreams de 2 ou mais rotas.

Aproveitando, sugiro fortemente para que todos olhem o post do Leonardo do Carmo sobre Ambiente de desenvolvimento das galáxias usando Docker com várias ferramentas indispensáveis para o ambiente local.

É isso, espero que gostem =P