[테라폼/Terraform] 애저(Azure) 리소스 그룹, 컨테이너 레지스트리, AKS 클러스터 생성하기

2024. 5. 24. 02:24·인프라 Infra

들어가기 전에

이번 포스트에서는 아래 책에서 제공하는 안내를 현재 버전, 리전(한국 남부)에 맞게 재구성해 보았다.

 

Bootstraping Microservices

The Technology Taking a microservices application from proof of concept to production is a multi-step operation that relies on tools like Docker, GitHub Actions, Terraform, and Kubernetes. The best way to learn the whole process is to build a project from

www.bootstrapping-microservices.com

https://learn.microsoft.com/ko-kr/azure/developer/terraform/get-started-cloud-shell-bash?tabs=bash

 

Bash를 사용하여 Azure Cloud Shell에서 Terraform 구성

Azure Cloud Shell에서 Bash를 사용하여 Terraform 구성

learn.microsoft.com

테라폼을 사용하기 전에 Azure CLI를 설치하고 "az login" 커맨드를 통해 로그인 하여 테라폼이 Azure 환경을 잘 조작할 수 있도록 해주자.

테라폼 살펴보기

테라폼 로고

Terraform은 인프라를 안전하고 효율적으로 구축, 변경 및 버전 관리할 수 있는 코드 도구로서의 인프라입니다. 여기에는 컴퓨팅 인스턴스, 스토리지, 네트워킹과 같은 낮은 수준의 구성 요소와 DNS 항목 및 SaaS 기능과 같은 높은 수준의 구성 요소가 포함됩니다.
- 공식 사이트

여기 설명에서 주목해야할 점은 코드 도구로서의 인프라(IaC, Infrastructure as Code)이다. 

resource "aws_instance" "example" {
  ami = "abc123"

  network_interface {
    # ...
  }
}

이런 식으로 HCL(HashiCorp Configuration Language)이라는 테라폼을 위한 언어를 활용하여 어렵지 않게 블록 단위로 선언되는 리소스, 변수를 구성하여 인프라를 관리할 수가 있다. 여기서는 Azure 클라우드 서비스에서 리소스 그룹을 생성하고, 쿠버네티스 서비스인 AKS를 테라폼을 통해 구성하여 대쉬보드까지 띄워보고자 한다.

 

1. 간단 리소스 그룹 구성하기

먼저 Azure에서 인프라 구성을 할것이라는 명시를 위해서 아래와 같이 공급자 관리 파일을 작성하자.

  • providers.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.64.0"
    }
  }
}

provider "azurerm" {
    features {}
}

예전에는 바로 provider 블록만 작성해도 충분했지만, 지금은 terraform 블록에서 reqireed_providers를 통해서 필요한 공급자를 명시해주고 각각의 공급자에서 가져갈 추가적인 명세를 provider 블록에서 작성하는 것으로 생각하면 되겠다. (테라폼에서도 강력하게 추천하는 방법이다)

 

테라폼은 리소스 구성의 선언 외에도 변수를 저장하여 여러번 사용될 리소스의 이름을 관리할 수 있다. Azure에서 리소스 그룹의 이름과 리전의 이름을 지정해주자

  • variables.tf
variable app_name {
    default = "exampletf"
}
variable location {
    default = "koreasouth"
}

 

다음으로는 리소스 그룹 자체를 구성해주자. 

  • resourece-group.tf
resource "azurerm_resource_group" "flixtube" {
  name     = var.app_name  # "exampletf"
  location = var.location  # "koreasouth"
}

Azure 리소스 그룹을 설정하는 코드에 "flixtube"라는 라벨을 부여하였다. 실제로 클라우드에 생성되는 리소스의 이름과 리전은 이전에 변수 선언에 따른다.

terraform init

위 명령어를 통해, 테라폼에서 코드에 맞춰서 필요한 플러그인을 캐싱한다.

Azure 관련 플러그인을 설치한 것을 확인할 수 있다.

terraform apply

해당 단계에서 마지막으로 apply 커맨드를 통해 리소스 그룹을 생성할 수 있다. 

어떤 구성이 바뀌게 되는지 친절히 알려준다.

사진처럼 바뀌는 구성에 대한 명세도 잘 설명해주는 것을 확인할 수 있다. 마지막에 동의를 하는 부분에 yes만 입력해주면 되겠다.(-auto-approve 옵션으로 동의 과정을 생략할 수 있다.)

Azure에서 생성된 리소스 그룹

"exampletf"라는 이름의 리소스가 한국 남부(Korea South)에 생성되는 것을 확인할 수있다.

 

2. 컨테이너 레지스트리 리소스 추가로 구성하기

테라폼에서는 현재 상태를 저장하고 새롭게 테라폼 파일을 적용할 때, 이미 존재하는 리소스는 재생성하지 않는다. 덕분에 점진적으로 인프라 구성을 진행할 수 있다. 이제 기존 리소스 그룹에 컨테이너 레지스트리를 추가해보자.

  • container-registry.tf
