MSA (microservice architecture) 에 대해 책 한권을 선택해 동료들과 함께 스터를 진행했고, 거기에서 Gateway의 중요성을 알게 되었다. 마이크로서비스 패턴이란 책인데 정말 강추한다. 나처럼 잘 모르던 사람도 이 책을 독파하니, MSA 관련 용어에 대해서 확실히 이해할수 있고, 특히 이 책은 JAVA 예제가 같이 나와서 추상적인 개념?만 나열되어 읽다가 졸거나 지치지 않고, 실제 MSA 적용시 고려할만한 대표적인 여러 패턴에 대해 설명을 해줘서 이해가 쏙쏙 되었다.
아무튼 그 책에서도 추천하는 OSS Gateway는 바로 Kong Gateway였다. Kong Gateway는 가장 유명한 OSS Gateway로 Lua언어로 Nginx 기반으로 구현된 Solution이다. 사실 성능은 KrakenD 라는 최근에 Go 언어로 개발되어 Go의 Concurrency, Speed의 장점을 활용한 Solution이 좋다고 한다. 그럼에도 불구하고, 오랜 기간 문제 없이 많이 사용되어오고, 다양한 Plugin이 무료로 제공되는 Kong Gateway를 아직도 많이 사용하고 있다.
난 늘 그렇듯이 문서를 100번 읽어봤자 실제로 해봐야 이해하는 수준 ^^;; 이기에 Kong Gateway를 사용보기로 했다.
Kong 의 기본 구조
Enterprise는 못해보니 OSS 만 살펴보면,
- Admin API : 이 API를 통해 Gateway에 연동할 Consumer, Service, Route 등을 설정할수 있다.
- 기본적인 흐름: API CLIENT --- ROUTE --- SERVICE
- Consumer: Service를 사용하는 사용자로 Consumer 설정을 통해 Access Control 이 가능하다.
- Plugins : 기본적으로 제공하는 여러 Plugin이 있다. 내가 사용해본것은 아래 세가지다
Kong Gateway 설치
Docker 와 Kubernetes 두 가지 방법을 이용해서 배포해보았다.
DBLess mode
Kong Gateway의 단점으로 DB를 사용해야 한다는 것이었는데 최근에 DBLess 로도 사용가능하다고 해서 Docker 로 실행해봤다.
- 8000 port: Kong Gateway Proxy port
- 8001 port: Admin API 제공 port (Service, Route, Plugin...등 설정)
$ docker network create kong-net
$ docker run -d --name kong \
-e "KONG_DATABASE=off" \
-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
Service, Route, Plugin 설정
✅ kong 설정 파일 탬플릿 가져오기
$ docker exec -it kong kong config init /home/kong/kong.yml
$ docker exec -it kong cat /home/kong/kong.yml >> kong.yml
✅ kong 설정파일 적용 (dynamic 하게 적용가능)
$ http :8001/config config=@kong.yml
✅ proto 파일 docker container에 저장
$ docker cp helloworld.proto kong:/usr/local/kong/
<kong.yaml>
- Services (backend): gRPC server (:50052)
- Routes: HTTP 기본 path
- Plugins (Route): grpc-gateway plugin (HTTP 요청을 gRPC로 변환해주는 plugin)
services:
- name: my-service
protocol: grpc
host: 192.168.X.X
port: 50052
routes:
- name: my-route
protocols:
- http
paths:
- /
plugins:
- name: grpc-gateway
config:
proto: usr/local/kong/helloworld.proto
동작 테스트
$ http POST localhost:8000/say/hello name='키키' extra='즐거운 목요일 아침이야~'
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: application/json
Date: ...
Transfer-Encoding: chunked
Via: kong/2.5.0
X-Kong-Proxy-Latency: 1
X-Kong-Upstream-Latency: 3
{
"message": "Hello 키키! 즐거운 목요일 아침이야~"
}
DB mode
postgres database를 연동하여 DB사용하는 기존 Kong Gateway 방식으로 설치 및 실행
참고: https://docs.konghq.com/install/docker/?_ga=2.176677285.1242572581.1632364913-1596292690.1632088424
✅ Create a Docker network
$ docker network create kong-net
✅ Start your database
$ 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
$ 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_PG_USER=kong" \
-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
Service, Route, Plugin 설정
Admin API를 통해 설정 가능하지만... 너무 불편함.
✅ Service 생성
$ curl --request POST \
--url http://localhost:8001/services \
--header 'Content-Type: application/json' \
--data '{
"name": "my-service",
"protocol": "grpc",
"host": "192.168.X.X",
"port":50052
}'
✅ Route
$ curl --request POST \
--url http://localhost:8001/services/my-service/routes \
--header 'Content-Type: application/json' \
--data '{
"name": "my-route",
"protocols": ["http"],
"paths": ["/"]
}'
✅ Route에 gRPC plugin
$ curl --request POST \
--url http://localhost:8001/routes/my-route/plugins \
--header 'Content-Type: application/json' \
--data '{
"name": "grpc-gateway",
"config": {
"proto": "usr/local/kong/helloworld.proto"
}
}'
Kubernetes
Kong GW 를 EKS 에 배포하기 위해서 Kong에서는 Helm Chart를 제공하고 있어 원하는 설정을 values.yaml에 정의하고 배포하면 된다. 편리한 점은 설정값을 주면 sub chart로 postgresql 도 한번에 설치할 수 있다.
$ helm install kong kong/kong --values kong_values.yaml
<kong_values.yaml>
image:
repository: kong
tag: "2.5"
env:
database: "postgres"
pg_host: kong-postgresql
pg_port: 5432
pg_timeout: 5000
pg_user: kong
pg_password: kong
pg_database: kong
ingressController:
installCRDs: false
postgresql:
enabled: true
postgresqlUsername: kong
postgresqlDatabase: kong
postgresqlPassword: kong
service:
port: 5432
admin:
enabled: true
http:
enabled: true
Konga
참고: https://github.com/pantsel/konga
이미 훌륭한 개발자들이 Kong Admin 을 위한 UI를 개발하였다. 우린 그걸 사용하면 된다. ^^
✅ Prepare the database
docker run -d --name konga-database \
--network kong-net \
-p 5433:5432 \
-e "POSTGRES_USER=konga" \
-e "POSTGRES_DB=konga" \
-e "POSTGRES_PASSWORD=konga" \
postgres:9.6
✅ Start Konga
docker run -p 1337:1337 \
--network kong-net \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=192.168.X.X" \ 👈 나의 경우, local IP를 넣줘야..
-e "DB_USER=konga" \
-e "DB_PORT=5433" \
-e "DB_PASSWORD=konga" \
-e "DB_DATABASE=konga" \
--name konga \
pantsel/konga
Konga 접속 http://localhost:1337
UI가 있으니 쉽게 Service 생성하고 Route, Plugin까지 설정할수 있었다.
정리
- Kong gateway는 OSS gateway로 가장 많이 사용되고 있는 솔루션이다.
- DB mode와 DBless mode가 있는데 DBless mode에서는 지원안하는 plugin이 있어 DB mode를 사용하는게 좋다.
- Helm chart로 배포하면 subchart로 postgres db를 한번에 같이 설치할수 있어 편리하다.
- 그 명성에 맞게? 다양한 plugin을 제공하고 있고, plugin을 개발할수 있는 여러 언어 (python, go, javascript) 의 PDK(plugin development kit)가 있어 원하는 plugin을 개발하여 적용할 수 있다.
- Admin API를 통해 Service, Route, Plugin을 설정할수 있는데, Konga 를 이용하면 UI를 통해 쉽게 설정가능하다.
'자습' 카테고리의 다른 글
Spring Native (0) | 2022.05.14 |
---|---|
go gRPC Server & gRPC Gateway (0) | 2021.09.20 |
Jaeger with Go (1) | 2021.07.20 |
Zipkin Go (0) | 2021.07.17 |
Localstack 살펴보기 (0) | 2021.07.16 |