Energent.ai는 엔터프라이즈 사용자를 위한 복잡한 다중 애플리케이션 워크플로를 자동화하는 AI 기반 가상 데스크톱 에이전트를 제공합니다. 이 가이드는 GKE, 멀티 테넌트 디자인 및 엔터프라이즈급 보안 제어를 포함한 현대적인 클라우드 네이티브 아키텍처를 사용하여 Google Cloud Platform 배포 사양을 포괄적으로 제공합니다.
- 문서 분류: 공개
- 버전: 3.0
- 최종 업데이트: 2025-05-28
- 아키텍처: GCP GKE + 서버리스 하이브리드
- 컴플라이언스: SOC 2, Google Cloud 보안 모범 사례
목차
- 아키텍처 개요
- GCP 인프라 요구 사항
- GKE 클러스터 사양
- 데이터 계층 아키텍처
- 서버리스 구성 요소
- 보안 및 컴플라이언스
- 네트워크 아키텍처
- CI/CD 파이프라인
- 모니터링 및 가시성
- 배포 프로세스
- 운영 및 유지보수
- 지원 및 문제 해결
1. 아키텍처 개요
1.1 클라우드 네이티브 멀티 테넌트 아키텍처
Energent.ai는 Google Cloud Platform에서 Kubernetes 오케스트레이션과 서버리스 구성 요소를 결합하여 최적의 성능과 비용 효율성을 제공하는 현대적이고 확장 가능한 아키텍처를 배포합니다.
┌──────────────────────────────────────────────────────────────────┐
│ GCP 클라우드 환경 │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ GKE 클러스터 │ │ 서버리스 │ │ 데이터 계층 │ │
│ │ │ │ │ │ │ │
│ │ • 멀티 테넌트 │ │ • Functions 인증│ │ • Firestore │ │
│ │ • n2-standard-4 │ │ • Functions 청구│ │ • Cloud Storage │ │
│ │ • 자동 확장 │ │ • API Gateway │ │ • Filestore │ │
│ │ • Flux GitOps │ │ • Pub/Sub │ │ • Secret Mgr │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │ │ │ │
│ └─────────────────────┼────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ VPC 보안 경계 │ │
│ │ • 프라이빗 서브넷 • Cloud NAT • 방화벽 규칙 │ │
│ │ • IAP 터널 • VPC 엔드포인트 • 로드 밸런서 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
1.2 배포 모델
| 모델 | 설명 | 사용 사례 | SLA |
|---|
| 멀티 테넌트 GKE | 네임스페이스 격리가 있는 공유 클러스터 | 표준 엔터프라이즈 배포 | 99.9% |
| 전용 GKE | 단일 테넌트 클러스터 | 높은 보안, 규제 준수 | 99.95% |
| 하이브리드 배포 | GKE + 고객 온프레미스 통합 | 레거시 시스템 통합 | 99.9% |
2. GCP 인프라 요구 사항
2.1 최소 인프라 사양
| 구성 요소 | 사양 | 목적 |
|---|
| GKE 클러스터 버전 | 1.30+ | Kubernetes 오케스트레이션 |
| 노드 풀 인스턴스 유형 | n2-standard-4 (4 vCPU, 16 GB RAM) | 컴퓨팅 최적화 워크로드 |
| 최소 노드 구성 | 테넌트당 1 vCPU, 2 GB RAM | 리소스 할당 |
| 영구 디스크 | 100 GB SSD, 암호화됨 | Pod 영구 스토리지 |
| Filestore | 기본, 암호화됨 | 공유 파일 시스템 |
| Cloud Storage | 표준, 버전 관리 활성화 | 객체 스토리지 |
| Firestore | 네이티브 모드, 정지 시 암호화 | 메타데이터 및 구성 |
2.2 GCP 서비스 종속성
| 서비스 | 목적 | 구성 |
|---|
| Google GKE | Kubernetes 오케스트레이션 | 프라이빗 클러스터, 로깅 활성화 |
| Compute Engine | 동적 노드 확장 | 자동 확장, 선점 가능한 인스턴스 |
| Cloud Load Balancing | 트래픽 분배 | SSL 종료, Cloud Armor |
| Cloud Functions | 서버리스 함수 | 런타임: Python 3.11, VPC 커넥터 |
| API Gateway | API 관리 | 속도 제한, 인증 |
| Cloud Monitoring | 모니터링 및 로깅 | GKE 모니터링, 사용자 정의 메트릭 |
| Secret Manager | 비밀 관리 | 자동 회전, 암호화 |
| Cloud KMS | 키 관리 | 고객 관리 키, 자동 회전 |
3. GKE 클러스터 사양
3.1 클러스터 구성
# GKE 클러스터 Terraform 구성
resource "google_container_cluster" "energent_cluster" {
name = "energent-production"
location = var.gcp_region
remove_default_node_pool = true
initial_node_count = 1
network = google_compute_network.vpc.name
subnetwork = google_compute_subnetwork.subnet.name
networking_mode = "VPC_NATIVE"
ip_allocation_policy {
cluster_secondary_range_name = "k8s-pod-range"
services_secondary_range_name = "k8s-service-range"
}
private_cluster_config {
enable_private_nodes = true
enable_private_endpoint = false
master_ipv4_cidr_block = "172.16.0.0/28"
}
master_auth {
client_certificate_config {
issue_client_certificate = false
}
}
workload_identity_config {
workload_pool = "${var.project_id}.svc.id.goog"
}
addons_config {
gcp_filestore_csi_driver_config {
enabled = true
}
network_policy_config {
disabled = false
}
}
cluster_telemetry {
type = "ENABLED"
}
logging_config {
enable_components = [
"SYSTEM_COMPONENTS",
"WORKLOADS",
"API_SERVER"
]
}
monitoring_config {
enable_components = [
"SYSTEM_COMPONENTS",
"WORKLOADS"
]
}
}
3.2 노드 풀 구성
# 기본 노드 풀
resource "google_container_node_pool" "energent_nodes" {
name = "energent-node-pool"
location = var.gcp_region
cluster = google_container_cluster.energent_cluster.name
node_count = 3
autoscaling {
min_node_count = 2
max_node_count = 20
}
node_config {
preemptible = false
machine_type = "n2-standard-4"
disk_size_gb = 100
disk_type = "pd-ssd"
service_account = google_service_account.gke_service_account.email
oauth_scopes = [
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring",
"https://www.googleapis.com/auth/cloud-platform"
]
workload_metadata_config {
mode = "GKE_METADATA"
}
labels = {
env = "production"
app = "energent-ai"
}
taint {
key = "workload"
value = "energent-ai"
effect = "NO_SCHEDULE"
}
}
management {
auto_repair = true
auto_upgrade = true
}
}
3.3 멀티 테넌트 리소스 할당
| 테넌트 등급 | CPU 제한 | 메모리 제한 | 스토리지 | 동시 워크플로 |
|---|
| 기본 | 1 vCPU | 2 GB | 10 GB | 1 |
| 표준 | 2 vCPU | 4 GB | 25 GB | 2 |
| 프리미엄 | 4 vCPU | 8 GB | 50 GB | 4 |
| 엔터프라이즈 | 8 vCPU | 16 GB | 100 GB | 8 |
4. 데이터 계층 아키텍처
4.1 스토리지 아키텍처
4.1.1 Cloud Storage 구성
# 클라우드 스토리지 버킷 객체 스토리지
resource "google_storage_bucket" "energent_storage" {
name = "energent-${var.environment}-storage-${random_id.bucket_suffix.hex}"
location = var.gcp_region
uniform_bucket_level_access = true
versioning {
enabled = true
}
encryption {
default_kms_key_name = google_kms_crypto_key.storage_key.id
}
lifecycle_rule {
condition {
age = 90
}
action {
type = "SetStorageClass"
storage_class = "NEARLINE"
}
}
retention_policy {
retention_period = 2592000 # 30일
}
labels = {
environment = var.environment
purpose = "energent-object-storage"
}
}
resource "google_storage_bucket_iam_member" "storage_admin" {
bucket = google_storage_bucket.energent_storage.name
role = "roles/storage.admin"
member = "serviceAccount:${google_service_account.gke_service_account.email}"
}
4.1.2 Firestore 구성
# 메타데이터 및 구성용 Firestore 데이터베이스
resource "google_firestore_database" "energent_metadata" {
project = var.project_id
name = "energent-metadata-${var.environment}"
location_id = var.gcp_region
type = "FIRESTORE_NATIVE"
concurrency_mode = "OPTIMISTIC"
app_engine_integration_mode = "DISABLED"
point_in_time_recovery_enablement = "POINT_IN_TIME_RECOVERY_ENABLED"
delete_protection_state = "DELETE_PROTECTION_ENABLED"
}
# Firestore 보안 규칙
resource "google_firestore_database" "security_rules" {
depends_on = [google_firestore_database.energent_metadata]
# 보안 규칙 내용은 여기에 정의됩니다
# 테넌트 분리 및 액세스 제어 구현
}
4.1.3 Filestore 공유 스토리지
# 공유 파일 시스템용 Filestore
resource "google_filestore_instance" "energent_shared" {
name = "energent-shared-${var.environment}"
location = var.gcp_zone
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "energent-share"
}
networks {
network = google_compute_network.vpc.name
modes = ["MODE_IPV4"]
}
labels = {
environment = var.environment
purpose = "shared-storage"
}
}
5. 서버리스 구성 요소
5.1 클라우드 함수
5.1.1 인증 서비스
# 인증용 클라우드 함수
resource "google_cloudfunctions2_function" "auth_service" {
name = "energent-auth-${var.environment}"
location = var.gcp_region
build_config {
runtime = "python311"
entry_point = "auth_handler"
source {
storage_source {
bucket = google_storage_bucket.functions_source.name
object = google_storage_bucket_object.auth_source.name
}
}
}
service_config {
max_instance_count = 100
min_instance_count = 1
available_memory = "512Mi"
timeout_seconds = 60
environment_variables = {
FIRESTORE_PROJECT = var.project_id
SECRET_MANAGER_PROJECT = var.project_id
ENVIRONMENT = var.environment
}
vpc_connector = google_vpc_access_connector.connector.id
vpc_connector_egress_settings = "ALL_TRAFFIC"
service_account_email = google_service_account.functions_service_account.email
}
event_trigger {
trigger_region = var.gcp_region
event_type = "google.cloud.pubsub.topic.v1.messagePublished"
pubsub_topic = google_pubsub_topic.auth_events.id
}
labels = {
environment = var.environment
service = "authentication"
}
}
5.1.2 청구 서비스
# 청구용 클라우드 함수
resource "google_cloudfunctions2_function" "billing_service" {
name = "energent-billing-${var.environment}"
location = var.gcp_region
build_config {
runtime = "python311"
entry_point = "billing_handler"
source {
storage_source {
bucket = google_storage_bucket.functions_source.name
object = google_storage_bucket_object.billing_source.name
}
}
}
service_config {
max_instance_count = 50
min_instance_count = 0
available_memory = "1Gi"
timeout_seconds = 300
environment_variables = {
FIRESTORE_PROJECT = var.project_id
STORAGE_BUCKET = google_storage_bucket.energent_storage.name
}
service_account_email = google_service_account.functions_service_account.email
}
}
5.2 API 게이트웨이 구성
# 서버리스 함수용 API 게이트웨이
resource "google_api_gateway_api" "energent_api" {
provider = google-beta
api_id = "energent-api-${var.environment}"
project = var.project_id
labels = {
environment = var.environment
service = "api-gateway"
}
}
resource "google_api_gateway_api_config" "energent_api_config" {
provider = google-beta
api = google_api_gateway_api.energent_api.api_id
api_config_id = "energent-config-${var.environment}"
project = var.project_id
openapi_documents {
document {
path = "spec.yaml"
contents = base64encode(templatefile("${path.module}/api-spec.yaml", {
project_id = var.project_id
region = var.gcp_region
}))
}
}
lifecycle {
create_before_destroy = true
}
}
resource "google_api_gateway_gateway" "energent_gateway" {
provider = google-beta
gateway_id = "energent-gateway-${var.environment}"
api_config = google_api_gateway_api_config.energent_api_config.id
location = var.gcp_region
project = var.project_id
labels = {
environment = var.environment
service = "api-gateway"
}
}
6. 보안 및 준수
6.1 네트워크 보안
6.1.1 VPC 구성
# VPC 네트워크 및 방화벽 규칙
resource "google_compute_network" "vpc" {
name = "energent-vpc-${var.environment}"
auto_create_subnetworks = false
mtu = 1460
}
resource "google_compute_subnetwork" "subnet" {
name = "energent-subnet-${var.environment}"
ip_cidr_range = "10.0.0.0/16"
region = var.gcp_region
network = google_compute_network.vpc.id
secondary_ip_range {
range_name = "k8s-pod-range"
ip_cidr_range = "10.1.0.0/16"
}
secondary_ip_range {
range_name = "k8s-service-range"
ip_cidr_range = "10.2.0.0/16"
}
private_ip_google_access = true
}
resource "google_compute_firewall" "allow_internal" {
name = "energent-allow-internal"
network = google_compute_network.vpc.name
allow {
protocol = "tcp"
ports = ["0-65535"]
}
allow {
protocol = "udp"
ports = ["0-65535"]
}
allow {
protocol = "icmp"
}
source_ranges = ["10.0.0.0/8"]
}
resource "google_compute_firewall" "allow_https" {
name = "energent-allow-https"
network = google_compute_network.vpc.name
allow {
protocol = "tcp"
ports = ["443"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["https-server"]
}
6.1.2 방화벽 규칙
| 방향 | 프로토콜 | 포트 범위 | 출처/대상 | 목적 |
|---|
| 인바운드 | HTTPS | 443 | 0.0.0.0/0 | API 액세스 |
| 인바운드 | TCP | 1024-65535 | 10.0.0.0/8 | 내부 트래픽 |
| 아웃바운드 | HTTPS | 443 | 0.0.0.0/0 | 외부 API 호출 |
| 아웃바운드 | TCP | 53 | 0.0.0.0/0 | DNS 해상 |
6.2 암호화 표준
| 데이터 상태 | 암호화 방법 | 키 관리 | 준수 |
|---|
| 휴지 상태 | AES-256-GCM | 자동 회전이 포함된 Cloud KMS | SOC 2, FIPS 140-2 Level 3 |
| 전송 중 | TLS 1.3 | Google 관리 인증서 | SOC 2, PCI DSS |
| 메모리 내 | 애플리케이션 수준 | 하드웨어 보안 모듈 | SOC 2 |
| 백업 | AES-256 | 지역 간 Cloud KMS | SOC 2, GDPR |
6.3 IAM 및 서비스 계정
6.3.1 GKE 서비스 계정
# GKE 서비스 계정
resource "google_service_account" "gke_service_account" {
account_id = "energent-gke-${var.environment}"
display_name = "Energent GKE Service Account"
project = var.project_id
}
resource "google_project_iam_member" "gke_permissions" {
for_each = toset([
"roles/logging.logWriter",
"roles/monitoring.metricWriter",
"roles/monitoring.viewer",
"roles/storage.objectViewer"
])
project = var.project_id
role = each.value
member = "serviceAccount:${google_service_account.gke_service_account.email}"
}
# 워크로드 아이덴티티 바인딩
resource "google_service_account_iam_member" "workload_identity" {
service_account_id = google_service_account.gke_service_account.name
role = "roles/iam.workloadIdentityUser"
member = "serviceAccount:${var.project_id}.svc.id.goog[energent-ai/energent-platform]"
}
7. 네트워크 아키텍처
7.1 VPC 디자인
┌─────────────────────────────────────────────────────────────────┐
│ VPC (10.0.0.0/16) │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ Public Subnet │ │ Public Subnet │ │ Public Sub │ │
│ │ (10.0.1.0/24) │ │ (10.0.2.0/24) │ │(10.0.3.0/24)│ │
│ │ │ │ │ │ │ │
│ │ Cloud NAT │ │ Cloud NAT │ │ Cloud NAT │ │
│ │ Load Balancer │ │ Load Balancer │ │Load Balancer│ │
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
│ │ │ │ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ Private Subnet │ │ Private Subnet │ │Private Sub │ │
│ │ (10.1.0.0/16) │ │ (10.1.0.0/16) │ │(10.1.0.0/16)│ │
│ │ │ │ │ │ │ │
│ │ GKE Nodes │ │ GKE Nodes │ │ GKE Nodes │ │
│ │ Functions VPC │ │ Functions VPC │ │ Functions │ │
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
│ │ │ │ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ Services Subnet │ │ Services Subnet │ │Services Sub │ │
│ │ (10.2.0.0/16) │ │ (10.2.0.0/16) │ │(10.2.0.0/16)│ │
│ │ │ │ │ │ │ │
│ │ Firestore │ │ Firestore │ │ Firestore │ │
│ │ Cloud Storage │ │ Cloud Storage │ │Cloud Storage│ │
│ └─────────────────┘ └─────────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
7.2 프라이빗 서비스 연결
| 서비스 | 유형 | 목적 |
|---|
| Cloud Storage | 프라이빗 엔드포인트 | 객체 스토리지 액세스 |
| Firestore | 프라이빗 엔드포인트 | 메타데이터 액세스 |
| GKE | 프라이빗 클러스터 | 클러스터 API 액세스 |
| Container Registry | 프라이빗 엔드포인트 | 컨테이너 레지스트리 |
| Cloud Monitoring | 프라이빗 엔드포인트 | 모니터링 및 로깅 |
| Secret Manager | 프라이빗 엔드포인트 | 비밀 액세스 |
8. CI/CD 파이프라인
8.1 코드형 인프라 (Terraform)
8.1.1 Terraform 구조
terraform/
├── environments/
│ ├── dev/
│ ├── staging/
│ └── production/
├── modules/
│ ├── gke/
│ ├── networking/
│ ├── security/
│ └── storage/
├── shared/
│ └── backend.tf
└── global/
└── iam.tf
8.1.2 Terraform 파이프라인 (Cloud Build)
# cloudbuild.yaml
steps:
# Terraform Init
- name: 'hashicorp/terraform:1.6.0'
entrypoint: 'sh'
args:
- '-c'
- |
cd terraform/environments/${_ENVIRONMENT}
terraform init -backend-config="bucket=${_TF_STATE_BUCKET}"
# Terraform Plan
- name: 'hashicorp/terraform:1.6.0'
entrypoint: 'sh'
args:
- '-c'
- |
cd terraform/environments/${_ENVIRONMENT}
terraform plan -var-file="${_ENVIRONMENT}.tfvars" -out=tfplan
# Terraform Apply (only on main branch)
- name: 'hashicorp/terraform:1.6.0'
entrypoint: 'sh'
args:
- '-c'
- |
if [ "${BRANCH_NAME}" = "main" ]; then
cd terraform/environments/${_ENVIRONMENT}
terraform apply -auto-approve tfplan
else
echo "Skipping apply for non-main branch"
fi
substitutions:
_ENVIRONMENT: 'production'
_TF_STATE_BUCKET: 'energent-terraform-state'
options:
logging: CLOUD_LOGGING_ONLY
machineType: 'E2_HIGHCPU_8'
timeout: 1200s
8.2 Kubernetes GitOps (Flux)
8.2.1 Flux 구성
# flux-system/gotk-sync.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: energent-k8s
namespace: flux-system
spec:
interval: 1m
ref:
branch: main
url: https://github.com/energent-ai/k8s-manifests
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: energent-apps
namespace: flux-system
spec:
interval: 10m
path: './apps'
prune: true
sourceRef:
kind: GitRepository
name: energent-k8s
validation: client
8.3 서버리스 배포 (Cloud Build)
8.3.1 함수 배포 구성
# cloudbuild-functions.yaml
steps:
# Deploy Auth Function
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
entrypoint: 'bash'
args:
- '-c'
- |
cd functions/auth
gcloud functions deploy energent-auth-${_ENVIRONMENT} \
--runtime python311 \
--trigger-http \
--entry-point auth_handler \
--memory 512MB \
--timeout 60s \
--region ${_REGION} \
--vpc-connector ${_VPC_CONNECTOR} \
--set-env-vars ENVIRONMENT=${_ENVIRONMENT}
# Deploy Billing Function
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
entrypoint: 'bash'
args:
- '-c'
- |
cd functions/billing
gcloud functions deploy energent-billing-${_ENVIRONMENT} \
--runtime python311 \
--trigger-topic billing-events \
--entry-point billing_handler \
--memory 1024MB \
--timeout 300s \
--region ${_REGION}
substitutions:
_ENVIRONMENT: 'production'
_REGION: 'us-central1'
_VPC_CONNECTOR: 'energent-vpc-connector'
options:
logging: CLOUD_LOGGING_ONLY
9. 모니터링 및 관찰 가능성
9.1 Cloud Monitoring 구성
9.1.1 GKE 모니터링
# Cloud Monitoring for GKE
resource "google_monitoring_dashboard" "gke_dashboard" {
dashboard_json = jsonencode({
displayName = "Energent GKE Dashboard"
mosaicLayout = {
tiles = [
{
width = 6
height = 4
widget = {
title = "GKE Cluster CPU Utilization"
xyChart = {
dataSets = [{
timeSeriesQuery = {
timeSeriesFilter = {
filter = "resource.type=\"k8s_cluster\" AND metric.type=\"kubernetes.io/container/cpu/core_usage_time\""
}
}
}]
}
}
}
]
}
})
}
# Log-based Metrics
resource "google_logging_metric" "error_rate" {
name = "energent_error_rate"
filter = "resource.type=\"k8s_container\" AND resource.labels.namespace_name=\"energent-ai\" AND severity=\"ERROR\""
metric_descriptor {
metric_kind = "GAUGE"
value_type = "INT64"
display_name = "Energent Error Rate"
}
}
9.2 애플리케이션 메트릭
| 메트릭 카테고리 | 메트릭 | 목표 | 경고 임계값 |
|---|
| 가용성 | Uptime, Health Checks | 99.9% | < 99.5% |
| 성능 | Response Time, Throughput | < 2s, > 1000 RPS | > 5s, < 500 RPS |
| 리소스 사용량 | CPU, Memory, Storage | < 80% | > 90% |
| 오류율 | 4xx, 5xx errors | < 1% | > 5% |
9.3 감사 로그
# Cloud Audit Logs Configuration
resource "google_project_iam_audit_config" "project_audit" {
project = var.project_id
service = "allServices"
audit_log_config {
log_type = "ADMIN_READ"
}
audit_log_config {
log_type = "DATA_READ"
}
audit_log_config {
log_type = "DATA_WRITE"
}
}
# Log Sink for Security Events
resource "google_logging_project_sink" "security_sink" {
name = "energent-security-sink"
destination = "storage.googleapis.com/${google_storage_bucket.audit_logs.name}"
filter = "protoPayload.serviceName=\"container.googleapis.com\" OR protoPayload.serviceName=\"iam.googleapis.com\""
unique_writer_identity = true
}
10. 배포 프로세스
10.1 배포 일정
| 단계 | 기간 | 활동 | 이해관계자 |
|---|
| 사전 배포 | 2-3일 | 인프라 계획, 보안 검토 | 고객 IT, 보안, Energent 솔루션 |
| 인프라 | 1-2일 | Terraform 배포, VPC 설정 | 고객 DevOps, Energent 플랫폼 |
| GKE 클러스터 | 0.5일 | 클러스터 프로비저닝, 노드 풀 | 고객 DevOps, Energent 플랫폼 |
| 애플리케이션 | 0.5일 | Flux 배포, 애플리케이션 롤아웃 | Energent 플랫폼 팀 |
| 통합 | 1-2일 | IAM, 모니터링, 테스트 | 고객 IT, Energent 지원 |
| 운영 시작 | 0.5일 | 프로덕션 전환, 검증 | 모든 이해관계자 |
10.2 배포 명령어
10.2.1 인프라 배포
# Infrastructure Deployment with Terraform
cd terraform/environments/production
terraform init -backend-config="bucket=energent-terraform-state"
terraform plan -var-file="production.tfvars"
terraform apply -auto-approve
# Verify GKE cluster
gcloud container clusters get-credentials energent-production --region us-central1
kubectl get nodes
10.2.2 애플리케이션 배포
# Install Flux GitOps
flux bootstrap github \
--owner=energent-ai \
--repository=k8s-manifests \
--branch=main \
--path=./clusters/production
# Deploy serverless components
gcloud builds submit --config cloudbuild-functions.yaml \
--substitutions _ENVIRONMENT=production,_REGION=us-central1
# 배포 확인
kubectl get pods -n energent-ai
kubectl get ingress -n energent-ai
10.3 배포 검증
# 상태 확인 엔드포인트
curl -k https://api.energent.example.com/health
curl -k https://api.energent.example.com/metrics
# Kubernetes 검증
kubectl top nodes
kubectl get hpa -n energent-ai
kubectl logs -n energent-ai -l app=energent-platform
11. 운영 및 유지보수
11.1 백업 및 재해 복구
11.1.1 백업 전략
| 구성 요소 | 빈도 | 보존 기간 | RTO | RPO |
|---|
| GKE 클러스터 상태 | 매일 | 30일 | < 4시간 | < 24시간 |
| 애플리케이션 데이터 | 실시간 | 90일 | < 1시간 | < 15분 |
| 구성 | 변경 시 | 1년 | < 30분 | 0 |
| 감사 로그 | 실시간 | 7년 | < 24시간 | 0 |
11.1.2 재해 복구 절차
# Velero를 사용한 GKE 클러스터 백업
velero backup create energent-cluster-backup \
--include-namespaces energent-ai \
--storage-location gcp
# Firestore 시점 복구
gcloud firestore databases restore \
--source-database=energent-metadata-production \
--destination-database=energent-metadata-restored \
--backup-time=2025-05-28T10:00:00Z
11.2 확장 및 성능
11.2.1 자동 확장 구성
# 수평 포드 자동 확장기
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: energent-platform-hpa
namespace: energent-ai
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: energent-platform
minReplicas: 3
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
11.3 업데이트 및 유지보수
11.3.1 롤링 업데이트
# GKE 클러스터 업데이트
gcloud container clusters upgrade energent-production \
--master \
--cluster-version 1.30 \
--region us-central1
# Flux를 사용한 애플리케이션 롤링 업데이트
git commit -am "Update energent-platform to v2.1.0"
git push origin main
# Flux가 자동으로 변경 사항을 감지하고 적용
12. 지원 및 에스컬레이션
12.1 지원 티어
| 티어 | 응답 시간 | 채널 | 범위 |
|---|
| L1 - 기본 | < 4시간 | 이메일, 포털 | 일반 질문, 문서 |
| L2 - 표준 | < 2시간 | 전화, 이메일, 미팅 | 기술 문제, 통합 지원 |
| L3 - 프리미엄 | < 1시간 | 전화, 미팅, 화상 | 복잡한 기술 문제, 아키텍처 |
| L4 - 긴급 | < 30분 | 전화, SMS, 에스컬레이션 | 프로덕션 장애, 보안 사건 |
12.2 24/7 지원 범위
엔터프라이즈 지원:
긴급 에스컬레이션:
12.3 서비스 수준 계약
| 서비스 | SLA | 페널티 |
|---|
| 플랫폼 가용성 | 99.9% 업타임 | 0.1% 부족 시 월간 크레딧 10% |
| 응답 시간 (P95) | < 2초 | 5초 초과 시 월간 크레딧 5% |
| 지원 응답 | 위 티어 기준 | 다음 티어로 에스컬레이션 |
| 데이터 복구 | RTO < 4시간 | 초과 시 월간 크레딧 25% |
부록
부록 A: GCP 서비스 비용
| 서비스 | 예상 월간 비용 | 확장 요인 |
|---|
| GKE 클러스터 | $75 | 클러스터당 고정 |
| Compute Engine (3x n2-standard-4) | $850 | 노드당 선형 |
| 영구 디스크 (300GB) | $60 | GB당 선형 |
| 클라우드 스토리지 (1TB) | $20 | GB당 선형 |
| Firestore | $120 | 사용량 기반 |
| 클라우드 함수 | $35 | 요청 기반 |
| 총 기본 비용 | ~$1,160/월 | 100 테넌트 기준 |
부록 B: 보안 준수 체크리스트
부록 C: 문제 해결 가이드
일반적인 문제:
-
GKE 노드가 클러스터에 참여하지 않음
- 서비스 계정 권한 확인
- 서브넷 라우팅 및 Cloud NAT 확인
-
애플리케이션 포드가 CrashLooping
- 리소스 제한 및 요청 확인
- 영구 볼륨 클레임 확인
-
네트워크 연결 문제