자습서-NGINX gRPC API Gateway 설정하기

NGINX API Gateway – gRPC API Gateway 배포 모범사례에서 다뤘던 내용을 바탕으로 NGINX gRPC API Gateway 설정을 따라할 수 있는 자습서를 제공합니다.

목차

1. 테스트 환경 설정
2. NGINX OSS 또는 NGINX Plus 설치
  2-1. 도커 설치
  2-2. RouteGuide 서비스 컨테이너 설치
2-3. helloworld 서비스 컨테이너 설치
3. gRPC 클라이언트 애플리케이션 설치
  3-1. 설정 테스트

1. 테스트 환경 설정

다음 지침은 격리되고 반복 가능하도록 가상 머신에 테스트 환경을 설치합니다. 그러나 물리적인 “베어메탈” 서버에 설치할 수 없는 이유는 없습니다.

테스트 환경을 단순화하기 위해 Docker 컨테이너를 사용하여 gRPC 서비스를 실행합니다. 즉, 테스트 환경에 여러 호스트가 필요하지 않지만 프로덕션 환경에서와 같이 NGINX가 네트워크 호출로 프록시 연결을 만들 수 있습니다.

또한 Docker를 사용하면 코드 변경 없이 다른 포트에서 각 gRPC 서비스의 여러 인스턴스를 실행할 수 있습니다. 각 gRPC 서비스는 가상 머신의 고유한 로컬 호스트 포트에 매핑된 컨테이너 내의 포트 50051에서 수신 대기합니다. 그러면 NGINX가 수신 포트로 사용할 수 있도록 포트 50051이 해제됩니다. 따라서 테스트 클라이언트가 미리 구성된 포트 50051을 사용하여 연결할 때 NGINX에 도달합니다.

2. NGINX OSS 또는 NGINX Plus 설치

  1. NGINX Plus 관리자 가이드의 지침에 따라 NGINX Open Source 또는 NGINX Plus를 설치합니다 .
  2. GitHub Gist 리포지토리 에서 다음 파일 을 /etc/nginx/conf.d 에 복사합니다 .
    • grpc_gateway.conf
    • 오류.grpc_conf

참고: TLS를 사용하지 않는 경우 grpc_gateway.conf에서 ssl_* 지시문을 주석 처리하십시오.

3. NGINX 오픈 소스 또는 NGINX Plus를 시작합니다

$ sudo nginx

2-1. 도커 설치

Debian 및 Ubuntu의 경우 다음을 실행합니다.

$ sudo apt-get install docker.io

CentOS, RHEL 및 Oracle Linux의 경우 다음을 실행합니다.

$ sudo yum install docker

2-2. RouteGuide 서비스 컨테이너 설치

  1. 다음 Dockerfile에서 RouteGuide 컨테이너에 대한 Docker 이미지를 빌드합니다.
# This Dockerfile runs the RouteGuide server from
# https://grpc.io/docs/tutorials/basic/python.html

FROM python
RUN pip install grpcio-tools 
RUN git clone -b v1.14.x https://github.com/grpc/grpc
WORKDIR grpc/examples/python/route_guide

EXPOSE 50051
CMD ["python", "route_guide_server.py"]

빌드 전에 Dockerfile을 로컬 하위 디렉토리에 복사하거나 Dockerfile에 대한 Gist의 URL을 dockerbuild 명령에 대한 인수로 지정할 수 있습니다.

$ sudo docker build -t routeguide https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/routeguide.Dockerfile

이미지를 다운로드하고 빌드하는 데 몇 분 정도 걸릴 수 있습니다. 성공적으로 빌드되었다는 메시지의 표시와 16진수 문자열(이미지 ID)은 빌드 완료를 나타냅니다.

2.  docker images 를 실행하여 이미지가 빌드되었는지 확인합니다.

$ sudo docker images
REPOSITORY     TAG          IMAGE ID          CREATED         SIZE
routeguide     latest       63058a1cf8ca      1 minute ago    1.31 GB
python         latest       825141134528      9 days ago      923 MB

3. RouteGuide 컨테이너를 시작합니다.

$ sudo docker run --name rg1 -p 10001:50051 -d routeguide
$ sudo docker run --name rg2 -p 10002:50051 -d routeguide
$ sudo docker run --name rg3 -p 10003:50051 -d routeguide

각 명령이 성공하면 실행 중인 컨테이너를 나타내는 긴 16진수 문자열이 나타납니다.

4. docker ps를 실행하여 세 개의 컨테이너가 모두 작동 중인지 확인하십시오. (샘플 출력은 읽기 쉽도록 여러 줄로 나뉩니다.)

