Kubernetes

GCP GKE에 Terraform을 이용해 LGTM 구축 및 Service Mesh 설정하기 (1)

유자바 2024. 8. 9. 21:39

8월 한 달 동안 GKE에 LGTM 및 Service Mesh를 Terraform을 이용해서 구축해보려 합니다.

저의 얄팍한 지식을 소개해보자면 저는 LGTM 스택과 Service Mesh라는 용어가 존재한다는 것만 알고 있는 감자입니다.

이런 제가 직접 GKE에 구축해 볼 텐데요 저 스스로에게 응원을 먼저 해주겠습니다.

화이팅이다 나 자신

감자 맹구우유경 ❘ 출처: https://pin.it/1x2Oy0enW


 

1. git clone

같이 GKE 스터디하는 리더 분께서 Terraform 코드를 다 작성해 주셨습니다. 짱짱

그래서 이 코드 클론 받아 왔습니다.

Terraform 코드 분석하는 글을 추후에 추가하도록 하겠습니다💪🏻

 

2. 환경 변수 설정하기

- terraform.tfvars에 변수 설정

이때 해당 변수들이 외부로 노출되면 안되는 정보라면 꼭 .gitignore에 추가해주셔야 합니다.

ssl_domains = ["<domain.com>","<www.domain.com>"]
gcs_bucket_name = "<gcs_bucket_name>"
gke_project_id = "<gke_project_id>"

 

- variables.tf 파일 추가해 실제로 사용 가능하게 만들기

variable "SSL_DOMAINS" {
    description = "List of ssl domains"
    type = list(string)
}

variable "GCS_BUCKET_NAME" {
    description = "The unique name of the gcs bucket"
    type = string
}

variable "GKE_PROJECT_ID" {
    description = "The id of the gke project"
    type = string
}

 

- terraform.tfvars에 설정한 환경변수를 config.yaml에서 사용하기

...

ssl:
  - name: nginx-ingress
    domains:
%{ for domain in ssl_domains ~}
      - ${domain}
%{ endfor ~}

...

gcs:
  - name: ${gcs_bucket_name}
    location: asia-northeast3
    iam:
      - name: monitoring
        role: roles/storage.objectAdmin
        member: serviceAccount:monitoring@${gke_project_id}.iam.gserviceaccount.com

 

- terraform.tfvars에 설정한 환경변수를 config.tf에서 사용하기

provider "google" {
  project = var.gke_project_id
  region  = "asia-northeast3"
}

...

 

- ingress.yaml에 도메인 적용하기

...
spec:
  ingressClassName: nginx
  rules:
    - host: ${SSL_DOMAINS[0]}
...

 

 

 

🚨 Trouble Shooting1

terraform plan 명령어 입력 시 Call to function "yamldecode" failed: on line 68, column 1: could not find expected directive name. 에러 발생

terraform plan 시 yamlcode 함수에서 오류가 발생하는 이유는 두 가지의 경우가 존재합니다.
1. yaml 파일의 형식이나 내용 혹은 파일의 인코딩에 문제가 있을 경우
2. yamlcode 함수의 사용 방식에 문제가 있을 경우
해당 오류 메시지는 1번의 경우에 속하는데 yaml 파일은 올바르게 작성되었다. 따라서 인코딩과 관련된 문제였다. yaml 파일을 확인하면 domain 변수 삽입을 위해 go 템플릿 문법을 사용하는데 yaml 파일 내에서 go 템플릿 문법을 사용할 경우에는 templatefile 함수를 통해 이 템플릿을 처리해야 합니다. 하지만 기존에는 config = yamldecode(file("config.yaml"))를 사용해 인코딩했기 때문에 다음과 같은 에러가 발생한 것입니다. 따라서 아래와 같이 config.tf를 변경해 주었습니다.
config = yamldecode(templatefile("config.yaml", {
    ssl_domains      = var.ssl_domains
    gcs_bucket_name  = var.gcs_bucket_name
    gke_project_id   = var.gke_project_id
}))​

 

3. terraform apply --auto-approve

두근두근 apply 시간

 

그런데...


🚨 Trouble Shooting2

yamlcode의 인코딩 관련 에러를 해결하고 terraform plan이 성공적으로 끝나 terraform apply를 실행했다.
그런데 아래와 같은 에러가 발생했습니다. 
Error: Error creating ManagedSslCertificate: googleapi: Error 403
에러 메시지를 보니 해당 에러 메시지가 뜬 이유를 짐작할 수 있었는데요...
gcp는 처음 프로젝트를 만들고 사용할 api를 직접 사용 버튼을 클릭해야 하는데 처음 프로젝트를 만들고 사용 버튼을 누르지 않아 발생했던 에러였습니다 ㅎ..ㅎ 머쓱

 

다시 두근두근 apply 시간 

 

그런데..

 

🚨 Trouble Shooting3

저에게 이런 시련을 주었지만 이겨내 보겠습니다.

Error: Error creating BackendService: googleapi: Error 404: The resource 'projects/project_id/zones/asia-northeast3-c/networkEndpointGroups/ingress-nginx-80-neg' was not found, notFound

우선 에러 메시지를 통해 Network Endpoint Group(NEG)가 존재하지 않거나 아직 생성되지 않아 발생한 에러라는 점을 캐치했다. 에러 메시지에서 알려준 ../../gcp/loadbalancer/main.tf의 15번째 줄을 따라가 보니 ingress와 loadbalancer를 설정하는 과정에서 발생한 문제라는 것을 알 수 있었습니다.

🛠️ 오류 해결 과정
1. 우선 loadbalancer와 관련된 테라폼 코드가 실행되지 않도록 주석처리 후 terraform apply 실행
   - 가장 먼저 실행되는 main.tf(../../example/gcp/main.tf)의 loadbalancer 부분
   - config.tf(../../example/gcp/config.tf)의 loadbalancer 부분

-> 결과는 성공! 이로써 네트워크에 문제가 있다는 걸 발견했습니다.

2. 문득 네임서버를 제대로 설정했던가 하는 의문이 들어 확인해 봤습니다.
    - 역시나!! 네임서버가 설정이 안 되어 있었습니다... 후후
    - 저는 gcp를 사용했기 때문에 cloud dns 영역 만들기를 한 후 만들어진 영역의 네임서버를 가비아의 제 도메인에 적용시켰습니다. (여담이지만 가비아에서 500원에 1년 사용 가능한 도메인을 팔길래 냉큼 샀습니다.)

3. helm을 이용해 ingress nginx controller를 설치해 줍니다.
    - helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    - ingress-nginx는 nginx를 역방향 프록시 및 로드 밸런서로 사용하는 K8s용 Ingress 컨트롤러입니다. 여기서는 로드 밸런서로 nginx를 사용하기 위해 해당 오픈소스를 사용했습니다.
ingress-nginx 설치 후 helm upgrade를 통해 helm 차트의 변동사항을 release에 적용합니다.

4. gke의 neg를 사용하기
    - gcloud compute network-endpoint-groups list
    - neg를 조회하기 위해 위와 같은 명령어를 사용했고 설정한 리전의 가용영역 별로 하나씩 neg가 생성되어 있는 것을 확인했습니다.

5. 이후 두근두근 apply 시간 결과는...
성공입니다!!! 야호!!!

 

 

그럼 이렇게 저의 도메인으로 접속이 가능하다는 걸 캡처해서 보여주고

참고로 apply는 20분, destroy는 10분 정도 걸리네요.

'Kubernetes' 카테고리의 다른 글

[쿠버네티스 인 액션] Ch1. 쿠버네티스 소개  (0) 2024.11.26