본문 바로가기

Programming

Kong API Gateway #1 - 개념 & 설치

반응형

안녕하세요. 남산돈가스입니다.

마이크로 서비스 아키텍처(이하 MSA)의 개념이 대두되면서 핵심기술이라고 할 수 있는 API Gateway의 필요성이 늘어났습니다.

그 중에서 오늘은 Kong API Gateway에 대해서 알아보려고 합니다.

Kong이란 무엇인가?

Kong 공식페이지를 보면, Kong은 MSA구성을 가속화하는 가장 유명한 오픈 소스 API Gateway라고 말합니다. 또한 경량화 된 프록시 환경위에 구축 되어 있어, 어디서든지 모든 마이크로 서비스에 성능 및 확장성을 제공한다고 합니다. 

이외에도 가장 큰 특징은, 모든 기능을 Restful Interface로 제공하고 있으며, API Gateway를 구성하는 필수 기능들, 예를 들면 OAuth 인증, Logging, 유량제어 등을 Plugin 기반으로 손쉽게 추가하여 사용할 수 있으며, 위에서 언급한대로 Platform(런타임)에 구애받지 않고 어디서든지 Kong을 구축할 수 있습니다.

Kong의 Feature [Kong 공식페이지]

Kong 시작하기

여러 문서나 블로그를 찾아보았는데, 대부분 Docker를 이용하여 설치를 진행하시는 것 같아 저도 Docker를 이용하여 설치를 해보겠습니다.

kong은 두 가지 타입으로 설치할 수 있는데, With a Database 와 DB-less Mode가 있습니다. 아무래도 DB-less는 설정 같은 것들이나 데이터들을 확인하는 것에 제한적인 부분이 있겠죠. DB까지 설치해서 연결해야하나... 귀찮다고 생각했지만, 시작하는 김에 제대로 시작해보자 + Docker를 이용해서 설치하는 이유로 With a Database로 진행하기로 하였습니다.

1. docker network 생성

docker를 이용하기 때문에 DB, Kong 컨테이너 간 통신을 위해서 docker network를 생성하여 네트워크를 구성합니다.

$ ➜  ~ docker network create kong-net
2b215e19bd6b7f73832b8b9048888ec8d9414c156f6a02dbd607beba787c8bb4

2. Database 설치 / 구동

Kong은 현재 Cassandra 와 PostgreSQL을 지원하고 있습니다. 예제에서는 PostgreSQL로 설치하겠습니다.

$  ~ docker run -d --name kong-database \ 
                   --network=kong-net \ 
                   -p 5432:5432 \
                   -e "POSTGRES_USER=kong" \
                   -e "POSTGRES_DB=kong" \
                   -e "POSTGRES_PASSWORD=kong" \
                   postgres:9.6
19809b4df11834a92d50b2c1369edefa0403c46dd998b7c2781cf7364d5f83b7
$  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
19809b4df118        postgres:9.6        "docker-entrypoint.s…"   34 seconds ago      Up 33 seconds       0.0.0.0:5432->5432/tcp   kong-database

3. Database Setting (최초 설정)

2번에서 Database를 PostgreSQL로 설치는 완료했지만, 저 DB는 현재 아무것도 없는 껍데기 상태의 DB이기 때문에, kong의 bootstrap환경을 migration하여 DB 스키마를 최초 설정해주는 Step입니다.

$  ~ docker run --rm  \ 
                --network=kong-net \
                -e "KONG_DATABASE=postgres" \
                -e "KONG_PG_HOST=kong-database" \
                -e "KONG_PG_PASSWORD=kong" \
                -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
                kong:latest kong migrations bootstrap
Unable to find image 'kong:latest' locally
latest: Pulling from library/kong
cbdbe7a5bc2a: Pull complete
79162f4c0961: Pull complete
362c162bd110: Pull complete
8e4da51840b6: Pull complete
Digest: sha256:32a09516a4fad6a7d42a90f7f754970555027a73e349b980a72c7120e00488b4
Status: Downloaded newer image for kong:latest
Bootstrapping database...
migrating core on database 'kong'...
core migrated up to: 000_base (executed)
core migrated up to: 003_100_to_110 (executed)
core migrated up to: 004_110_to_120 (executed)
core migrated up to: 005_120_to_130 (executed)
core migrated up to: 006_130_to_140 (executed)
core migrated up to: 007_140_to_150 (executed)
core migrated up to: 008_150_to_200 (executed)
migrating hmac-auth on database 'kong'...
hmac-auth migrated up to: 000_base_hmac_auth (executed)
hmac-auth migrated up to: 002_130_to_140 (executed)
migrating oauth2 on database 'kong'...
oauth2 migrated up to: 000_base_oauth2 (executed)
oauth2 migrated up to: 003_130_to_140 (executed)
migrating jwt on database 'kong'...
jwt migrated up to: 000_base_jwt (executed)
jwt migrated up to: 002_130_to_140 (executed)
migrating basic-auth on database 'kong'...
basic-auth migrated up to: 000_base_basic_auth (executed)
basic-auth migrated up to: 002_130_to_140 (executed)
migrating key-auth on database 'kong'...
key-auth migrated up to: 000_base_key_auth (executed)
key-auth migrated up to: 002_130_to_140 (executed)
migrating rate-limiting on database 'kong'...
rate-limiting migrated up to: 000_base_rate_limiting (executed)
rate-limiting migrated up to: 003_10_to_112 (executed)
migrating acl on database 'kong'...
acl migrated up to: 000_base_acl (executed)
acl migrated up to: 002_130_to_140 (executed)
migrating acme on database 'kong'...
acme migrated up to: 000_base_acme (executed)
migrating response-ratelimiting on database 'kong'...
response-ratelimiting migrated up to: 000_base_response_rate_limiting (executed)
migrating session on database 'kong'...
session migrated up to: 000_base_session (executed)
24 migrations processed
24 executed
Database is up-to-date

Migration 완료 후 생성 된 kong의 기초 DB 설정

4. Kong 설치 / 구동

3번에서 Migration을 완료하여 Database는 이제 준비가 되었고, 이제 Kong을 준비한 DB 컨테이너와 연결하여 구동해보겠습니다.

$  ~ docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_PG_PASSWORD=kong" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
     -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
     -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
     -p 8000:8000 \
     -p 8443:8443 \
     -p 127.0.0.1:8001:8001 \
     -p 127.0.0.1:8444:8444 \
     kong:latest
7eeac6e52ebf12cf8c1adf434bb763c3afab27ee890ce7cdc74f7ce790294ad3

5. Kong 구동 확인

Admin Port인 8001번으로 curl 요청을 해보면 200 OK를 확인하실 수 있습니다.

$  ~ curl -I http://localhost:8001
HTTP/1.1 200 OK
Server: openresty
Date: Thu, 21 May 2020 02:12:06 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Access-Control-Allow-Origin: *
X-Kong-Admin-Latency: 0

 

오늘은 Kong의 기본 개념과 Docker를 이용한 설치까지 해보았습니다. 다음 포스팅에선 설치 된 Kong으로 여러 API를 등록하고 사용해보는 내용을 작성해보겠습니다.

감사합니다.