$ sudo docker ps
CONTAINER ID  IMAGE       COMMAND              STATUS        ...
d0cdaaeddf0f  routeguide  "python route_g..."  Up 2 seconds  ...
c04996ca3469  routeguide  "python route_g..."  Up 9 seconds  ...
2170ddb62898  routeguide  "python route_g..."  Up 1 minute   ...

      ... PORTS                     NAMES
      ... 0.0.0.0:10003->50051/tcp  rg3
      ... 0.0.0.0:10002->50051/tcp  rg2
      ... 0.0.0.0:10001->50051/tcp  rg1

출력의 PORTS 열은 각 컨테이너가 다른 로컬 포트를 컨테이너 내부의 포트 50051에 매핑한 방법을 보여줍니다.

2-3. helloworld 서비스 컨테이너 설치

  1. 다음 Dockerfile에서 helloworld 컨테이너에 대한 Docker 이미지를 빌드합니다.

# This Dockerfile runs the helloworld server from
# https://grpc.io/docs/quickstart/go.html

FROM golang
RUN go get -u google.golang.org/grpc
WORKDIR $GOPATH/src/google.golang.org/grpc/examples/helloworld

EXPOSE 50051
CMD ["go", "run", "greeter_server/main.go"]

빌드 전에 Dockerfile을 로컬 하위 디렉토리에 복사하거나 Dockerfile에 대한 Gist의 URL을 docker 빌드 명령에 대한 인수로 지정할 수 있습니다.

$ sudo docker build -t helloworld https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/helloworld.Dockerfile

이미지를 다운로드하고 빌드하는 데 몇 분 정도 걸릴 수 있습니다. 성공적으로 빌드되었다는 메시지의 표시와 16진수 문자열(이미지 ID)은 빌드 완료를 나타냅니다.

2. docker images 를 실행하여 이미지가 빌드되었는지 확인합니다.

$ sudo docker images
REPOSITORY     TAG          IMAGE ID          CREATED           SIZE
helloworld     latest       e5832dc0884a      10 seconds ago    926MB
routeguide     latest       170761fa3f03      4 minutes ago     1.31GB
python         latest       825141134528      9 days ago        923MB
golang         latest       d0e7a411e3da      3 weeks ago       794MB

3. helloworld 컨테이너를 시작합니다

$ sudo docker run --name hw1 -p 20001:50051 -d helloworld
$ sudo docker run --name hw2 -p 20002:50051 -d helloworld

각 명령이 성공하면 실행 중인 컨테이너를 나타내는 긴 16진수 문자열이 나타납니다.

docker ps 를 실행하여 두 개의 helloworld 컨테이너가 작동 중인지 확인 합니다.

$ sudo docker ps
CONTAINER ID  IMAGE       COMMAND              STATUS        ... 
e0d204ae860a  helloworld  "go run greeter..."  Up 5 seconds  ... 
66f21d89be78  helloworld  "go run greeter..."  Up 9 seconds  ... 
d0cdaaeddf0f  routeguide  "python route_g..."  Up 4 minutes  ... 
c04996ca3469  routeguide  "python route_g..."  Up 4 minutes  ... 
2170ddb62898  routeguide  "python route_g..."  Up 5 minutes  ... 

      ... PORTS                     NAMES
      ... 0.0.0.0:20002->50051/tcp  hw2
      ... 0.0.0.0:20001->50051/tcp  hw1
      ... 0.0.0.0:10003->50051/tcp  rg3
      ... 0.0.0.0:10002->50051/tcp  rg2
      ... 0.0.0.0:10001->50051/tcp  rg1

3. gRPC 클라이언트 애플리케이션 설치

  1. 프로그래밍 언어 필수 구성 요소를 설치합니다. 그 중 일부는 테스트 환경에 이미 설치되어 있을 수 있습니다.

Ubuntu 및 Debian의 경우 다음을 실행합니다.

$ sudo apt-get install golang-go python3 python-pip git

CentOS, RHEL 및 Oracle Linux의 경우 다음을 실행합니다.

$ sudo yum install golang python python-pip git

python-pip를 사용하려면 EPEL 저장소를 활성화해야 합니다(필요한 경우 먼저 sudo yum install epel-release 실행).

2. helloworld 애플리케이션 다운로드:

$ go get google.golang.org/grpc

3. RouteGuide 애플리케이션 다운로드:

$ git clone -b v1.14.1 https://github.com/grpc/grpc
$ pip install grpcio-tools

3-1. 설정 테스트

  1. helloworld 클라이언트를 실행합니다.
$ go run go/src/google.golang.org/grpc/examples/helloworld/greeter_client/main.go

2. RouteGuide 클라이언트를 실행합니다.

$ cd grpc/examples/python/route_guide
$ python route_guide_client.py

3. NGINX 로그(Log)를 확인하여 테스트 환경이 작동하는지 확인하십시오.

$ tail /var/log/nginx/grpc_log.json