이 고급 예시에서는 프런트엔드에 node.js를 사용하고 백엔드에 MySQL을 사용하는 로그북 앱을 빌드하는 방법을 설명합니다. 또한 이 템플릿을 통해 두 영역에 부하를 분산하는 HTTP 부하 분산기와 앱을 자동으로 확장하는 자동 확장 처리를 만들고 연결할 수 있습니다.
이 예제에서는 사용자가 Docker 컨테이너와 Compute Engine 리소스, 특히 HTTP 부하 분산, 자동 확장, 관리형 인스턴스 그룹, 인스턴스 템플릿에 익숙하다고 가정합니다.
더 많은 입문 가이드는 시작 가이드 또는 단계별 안내를 참조하세요.
시작하기 전에
- 이 가이드의 명령줄 예시를 사용하려면 'gcloud' 명령줄 도구를 설치합니다.
- 이 가이드의 API 예시를 사용하려면 API 액세스를 설정합니다.
- Compute Engine HTTP 부하 분산을 숙지합니다.
- Docker 컨테이너를 숙지합니다.
템플릿 만들기
이 예시에서는 몇 가지 유형의 리소스가 포함된 배포를 시작합니다. 먼저 이러한 리소스를 개별적으로 정의하는 재사용 가능한 템플릿을 만듭니다. 나중에 이 템플릿을 최종 구성에서 사용합니다.
이 예제를 모두 마치면 다음 리소스가 포함된 배포가 준비됩니다.
- 백엔드 MySQL 가상 머신용 단일 Compute Engine 인스턴스
- Docker 이미지를 사용하는 인스턴스 템플릿
- 서로 다른 두 영역에서 프런트엔드 node.js 서비스를 실행하는 2개의 자동 확장된 관리형 인스턴스 그룹
- 정적 데이터를 제공하는 또 다른 2개의 자동 확장된 관리형 인스턴스 그룹
- 각각의 관리형 인스턴스 그룹에 분산된 트래픽에 대한 상태 확인 및 HTTP 부하 분산기
백엔드 템플릿 만들기
이 앱의 백엔드는 MySQL Docker 컨테이너를 실행하는 단일 Compute Engine 인스턴스입니다. 컨테이너 최적화 이미지를 사용하는 Compute Engine 인스턴스를 정의하도록 템플릿을 만듭니다. 파일 이름을 container_vm.[py|jinja]
으로 지정합니다.
Jinja
Python
이 템플릿에서는 구성을 정의할 때 입력할 containerImage
와 manifest
와 같은 여러 가지 변수를 정의합니다. 이 템플릿으로는 단일 가상 머신(VM) 인스턴스만 생성됩니다.
Compute Engine 인스턴스에서 컨테이너 이미지를 사용하는 경우, 매니페스트 파일(Deployment Manager 매니페스트와 다름)도 제공하여 어떤 컨테이너 이미지를 사용할지 Compute Engine에 설명해야 합니다. container_helper.[py|jinja]
라는 도우미 메서드를 만들어서 컨테이너 매니페스트를 동적으로 정의합니다.
Jinja
Python
프런트엔드 템플릿 만들기
이 앱의 프런트엔드는 Node.js를 실행하며 사용자가 웹페이지에 메시지를 게시할 수 있도록 합니다. 각각 2개의 인스턴스를 포함하는 관리형 인스턴스 그룹 2개(기본 관리형 인스턴스 그룹과 부하 분산을 위한 보조 관리형 인스턴스 그룹)를 생성합니다.
이러한 프런트엔드 템플릿을 만들려면 다음 안내를 따르세요.
인스턴스 템플릿을 만듭니다.
중앙에서 관리되는 동일한 VM 인스턴스의 그룹인 관리형 인스턴스 그룹을 만들려면 인스턴스 템플릿 리소스가 필요합니다. 이 예시에서는 프런트엔드 node.js 인스턴스를 위한 관리형 인스턴스 그룹을 만듭니다. 우선 인스턴스 템플릿을 만들어야 합니다.
container_instance_template.[py|jinja]
라는 파일을 정의합니다.Jinja
Python
자동 확장 관리형 인스턴스 그룹을 만듭니다.
인스턴스 템플릿을 생성했으므로 이제 이를 사용하여 자동 확장되는 관리형 인스턴스 그룹을 만들도록 템플릿을 정의할 수 있습니다. 다음 콘텐츠로
autoscaled_group.[py|jinja]
라는 새 파일을 만듭니다.Jinja
Python
해당 스키마 파일을 만듭니다.
Jinja
Python
이 템플릿을 사용하여 리소스를 만듭니다.
지금까지 리소스 속성을 결정하는 기본 템플릿을 정의했습니다. 이 템플릿을 사용하여 프론트엔드 설정을 정의하세요. 다음 콘텐츠로
service.[py|jinja]
라는 새 파일을 만듭니다.Jinja
Python
해당 스키마 파일을 만듭니다.
Jinja
Python
이 템플릿으로 생성되는 요소를 분석해 보겠습니다.
2개의 관리형 인스턴스 그룹(기본 및 보조).
이 템플릿에서는
autoscaled_group.[py|jinja]
템플릿을 사용하여 자동 확장된 관리형 인스턴스 그룹(기본 및 보조)을 만듭니다.다음으로 백엔드 서비스와 상태 확인기를 만듭니다. 백엔드 서비스는 HTTP 부하 분산에 필요하며, 해당 백엔드 서비스에 있는 인스턴스 그룹의 처리 용량을 정의합니다. 이 경우 기본 및 보조 관리형 인스턴스 그룹은 이 백엔드의 일부이며, 백엔드 서비스의 기본 속성이 적용됩니다.
기본적으로 백엔드 서비스는 연결된 인스턴스 그룹의 CPU 사용률에 따라 부하 분산을 수행하지만 초당 요청(RPS)에 따라 부하를 분산할 수도 있습니다.
참고: 백엔드 서비스를 만들 때는 항상 상태 확인이 필요합니다.
통합 템플릿 만들기
마지막으로 백엔드 템플릿과 프론트엔드 템플릿을 조합하는 통합 템플릿을 만듭니다. application.[py|jinja]
라는 새 파일을 만듭니다.
Jinja
Python
해당 스키마 파일을 만듭니다.
Jinja
Python
템플릿에서 프런트엔드와 백엔드 외에 다음과 같은 일부 추가 리소스도 정의합니다.
기본 및 보조 관리형 인스턴스 그룹이 있는 정적 서비스. 이 정적 서비스는 앱의
/static
경로에 있는 웹페이지를 제공합니다.URL 맵 리소스. HTTP 부하 분산 시 서로 다른 URL을 올바른 경로에 매핑하려면 URL 맵이 필요합니다. 이 경우
defaultService
속성으로 표시된 기본 경로는 이전에 만든 백엔드 서비스입니다. 사용자가/static
으로 이동하면 URL 맵은pathMatchers
섹션에서 정의된 대로 이 경로를 정적 서비스에 매핑합니다.전역 전달 규칙과 대상 HTTP 프록시. 앱이 별개의 두 영역에 부하 분산되므로 단일 외부 IP 주소를 제공하는 전역 전달 규칙이 필요합니다. 또한 HTTP 부하 분산을 설정하려면 대상 HTTP 프록시가 필요합니다.
포트 8080을 통한 트래픽을 허용하는 방화벽 규칙
구성 만들기
템플릿과 관련 스키마가 준비되었으므로 이제 이러한 리소스를 배포하는 구성을 만들 수 있습니다. 다음 콘텐츠로 application.yaml
이라는 구성 파일을 만들고 ZONE_TO_RUN
과 SECONDARY_ZONE_TO_RUN
을 원하는 기본 영역과 보조 영역으로 바꿉니다.
Jinja
Python
구성 배포 중
이제 리소스를 배포해 보겠습니다. Google Cloud CLI를 사용하여 다음 명령어를 실행합니다. 원하는 경우 advanced-configuration-l7
을 원하는 배포 이름으로 바꿉니다. 배포 이름은 리소스 이름을 지정하는 데 자동으로 사용됩니다.
이 예시에서 배포 이름은 advanced-configuration-l7
입니다. 배포 이름을 변경하려는 경우 다음 모든 예시에서 이 배포 이름을 사용해야 합니다.
gcloud deployment-manager deployments create advanced-configuration-l7 --config application.yaml
응답은 다음 리소스와 비슷해야 합니다.
Waiting for create operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0...done. Create operation operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0 completed successfully. NAME TYPE STATE ERRORS advanced-configuration-l7-application-fw compute.v1.firewall COMPLETED [] advanced-configuration-l7-application-l7lb compute.v1.globalForwardingRule COMPLETED [] advanced-configuration-l7-application-targetproxy compute.v1.targetHttpProxy COMPLETED [] advanced-configuration-l7-application-urlmap compute.v1.urlMap COMPLETED [] advanced-configuration-l7-backend compute.v1.instance COMPLETED [] advanced-configuration-l7-frontend-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-frontend-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-frontend-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-frontend-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-frontend-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-sec-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-static-service-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-static-service-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-static-service-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-sec-igm compute.v1.instanceGroupManager COMPLETED []
서비스 라벨 추가
다음으로 관리형 인스턴스 그룹에 적절한 서비스 라벨을 지정합니다. 서비스 라벨은 부하 분산 서비스에서 리소스 그룹화에 사용하는 메타데이터입니다.
서비스 라벨을 추가하려면 기본 및 보조 영역을 배포 구성 파일에서 선택한 영역과 일치시켜 다음 명령어를 실행합니다.
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-pri-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [PRIMARY_ZONE]
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-sec-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [SECONDARY_ZONE]
구성 테스트
구성을 테스트하려면 전달 규칙을 쿼리하여 트래픽을 제공하는 외부 IP 주소를 가져옵니다.
gcloud compute forwarding-rules list | grep advanced-configuration-l7-l7lb advanced-configuration-l7-l7lb 107.178.249.126 TCP advanced-configuration-l7-targetproxy
이 경우 외부 IP는 107.178.249.126
입니다.
브라우저에서 포트 8080의 외부 IP 주소에 방문합니다. 예를 들어 외부 IP가 107.178.249.126
이면 URL은 다음과 같습니다.
http://107.178.249.126:8080
예상대로 빈 페이지가 표시되면 메시지를 게시합니다. 다음 URL로 이동합니다.
http://107.178.249.126:8080?msg=hello_world!
메시지가 추가되었음을 알리는 확인이 표시됩니다. 기본 URL로 돌아가면 페이지에 다음 메시지가 표시됩니다.
hello_world!
다음 URL을 방문하여, 만든 정적 페이지를 확인하거나 앱의 상태를 확인할 수도 있습니다.
# Static web page
http://107.178.249.126:8080/static
# Health check
http://107.178.249.126:8080/_ah/health
수고하셨습니다. 구성을 성공적으로 배포했습니다.
(선택사항) Docker 이미지 만들기
Docker를 통해 컨테이너 내부에서 소프트웨어를 자동화하고 실행할 수 있습니다. 컨테이너를 사용하면 단일 Linux 인스턴스에서 모두 실행될 수 있는 컨테이너 안에서 여러 서비스를 격리할 수 있습니다.
이 예시에서는 일부 기존 Docker 이미지를 사용했지만 이러한 Docker 이미지 버전을 직접 만들 수도 있습니다. MySQL 백엔드 이미지와 Node.js 프런트엔드 이미지를 만드는 방법은 리소스 템플릿 만들기 섹션에서 확인할 수 있습니다.
정적 웹페이지를 제공하는 Docker 이미지를 만들려면 다음 안내를 따르세요.
컨테이너 최적화 이미지로 새 VM 인스턴스를 만듭니다.
gcloud compute instances create docker-playground \ --image-family container-vm \ --image-project google-containers \ --zone us-central1-a \ --machine-type f1-micro
인스턴스에 연결합니다.
gcloud compute ssh --zone us-central1-a docker-playground
다음 콘텐츠로
Dockerfile
이라는 파일을 만듭니다.FROM node:latest RUN mkdir /var/www/ ADD service.js /var/www/service.js WORKDIR /var/www/ RUN npm install mysql CMD ["node", "service.js"]
다음 콘텐츠로
service.js
라는 파일을 만듭니다.var http = require('http'); var url = require('url'); console.log('Started static node server') http.createServer(function (req, res) { reqUrl = url.parse(req.url, true); res.useChunkedEncodingByDefault = false; res.writeHead(200, {'Content-Type': 'text/html'}); if (reqUrl.pathname == '/_ah/health') { res.end('ok'); } else if (reqUrl.pathname == '/exit') { process.exit(-1) } else { res.end('static server'); } }).listen(8080, '0.0.0.0'); console.log('Static server running at http://127.0.0.1:8080/');
username
을 개발자의 Docker Hub 사용자 이름으로 바꿔 Docker 이미지를 빌드합니다. Docker Hub 사용자 이름이 없으면 먼저 사용자 이름을 만든 후에 Docker 이미지를 빌드합니다.sudo docker build --no-cache -t username/nodejsservicestatic .
이미지를 Docker 저장소로 푸시합니다.
sudo docker push username/nodejsservicestatic
이제 Node.js와 MySQL을 실행할 Docker 이미지가 생성되었습니다. 이미지 이름을 검색하면 저장소에서 실제로 이 이미지를 볼 수 있습니다. 이미지를 사용해 보려면 gcr.io/deployment-manager-examples/mysql
과 gcr.io/deployment-manager-examples/nodejsservice
의 모든 인스턴스를 각각의 이미지로 바꾸면 됩니다.
다음 단계
이 샘플을 완료하면 다음을 수행할 수 있습니다.