resource "azurerm_container_registry" "container_registry" {
  name                = var.app_name
  resource_group_name = azurerm_resource_group.flixtube.name
  location            = var.location
  admin_enabled       = true
  sku                 = "Basic"
}

output "registry_hostname" {
  value = azurerm_container_registry.container_registry.login_server
}

output "registry_un" {
  value = azurerm_container_registry.container_registry.admin_username
}

output "registry_pw" {
  value = azurerm_container_registry.container_registry.admin_password
  sensitive = true
}

가장 기본적인 구성을 사용하였고, 아래는 간접적으로 가져온 값에 대한 설명이다.

  • name, location
    • 이전에 variables.tf에서 선언한 변수를 활용하여 레지스트리 이름과 리전을 설정해준다.
  •  resource_group_name
    • azurerm_resource_group에서 이전에 리소스 그룹을 생성했던 flixtube라는 블록의 이름인 "exampletf"을 가져온다.

나머지 admin_enabled는 true로 하여 관리자 계정을 활성화 하고, sku(Stock Keeping Unit)는 베이직으로 기본 요금을 설정했다.

  • output
    • 레지스트리가 생성된 후에 관리자 관련 정보를 획득할 수 있도록 설정하였다
    • 패스워드 관련해서는 sensitive 옵션을 넣어줘서 필요시 따로 확인할 수 있도록 설정해야한다.
      (현재는 제대로 생성됐는지 확인용)

코드를 추가했으니, 실제 어떻게 적용되는 지에 대해서 상세하게 미리 확인하기 위해서 아래 커맨드를 입력해보자.

terraform plan

콘테이너 레지스트리 관련하여 생성되는 내용들을 확인할 수 있다.

문제가 없다면 이번에는 자동 승인 옵션을 넣어서 인프라를 업데이트 해보자.

terraform apply -auto-approve

생성 후 출력되는 화면
Azure 콘솔을 통해서 확인한 결과

성공적으로 레지스트리가 생성된 결과를 확인할 수 있다. 추가로 패스워드 관련은 잘 가려진 것도 확인 가능하다.

3. AKS 클러스터 생성하기

마지막으로 대망의 AKS(Azure Kubernetes Service)에서 클러스터를 생성해보도록 하자. 대표적인 예시로 직접 가지고 있는 서버 컴퓨터들을 워커 노드, 그리고 클라우드에서 생성한 클러스터의 노드를 마스터 노드로 설정하여 사용하는 케이스도 있으니 이런 구성을 부분적으로 구성해보는 것도 좋다고 생각한다.

  • providers.tf (linux 프로파일 ssh접속을 위한 tls 플러그인을 추가)
terraform {
  required_providers {
    ...
    tls = {
        source = "hashicorp/tls"
        version = "4.0.5"
    }
  }
}

provider "tls" {
}

TLS를 추가했으니 아래 커멘드를 통해서 추가적으로 필요한 플러그인을 확인하고 구성하자.

 terraform init -upgrade

tls 관련 플로그인을 설치한 과정을 보이는 결과 화면

 

다음으로, aks에 구성 가능한 쿠버네티스 버전의 경우에는 아래의 커맨드를 입력하여 확인할 수 있으니 본인 환경에 맞게 골라서 설정해주자. 여기서 필자는 1.28 버전을 채택해서 구성해보았다.

az aks get-versions --location koreasouth

 

  • kubernetes-cluter.tf
resource "azurerm_kubernetes_cluster" "cluster" {
    name                = var.app_name
    location            = var.location
    resource_group_name = azurerm_resource_group.flixtube.name
    dns_prefix          = var.app_name
    kubernetes_version  = "1.28"

    linux_profile {
        admin_username = "linux_admin"

        ssh_key {
            key_data = "${trimspace(tls_private_key.key.public_key_openssh)} ${var.admin_username}@azure.com"
        }
    }

    default_node_pool {
        name            = "default"
        node_count      = 1
        vm_size         = "standard_d2"
    }

    identity {
    type = "SystemAssigned"
    }
}

클러스터는 위의 코드처럼 구성하였다. default 노드에서는 standard_d2를 사용해서 구성하였고, 실제로 생성할 리전에 대해서 본인의 할당량이 얼마나 되는지 확인하고 vm_size를 설정하는 것이 바람직하겠다. identity에서는 현재 terraform에서 Azure 리소스에 접근할 수 있는 관리 ID를 자동으로 생성하여 클러스터를 구성할 수 있겠다. 서비스 주체도 관리하는 기능까지 테라폼에서 관리 가능하다니 얼마나 강력한 도구인가!

마지막으로 apply하여 새롭게 구성된 인프라의 변화를 감상해보자.

