Google Cloud에서 NGINX 고가용성을 위해 Packer 및 Terraform 사용
이 포스트에서는 Packer 및 Terraform 을 사용하여 Google Cloud인 Google Compute Engine(GCE)에서 NGINX Plus 및 NGINX Open Source의 고가용성(HA), All‑Active 오토스케일링 배포의 설치 및 구성을 자동화하는 솔루션에 대해 설명합니다. Google Compute Engine(GCE)은 가상 머신(VM)에서 Workload를 실행하기 위한 플랫폼(GCP) 제품입니다.
All‑Active HA 오토스케일링 솔루션은 현재 DevOps 환경에서 점차 표준이 되고 있습니다. HA 배포는 Active Health Check을 사용하여 비정상 인스턴스를 다시 시작합니다. All-Active 솔루션과 결합하여 서버(예: NGINX Plus Load Balancer)가 항상 클라이언트 요청을 수락할 수 있도록 합니다. 동시에 오토스케일링은 구성 가능한 다양한 매개 변수를 기반으로 인스턴스 수를 현재 Workload에 적절한 수로 조정하여 배포 비용을 줄이는 데 도움이 됩니다.
목차
1. Packer 및 Terraform란?
2. 솔루션
3. 필수 소프트웨어 설치
4. Packer 구성
5. Terraform을 사용하여 이미지 배포
6. 인스턴스 시작 및 중지
1. Packer 및 Terraform 란?
이러한 복잡한 환경을 수동으로 설정하고 주요 변경 사항이 있을 때마다 수정하는 것은 지루할 수 있습니다. 따라서 배포 자동화는 효율적인 DevOps Workflow의 핵심 요구 사항입니다. 많은 자동화 도구가 있으며 이 솔루션은 DevOps 엔지니어에게 점점 인기를 얻고 있는 Hashicorp의 두 가지인 Packer와 Terraform을 사용합니다.
Packer와 Terraform은 모두 인프라스트럭처 자동화 도구입니다. 이들은 인프라스트럭처를 코드로 관리하는 것을 가능하게 해주는 도구입니다. 그러나 각각의 역할과 기능이 다르기 때문에, 본문에서는 각 도구에 대해 자세히 설명하고, 이들을 함께 사용하는 이유와 장점에 대해 다루겠습니다.
Packer란?
Packer는 인프라스트럭처를 위한 이미지를 생성하는 도구입니다. 이를 통해 개발자와 운영팀은 이미지를 수동으로 만드는 번거로움 없이, 코드를 통해 이미지를 생성할 수 있습니다. Packer는 AWS, Google Cloud, Azure, Docker 등 다양한 클라우드 플랫폼에서 이미지를 생성할 수 있습니다.
Packer는 JSON 형식의 템플릿을 사용하여 이미지를 생성합니다. 템플릿은 이미지 생성을 위한 필수적인 설정을 정의하며, 필요한 패키지를 설치하고, 서비스를 활성화하고, 이미지를 복제하고, SSH 접속을 설정하는 등의 작업을 수행합니다.
Packer는 다양한 용도로 사용될 수 있습니다. 예를 들어, 동일한 인프라스트럭처에서 여러 애플리케이션을 실행하는 경우, Packer를 사용하여 모든 애플리케이션에 대한 이미지를 생성하고, Terraform을 사용하여 인프라스트럭처를 프로비저닝할 수 있습니다.
Terraform이란?
Terraform은 인프라스트럭처 자동화 도구로, 인프라스트럭처를 코드로 관리할 수 있도록 해줍니다. Terraform은 Packer와 같이 다양한 클라우드 플랫폼을 지원하며, AWS, Google Cloud, Azure, OpenStack 등 다양한 클라우드 서비스에서 사용할 수 있습니다.
Terraform은 인프라스트럭처를 코드로 정의하고, 필요한 리소스를 선언하는 템플릿을 사용합니다. 템플릿은 HCL(HashiCorp Configuration Language)로 작성되며, 템플릿을 사용하여 인프라스트럭처를 생성, 업데이트, 삭제할 수 있습니다.
Terraform은 인프라스트럭처를 관리하는 데 사용되는 많은 문제를 해결합니다. 이를 통해 개발자는 시간과 비용을 절약할 수 있으며, 빠르고 신뢰성 있는 인프라스트럭처를 구축할 수 있습니다
2. 솔루션
여기에 설명된 자동화 솔루션은 NGINX Plus는 Reverse Proxy/Load Balancer와 트래픽이 Load Balancing 되는 샘플 애플리케이션 웹 서버로 작동합니다.
웹 서버는 대신 NGINX Open Source를 실행합니다. 구체적으로 Packer는 세 가지 GCE “gold” 이미지를 생성합니다.
⦁ Reverse Proxy 및 Load Balancer 역할을 하는 NGINX Plus로 구성된 이미지 1개.
Active Health Check 및 NGINX Plus API는 이 구성의 일부로 활성화됩니다. NGINX Plus Live Activity 모니터링 대시보드도 포트 8080에서 구성되며 설치가 완료되면 http://external-ip-address:8080/dashboard.html
에서 액세스할 수 있습니다.
⦁ 정적 자산에 대한 애플리케이션 웹 서버 역할을 하는 NGINX Open Source로 구성된 2개의 이미지. 두 웹 서버의 구성은 동일합니다.
구성은 sub_filter 지시문을 사용하여 여러 매개변수를 설정합니다. 이렇게 하면 랜딩 HTML 사이트가 NGINX 설치와 관련된 값을 반영할 수 있습니다.
그런 다음 Terraform은 Load Balancer 이미지와 2개의 웹 서버 이미지 각각 2개의 인스턴스를 구성하고 배포하여 GCE Health Check으로 고가용성을 설정합니다. 마지막으로, GCE 시작 및 종료 스크립트가 배포되어 원활한 오토스케일링을 제공하고 NGINX Plus API를 사용하여 NGINX Plus 및 NGINX Open Source 인스턴스의 Upstream 그룹을 동적으로 구성합니다.
배포된 솔루션의 전체 구조는 각각 Packer로 생성된 머신 이미지 중 하나를 기반으로 하는 3개의 GCE 인스턴스 템플릿으로 구성됩니다.
각 인스턴스 템플릿은 GCE 그룹 인스턴스 관리자에 의해 관리됩니다. 모든 NGINX Plus GCE 인스턴스에서 포트 80 및 8080에 대한 액세스를 허용하도록 방화벽이 설정됩니다.
안전성을 높이고 복잡성을 줄이기 위해 퍼블릭 IP 주소는 Load Balancer 인스턴스에 대해서만 보급되고 액세스할 수 있습니다. Load Balancer 그룹 관리자가 Backend Pool Balancer에 할당되고 들어오는 모든 연결을 Backend Pool Balancer로 전달하도록 외부 정적 IP 주소가 구성됩니다.
3. 필수 소프트웨어 설치
자동화 솔루션을 시작하려면 필요한 소프트웨어를 다운로드하고 설치하십시오.
1. Packer를 설치합니다.
이 솔루션은 Packer v1.0.4에서 테스트되었으며 다른 버전에서는 작동하지 않을 수 있습니다.
2. Terraform을 설치합니다.
이 솔루션은 Terraform v0.10.2에서 테스트되었으며 다른 버전에서는 작동하지 않을 수 있습니다.
3. Google Cloud 계정을 생성합니다.
4. Google Cloud 프로젝트를 생성합니다.
5. GCP API Manager의 Credentials 탭에서 새 프로젝트의 사용자 인증 정보를 다운로드합니다. GCP는 프로젝트와 관련된 정보를 미리 로드하지 않으므로 탭에 액세스하면 “Compute Engine is get ready” 메시지가 표시될 수 있습니다. 메시지가 지워지면 자격 증명을 다운로드할 수 있습니다.
6. 자격 증명을 ~/.gcloud/gcloud_credentials.json
으로 복사하고 이름을 바꿉니다.
7. Google Cloud SDK를 설치합니다.
8. 이 솔루션의 GitHub Repository에서 파일을 복제하거나 다운로드합니다.
4. Packer 구성
필수 소프트웨어 설치의 지침을 완료한 후 Packer를 구성합니다.
1. packer/packer.json
의 변수 섹션을 편집하여 project_id 및 기본 GCP 영역을 지정합니다.
"variables": {
"home": "{{env `HOME`}}",
"license": "{{env `HOME`}}/.ssh/ngx-certs",
"project_id": "all-active-nginx-plus-lb",
"zone": "us-west1-a"
},
2. NGINX Plus 인증서와 키를 ~/.ssh/ngx-certs
하위 폴더에 복사하거나 라이선스 위치를 가리키도록 packer/packer.json
의 라이선스 변수를 변경합니다.
5. Terraform 을 사용하여 이미지 배포
Packer를 구성한 후 Terraform을 구성하여 배포를 완료합니다.
1. 필요한 경우 각 변수에 대한 기본 필드의 값을 변경합니다. terraform/variables.tf
를 편집하여 project_id, 선호하는 배포 region, 선호하는 배포 region_zone 및 machine_type을 지정합니다. credentials_file_path 변수의 값을 변경할 필요가 없습니다.
variable "project_id" {
description = "The ID of the Google Cloud project"
default = "all-active-nginx-plus-lb"
}
variable "region" {
description = "The region in which to deploy the Google Cloud project"
default = "us-west1"
}
variable "region_zone" {
description = "The region zone in which to deploy the Google Cloud project"
default = "us-west1-a"
}
variable "machine_type" {
description = "The type of virtual machine used to deploy NGINX"
default = "n1-standard-1"
}
variable "credentials_file_path" {
description = "Path to the JSON file used to describe your account credentials"
default = "~/.gcloud/gcloud_credentials.json"
}
2. 필요한 경우 terraform/healthcheck.tf
에서 GCE Health Check 설정을 수정합니다(시간 관련 매개 변수는 초 단위입니다).
필요한 경우 GCE 인스턴스 그룹 관리자의 설정을 변경할 수도 있지만 스크립트가 작동하려면 인스턴스 이름이 다음 규칙을 따라야 합니다.
- Load Balancer 인스턴스의 이름에는
lb
가 포함되어야 하며app
는 포함되지 않아야 합니다. - 애플리케이션 인스턴스는 이름에
lb
가 아닌app
을 포함해야 합니다.
# Configure HTTP health checks for NGINX
resource "google_compute_http_health_check" "default" {
name = "nginx-http-health-check"
description = "Basic HTTP health check to monitor NGINX instances"
request_path = "/"
check_interval_sec = 10
timeout_sec = 10
healthy_threshold = 2
unhealthy_threshold = 10
}
# Configure a GCE instance group manager for the NGINX load balancer
resource "google_compute_instance_group_manager" "lb" {
name = "ngx-plus-lb-instance-group"
description = "Instance group to host NGINX Plus load balancing instances"
base_instance_name = "nginx-plus-lb-instance-group"
instance_template = "${google_compute_instance_template.lb.self_link}"
zone = "${var.region_zone}"
target_pools = [
"${google_compute_target_pool.default.self_link}",
]
target_size = 2
auto_healing_policies {
health_check = "${google_compute_http_health_check.default.self_link}"
initial_delay_sec = 300
}
}
3. 필요한 경우 3개의 인스턴스 그룹 관리자(lb
, app-1
및 app-2
리소스)에 대해 terraform/autoscaler.tf
에서 오토스케일링 설정을 수정합니다. 설정에 대한 자세한 내용은 Terraform 설명서를 참조하십시오. 솔루션에서 각 오토스케일링 정책은 사용 가능한 인스턴스가 CPU 사용량(cpu_utilization
)의 50%를 초과할 때마다 그룹 관리자당 최대 5개의 인스턴스(max_replicas
)까지 새 인스턴스를 생성합니다. 예를 들어, 이것은 lb
리소스에 대한 Stanza입니다.
# Create a Google autoscaler for the LB instance group manager
resource "google_compute_autoscaler" "lb" {
name = "nginx-plus-lb-autoscaler"
zone = "${var.region_zone}"
target = "${google_compute_instance_group_manager.lb.self_link}"
autoscaling_policy {
max_replicas = 5
min_replicas = 2
cpu_utilization {
target = 0.5
}
}
}
6. NGINX 인스턴스 시작 및 중지
이전 세 섹션의 단계를 완료한 후 터미널을 열고 Repository를 복제한 위치로 이동한 다음 ./setup.sh
를 실행하여 NGINX Plus 및 NGINX Open Source 인스턴스를 시작합니다.
실습을 마쳤거나 방금 만든 Google Cloud 환경을 삭제하려면 ./cleanup.sh
를 실행하세요.
Packer와 Terraform은 서로 다른 도구이지만, 함께 사용하여 인프라스트럭처를 자동화하는 데 매우 유용합니다. Packer를 사용하여 이미지를 생성하면, Terraform을 사용하여 이 이미지를 사용하는 인프라스트럭처를 구축할 수 있습니다.
이들을 함께 사용하는 것의 장점은 무엇일까요? 먼저, Packer를 사용하여 이미지를 생성하면, 이미지를 사용하는 모든 인프라스트럭처에 대해 일관된 설정을 적용할 수 있습니다. 또한, 이미지를 사용하여 인프라스트럭처를 생성하면, 리소스를 효율적으로 사용할 수 있으며, 배포 시간이 줄어듭니다.
또한, Terraform을 사용하면 인프라스트럭처를 관리하는 데 필요한 작업을 자동화할 수 있으므로, 운영팀은 수동으로 작업하는 시간을 절약할 수 있습니다. 또한, 인프라스트럭처를 코드로 관리하면, 변경 사항을 추적하고, 이전 상태로 롤백하는 등의 작업이 쉬워집니다.
마지막으로, Packer와 Terraform을 함께 사용하면, 여러 클라우드 플랫폼에서 일관된 방식으로 인프라스트럭처를 관리할 수 있습니다. 이를 통해 개발자와 운영팀은 더욱 유연하게 인프라스트럭처를 구축하고, 관리할 수 있습니다.
요약하면, Packer와 Terraform은 각각 이미지 생성과 인프라스트럭처 자동화를 위한 도구이며, 함께 사용하면 이들의 장점을 결합하여 빠르고 신뢰성 높은 인프라스트럭처를 관리할 수 있습니다. 이들은 클라우드 인프라스트럭처를 관리하는데 매우 유용한 도구이며, 개발자와 운영팀은 이를 사용하여 더욱 효율적으로 작업할 수 있습니다.
GCE에서 NGINX Plus를 직접 사용해 보거나 테스트해 보려면 지금 30일 무료 평가판을 신청하거나 사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.