본문 바로가기

Backend Development/Spring boot

[Backend] Kong Api Gateway 설치

Backend 시스템을 개발시 에 많은 API를 만들게 되나 API 관련해서 체계적으로 Access control 관리나 모니터링, Flow control등을 구현하려면 또다른 노력이 든다.

 

이럴때 앞단에 API Gateway를 설치하면 손쉽게 위 고민들을 해결 할수 있다.

 

많은 API Gateway를 설치할 수 있지만 Opensource 로도 제공하고 도커로 쉽게 설치할 수 있는 Kong gateway를 설치해 보고자 한다.

 

Kong Api Gateway 공식 페이지는 다음과 같다.

https://konghq.com

 

손쉽게 인스톨이 가능한 Docker 인스톨에 대한 설명은 다음 페이지에 소개되어 있다.

https://docs.konghq.com/gateway/latest/install/docker 

https://hub.docker.com/_/kong 

https://bcho.tistory.com/1361

 

Kong Api Gateway 설치

 

kong-net 이름으로 도커 네트워크를 설치한다.

 

root@DESKTOP-GH94F8C:/mnt/c/Users/skkkm# docker network create kong-net
e97f3ca129336be4dce1b84c844870c789a6257953010987c54f1c8115719ebf

 

Postgres container를 실행한다. (이미지가 없을때는 이미지 다운로드 후 컨테이너 실행)

 

 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

 

실행결과

root@DESKTOP-GH94F8C:/mnt/c/Users/skkkm#  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
Unable to find image 'postgres:9.6' locally
9.6: Pulling from library/postgres
1cb79db8a9e7: Pull complete
f6bae7873dd7: Pull complete
8f7722dc50a7: Pull complete
e8622b8cb6f3: Pull complete
d6d74bba3a57: Pull complete
874d4d2a09fd: Pull complete
2d87c3a4038c: Pull complete
f955a6cf127b: Pull complete
f62dc55c568d: Pull complete
4e2c4902efbd: Pull complete
01c676df543a: Pull complete
1e3d335ef0b7: Pull complete
11087f2b0d87: Pull complete
4b9a74ac6ea0: Pull complete
Digest: sha256:caddd35b05cdd56c614ab1f674e63be778e0abdf54e71a7507ff3e28d4902698
Status: Downloaded newer image for postgres:9.6
3933cbd04066ab86317cface42514312d384c111e15cf46fc2359a26fa97c736

 

Kong database 를 준비한다.

 

docker run --rm \
    --network=kong-net \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_PG_USER=kong" \
    -e "KONG_PG_PASSWORD=kong" \
    -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    kong kong migrations bootstrap

 

실행 결과

 

root@DESKTOP-GH94F8C:/mnt/c/Users/skkkm# docker run --rm \
>     --network=kong-net \
>     -e "KONG_DATABASE=postgres" \
>     -e "KONG_PG_HOST=kong-database" \
>     -e "KONG_PG_USER=kong" \
>     -e "KONG_PG_PASSWORD=kong" \
>     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
>     kong kong migrations bootstrap
Unable to find image 'kong:latest' locally
latest: Pulling from library/kong
213ec9aee27d: Pull complete
cd92c70efef8: Pull complete
2e46e65db14b: Pull complete
ef0a423f8e78: Pull complete
Digest: sha256:803bda2f6c38fc042d3ac93625eec8acf1e4dec8db05566876187bb500555394
Status: Downloaded newer image for kong:latest
Bootstrapping database...
migrating core on database 'kong'...
core migrated up to: 000_base (executed)

...

48 migrations processed
48 executed
Database is up-to-date

 

kong api-gateway container를 실행한다.

 

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 8001:8001 \
    -p 8444:8444 \
    kong

 

여기까지 수행하면 kong gateway 는 설치가 완료된 것이다. api-gateway service가 잘 동작하는지 확인해 보려면 아래 curl로 api를 수행해본다.

 

 curl -i -X GET --url http://localhost:8001/services

 

아래와 같이 http 200 ok가 나오면 db와 api-gateway 모듈 설치는 잘 된것이다.

root@DESKTOP-GH94F8C:/mnt/c/Users/skkkm#  curl -i -X GET --url http://localhost:8001/services
HTTP/1.1 200 OK
Date: Sun, 06 Nov 2022 15:02:35 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Content-Length: 23
X-Kong-Admin-Latency: 6
Server: kong/3.0.0

{"next":null,"data":[]}

 

kong admin portal, konga 설치

 

Konga container를 실행한다.

 

docker run -d -p 1337:1337 --network=kong-net --name konga -e "NODE_ENV=development" -e "TOKEN_SECRET=test" pantsel/konga

 

최종적으로 모든 container가 잘 동작되는지 확인해본다.

konga, kong, kong-database 3개가 모두 떠 있으면 설치가 정상적으로 완료된 것이다.

 

root@DESKTOP-GH94F8C:/mnt/c/Users/skkkm# docker container ls -a
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS                   PORTS
                                           NAMES
c6988d7edbaf   pantsel/konga   "/app/start.sh"          8 minutes ago   Up 8 minutes             0.0.0.0:1337->1337/tcp, :::1337->1337/tcp
                                           konga
d0edfbafcd3d   kong            "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes (healthy)   0.0.0.0:8000-8001->8000-8001/tcp, :::8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp, :::8443-8444->8443-8444/tcp   kong
3933cbd04066   postgres:9.6    "docker-entrypoint.s…"   9 minutes ago   Up 9 minutes             0.0.0.0:5432->5432/tcp, :::5432->5432/tcp
                                           kong-database

 

브라우저에서 http://localhost:1337로 접속해서 konga admin portal로 진입한다.

 

아래와 같이 대표 화면에 진입한다.

 

 

회원 가입을 완료하고 로그인 하면 connection 정보를 입력한다. Kong Admin Url이 kong api-gateway admin service를 말하는 것으로 api-gateway의 admin portal port는 8001되어 있고 container 실행 시 kong으로 name을 지정했으므로 

 

http://kong:8001 

 

위와 같이 url을 입력해준다.

 

 

로그인 및 connection이 완료되면 Konga admin portal 대쉬보드 화면으로 로그인 하게 된다.

 

 

-- The End --