쿠버네티스의 복잡한 구성 등으로 오래 걸렸지만 잘 생성된 결과를 확인할 수 있다.
콘솔: 짜잔 잘 생성되었다.

+ aks 인증 정보 확인 output 출력하기

더보기

생성한 aks 서비스 관리에 필요한 계정 인증 정보는 아래처럼 구성하여 나중에 확인해볼 수 있겠다.

output "client_certificate" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].client_certificate
  sensitive = true
}

output "client_key" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].client_key
  sensitive = true
}

output "cluster_ca_certificate" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].cluster_ca_certificate
  sensitive = true
}

output "cluster_password" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].password
  sensitive = true
}

output "cluster_username" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].username
  sensitive = true
}

output "host" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config[0].host
  sensitive = true
}

output "kube_config" {
  value     = azurerm_kubernetes_cluster.cluster.kube_config_raw
  sensitive = true
}

4. AKS 쿠버네티스 대시보드 확인하기

여기서 kubectl은 이미 설치되어 있다는 가정하에 진행된다.

 

현재 생성한 쿠버네티스 클러스터에는 따로 서비스가 운영되고 있지는 않지만, 대쉬보드를 생성하여 존재를 확인해보자. 테라폼이 야무지게 클러스터를 생성했으므로, 이에 대한 kubectl의 구성 파일은 Azure cli를 통해서 획득할 수 있겠다. 아래 커맨드를 실시하자.

az aks get-credentials --admin --resource-group exampletf --name exampletf

여기서 본인의 리소스 그룹 이름이랑 AKS 클러스터 이름이 다르다면, 해당 이름으로 바꿔서 커맨드를 실행해주면 되겠다.

 

아래 커맨드를 통해서 생성된 kubectl 구성 파일을 확인할 수 있다.

cat ~/.kube/config

내용이 문제가 없는지 확인해주면 되겠다.

 

다음으로는 default 노드께서 잘 지내시는지 안부인사를 드려보자.

kubectl get nodes

default 노드가 잘 구성되어 있는 것도 확인할 수 있다.

 

마지막으로 이제 대쉬보드를 아래 커맨드를 통해 설치하자.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

대쉬보드 관련 구성들이 야무지게 생성된 결과

 

프록시 커맨드를 사용하여 대쉬보드를 로컬에서 확인할수 있도록 잠시 설정해주자.

kubectl proxy

거의 다왔다! 접속해보자

 

서버는 8001 포트로 잘 실행됐지만, 정확한 대쉬보드의 접근 경로는 다음 url로 접근할 수 있다.

(도메인이 localhost이니 겁먹지 말고 클릭하자!)

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

위 링크로 접속할 시 마주할 화면

진짜진짜 마지막으로 아까 Azure cli를 통해서 구성한 ~/.kube/config 파일을 선택해주면 우리가 원하는 대쉬보드로 접속할 수 있겠다.

짠! 한글화도 잘 되어 있는 대쉬보드 화면을 볼 수 있다.

위에도 언급했지만, 아직 배포하고 있는 서비스가 없다. 그래서 재미는 떨어질 수 있지만, 여기까지 해서 이번 포스트에서 설정하고 확인할 인프라 구성은 다 해보았다. 여기까지 오느라 고생했다!

 

+ 쿠버네티스 대쉬보드 설치 문서

공식 문서에서 제공하는 가이드도 있으니 참고하면 도움되겠다!

https://kubernetes.io/ko/docs/tasks/access-application-cluster/web-ui-dashboard/

 

쿠버네티스 대시보드를 배포하고 접속하기

웹 UI(쿠버네티스 대시보드)를 배포하고 접속한다.

kubernetes.io

 

'인프라 Infra' 카테고리의 다른 글

Ubuntu24.04 ssh port 설정하기(sshd.service not found)  (0) 2024.05.07
'인프라 Infra' 카테고리의 다른 글
  • Ubuntu24.04 ssh port 설정하기(sshd.service not found)
덕소역
덕소역
(덕소 맛집이긴 하지만)실제 음식점과는 관련이 없고, 개발 관련 공부글을 적습니다.
  • 덕소역
    덕소할매순대국
    덕소역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 파이썬 Python
      • 자바스크립트 JavaScript
      • 데이터베이스 DB
      • 서버리스 Serverless
      • 백엔드 Backend
      • 인프라 Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Infra
    stdin
    greedy
    IAM
    elasticsearch
    Layer
    db
    terraform
    Lambda
    서비스 기획
    24.04
    Dashboard
    그리디
    기술 선정
    aks
    boto3
    sshd
    벡엔드
    search engine
    database
    ReadLine
    백엔드
    jwt
    kibana
    사진 게시물
    탐욕법
    fastapi
    PYTHON
    S3
    serverless
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
덕소역
[테라폼/Terraform] 애저(Azure) 리소스 그룹, 컨테이너 레지스트리, AKS 클러스터 생성하기
상단으로

티스토리툴바