프로그래밍/terraform

[Terraform]GKE Spring LoadBalancer 구축

장경훈 2024. 5. 24. 02:59

LoadBalancer란?

로드밸런서 이미지

  • 사용자들이 접근할때 여러 서버로 부하분산하는 방법

Terraform GKE 구축

# GKE.tf## 
resource "google_container_cluster" "primary" {
  name     = "gke-cluster-1"
  location = var.region

  remove_default_node_pool = true
  initial_node_count       = 1
}

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "my-node-pool"
  cluster    = google_container_cluster.primary.id
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "e2-medium"

    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}
  • 테스트용이기 때문에 e2-medium을 사용

    Docker Image Artifact_Registry에 배포

    # artifact.tf
    resource "google_artifact_registry_repository" "my-repo" {
    location      = "asia-northeast3"
    repository_id = "my-repo"
    description   = "docker repository"
    format        = "DOCKER"
    }
    # dockerfile
    FROM openjdk:17-jdk-slim
    ENV APP_HOME=/usr/app/
    WORKDIR $APP_HOME
    COPY ./*.jar ./app.jar
    ENTRYPOINT ["java", "-jar", "app.jar"]
#GCP Region 인증
sudo gcloud auth configure-docker asia-northeast3-docker.pkg.dev
#이미지 Tag 연결 
sudo docker tag spring asia-northeast3-docker.pkg.dev/ictgcp001/my-repo/spring:version1
#이미지 Push 
sudo docker push asia-northeast3-docker.pkg.dev/ictgcp001/my-repo/spring:version1

K8s 클러스터에 접근 및 배포

#Spring Replicaset 3개 선언 포트는 8080
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-load
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-boot-load
  template:
    metadata:
      labels:
        app: spring-boot-load
    spec:
      containers:
        - name: spring-boot-load
          image: asia-northeast3-docker.pkg.dev/ictgcp001/my-repo/spring:version1
          imagePullPolicy: Always
          ports:
            - protocol: TCP
              containerPort: 8080
---
# 로드밸런스 사용을 위한 Service 구축 
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-load
  labels:
    app: spring-boot-load
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
spec:
  selector:
    app: spring-boot-load
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 32000
---
# 구현한 LoadBalancer를 접근 가능하게 Ingress 정의
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-boot-load
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: spring-boot-load
                port:
                  number: 8080

결과확인

스크린샷 2024-05-06 오후 8 57 12스크린샷 2024-05-06 오후 8 57 21스크린샷 2024-05-06 오후 8 57 43