IaC와 테라폼
구성관리(Configuration Magement)
- 구성(또는 형상; configuration)은 의존성 때문에 코드에 못지 않게 소프트웨어 시스템에 큰 영향 미침
- 따라서 구성 관리 (또는 형상관리)는 잦은 빌드, 통합, 릴리스로 이루어지는 CI/CD에 중요한 측면
- 이름 체계적으로 관리하고 자동화할 수 있는 여러 종류의 도구가 만들어지고 이용되어 왔음
IaC(Infrastructure as Code)
- 인프라스크럭처(소프트웨어가 의도된 목적을 활용하기 위하여 이용하는 환경 구성)를 생성, 변경, 관리
- 수작업에 의하는 것보다 안정성, 일관성, 재현 가능성을 향상시킬 수 있음
- 버전 관리, 재사용, 공유 등에 유리
- 프로그래밍에서와 유사하게 코드를 이용하여 인프라 리소스를 저의하고 조합하는 형태로 관리
- 다양한 형태 리소스 정의하고 조합하는 모듈들로 이루어짐
테라폼(Terraform)
IaC 도구
참고 링크 : https://developer.hashicorp.com/terraform
Scope => Author => Initialize => Plan => Apply
첫번째 구성 설정 작성
main.tf
- 중요한 부분: "provider"
- Terraform registry (kreuzwerker/docker)에서 설정 가져옴
- 버전은 3.0.1 이후로 지정
- Docker 이미지 지정하고 (nginx:latest)
- 이것을 이용한 컨테이너를 인프라로 생성
- http에 해당하는 포트(80)를 열어
- 이것을 8000 포트로 노출
=> main.tf 작성한 폴더에서 terraform init CLI로 실행
- terraform validate
- terraform fmt
- terraform apply -> yes
- yes 자동화 : terraform apply --auto-approve
변수를 이용한 인프라 구성
- main.tf 수정
- variables.tf 작성
- terraform apply --auto-approve --var "container_name=YetAnotherName"
출력 포맷 적용
- outputs.tf 작성 후 apply
- terraform output
테라폼 삭제
- terraform destroy
쿠버네티스 + 테라폼 + 젠킨스
terraform.tfVars 작성
- kubectl config view --minify --flatten
host
client_certificate
client_key
cluster_ca_certificate
인프라 구성 변경
deployment.tf 레플리카셋 4 => 2로 변경하여 scale down
[환경 정리]
terraform destroy
인프라 상태의 정보 유지
Terraform은 IaC 설정 디렉토리 안에 terraform.tfslate라는 파일 만들어
이 구성이 관리하고 있는 인프라의 현재 상태 유지하고 있음
- 인프라 구성의 선언에 변경이 발생하면 신규 생성, 삭제, 변경해야 할 리소스 인지할수 있는 것은 이것에 의존
- 그런데, CD 파이프라인에 적용하려면 이 상태 정보는 어디에 유지해야 할까?
Terraform Cloud
인프라 상태 정보 유지
- SCM(예:github)에 저장 바람직하지 않음
- Jenkins agent는 필요에 따라 생성되고 역할을 다하고 나면 사라지는 k8s 포드에 의해 실행되기 때문에 이 정보 기록x
- k8s persistent volume을 이용하는 방법 적합x
- 보통 저장 위한 vault 서비스 이용
Terraform Cloud 서비스 이용하기
- 링크 : https://app.terraform.io
- 윈도우에서 변수 설정
variable "kube_host" {
type = string
description = "Kubernetes API server endpoint"
}
variable "kube_token" {
type = string
description = "Kubernetes service account token"
sensitive = true
}
variable "kube_cluster_ca_certificate" {
type = string
description = "Kubernetes cluster CA certificate"
sensitive = true
default = ""
}
Jenkins 파이프라인 테스트 준비
- GitHub 새 repo 생성
- nginx.tf만 배치
- Jenkins credentials에 Terraform Cloud 인증 정보 추가
- 형태는 secret text~ "Secret"에는 앞서 발급한 Terraform Cloud의 인증 토큰 그대로 입력
- terraform-credentials 적용
- 파이프라인 스크립트 추가
요약
- Terraform provider(hashicorp/kubernetes) 이용해 k8s 클러스터 위에 구성되는 인프라 설정 IaC 방식으로 제어
- k8s 클러스터 설정을 Terraform에 적용하는 두가 지 방식
- 개별 변수 {host, client_certifiate, client_key, cluster_ca_certificate} 이용`
- Kubedinfig파일(로컬 컴퓨터 ~/.kube/config 또는 Jenkins secret을 agent에게 전달)의 경로 지정
- Terraform에 의해 관리되는 인프라 수것으이 상태 정보 Terraform Cloud에 저장
- 인프라 리소스 상태 정보 공유
- 민감한 정보 불필요한 노출 방지
'웹 파이프라인 > CD' 카테고리의 다른 글
| 간단한 CD 파이프라인 (0) | 2025.12.18 |
|---|