안녕하세요, Cloudraw입니다!
Terraform으로 Kubernetes 다루기 마지막입니다.
- Kubernetes Provider 사용 방법, 기본 오브젝트 생성하기(Namespace, Pod, Service, Secret)
- 볼륨 리소스 다루기(CSP별 Blob 및 configmap mount)
- 네트워크 리소스 다루기(Ingress, Nginx-Ingress(Helm Chart))
- DNS 연동 및 인증서 발급(Let's Encrypt 및 Cert Manager(Helm))
- CloudStudio로 위 1~4 구성하기
마지막, CloudStudio로 1~4 과정 구성하기
이번 단계에서는 1~4단계에서 다뤘던 내용들을 CloudStudio를 이용하여 구현해 보겠습니다.
CloudStudio를 사용하는 방법은 블로그의 첫 번째 글을 참고하시거나 CloudStuido 가이드를 참고하시면 되겠습니다.
이번 과정을 모두 완료하게 되면 아래와 같은 아키텍처를 구성할 수 있습니다.
완성 아키텍처
🧾 사전 준비 사항
항목 | 설명 |
1. CloudStudio | 클라우드 인프라 시각화 및 관리 서비스 https://cstudio.app |
2. Credentials 등록하기 | 사용할 CSP의 Credentials 등록하기 |
3. VCS 등록하기 | 캔버스의 버전 관리를 하기 위한 VCS 등록하기 |
4. Terraform Cloud 계정 등록 | 인프라의 배포나 유효성 검사를 위한 Terraform 계정 등록하기 |
5. 외부 접속 가능한 DNS 도메인 | 예시: cloudraw.kr |
설명: Kubernetes 템플릿 생성하기를 통해 위에서 배포해 놓은 클러스터에 Namespace, Pod, Service, Secret 등을 배치합니다.
- ✅ Namespace 생성
- ✅ Pod 및 컨테이너 이미지 지정
- ✅ Service 연결 (ClusterIP/LoadBalancer)
아키텍처
1-1. Base 배치
캔버스에서 Base 아이콘을 가져온 후 등록한 크레덴셜을 선택합니다.
1-2. Cluster 배치
Cluster 아이콘을 가져옵니다. Target Cluster에 크레덴셜로 조회된 Cluster를 선택합니다.

1-3. Namespace 배치
Namespace 아이콘을 가져와서 Cluster 안에 배치한 후 Namespace 이름을 지정해줍니다.
1-4. Pod 배치
Pod 아이콘을 가져와 Namespace 안에 배치한 후 옵션들을 설정해 줍니다.
- Containers에 옵션을 추가합니다.
- Container > Image 에 nginx를 입력합니다.
- Container > Port 에 80을 추가합니다.
1-5. Service 배치
Service 아이콘을 가져와 Namespace 안에 배치한 후 다음 과정들을 진행해 줍니다.
- Pod와 선으로 연결합니다. (Selector가 연결된 Pod의 값으로 설정됩니다.)
- Type를 ClusterIP로 설정합니다.
- Port > Port에 80을 입력합니다. (외부 노출 Port)
- Port> Target Port에 80을 입력합니다. (연결된 Pod Container Port)
2️⃣ 볼륨 리소스 구성 (Blob / ConfigMap Mount)
설명:외부 스토리지나 설정 파일을 마운트하기 위해 Volume을 구성하고, Azure Blob, PVC, ConfigMap을 Pod에 연결합니다.
- ✅ Storage Class 생성
- ✅ PV 생성
- ✅ PVC 생성
- ✅ ConfigMap 생성
- ✅ Pod에 Volume Mount 적용
아키텍처
2-1. Storage Class 배치
Storage Class 아이콘을 가져와 Cluster 안에 배치하고, Storage Class 이름 및 Provisioner 유형(Blob 선택)등을 설정해 줍니다.
2-2. PV(PersistentVolume) 배치
PV 아이콘을 가져와 아이콘을 가져와 Cluster 안에 배치하고, 다음 설정을 진행해 줍니다.
- Storage Class와 선으로 연결합니다.
- Storage Class Name을 위 과정에서 배치한 서비스 명으로 입력합니다.
- Storage Capacity (사용할 스토리지 용량)을 설정해 줍니다.
- Volume Driver > blob.csi.azure.com (blob형식)
- Volume Handle(PV가 실제 스토리지 자원에 연결되는 식별자)을 지정하여 입력합니다.
- *Volume Attributes(사용할 볼륨의 속성을 지정)
- Access Modes > ReadWriteOnce
💡Azure Blob CSI 드라이버의 Volume Attributes 항목
Key | 설명 |
containerName | 연결할 Azure Blob Container 이름 |
storageAccount | 연결할 Azure Storage 계정명 (선택적이지만 권장) |
protocol | fuse2 또는 nfs 중 선택 가능 (fuse2가 기본) |
mountOptions | (선택) --file-cache-timeout-in-seconds=120 등 |
2-3. PVC(PersistentVolumeClaim) 배치
PVC 아이콘을 가져와 Namespace 안에 배치하고, 서비스 이름을 설정한 후 다음 설정을 진행해 줍니다.
- Pod와 선으로 연결합니다.
- PV와 선으로 연결합니다.
- Storage Class Name을 위 과정에서 배치한 서비스 명으로 입력합니다.
- Request Storage (스토리지 용량)을 설정해 줍니다.
- *Access Modes(접근 방식)을 설정해 줍니다.
💡주요 Access Modes 종류
Access Mode | 설명 | 특징 |
ReadWriteOnce (RWO) | 하나의 Pod에서 읽기/쓰기 가능 | ✅ 가장 일반적 |
ReadOnlyMany (ROX) | 여러 Pod에서 읽기 전용으로 공유 | 🔍 공유 로그 등 |
ReadWriteMany (RWX) | 여러 Pod에서 동시에 읽기/쓰기 가능 | 📂 공유 작업공간 |
2-4. ConfigMap 배치
ConfigMap 아이콘을 가져와 Namespace 안에 배치하고, 서비스 이름을 설정한 후 주입할 data를 입력해 줍니다.
- Pod와 선으로 연결합니다.
- ConfigMap 리소스를 클릭하고 주입할 Data를 입력합니다.
- Pod 리소스를 클릭하고 설정값들을 추가합니다.
- Containers > 데이터 주입 방식 선택(Env or Env From)을 합니다.
- Volume > Default Mode(생성될 파일 권한)을 설정합니다. (0644가 적합)
- Volume > Items에 ConfigMap에서 주입한 data의 Key값과 경로를 설정합니다.
ConfigMap 리소스 설정
Pod 리소스 > Containers > 데이터 주입방식을 Env 설정 시
- Name : 옵션명 설정
- Type : valueFrom선택
- ENV Name : 주입할 Data의 Key 값
- Value From Type : configMap 선택
- Target Config Name : Pod와 연결한 ConfigMap 중 주입할 Data를 갖고 있는 configMap 선택
- Target Config Key : 주입할 Data의 Key 값
Pod 리소스 > Containers > 데이터 주입방식을 Env From 설정 시
- Name : 옵션명 설정
- Type : configMap 선택
- Target Config Name : Pod와 연결한 ConfigMap 중 주입할 Data를 갖고 있는 configMap 선택
💡데이터 주입 방식에 따라 설정이 다른 이유? (2번째 글 참조)
1. Env: 개별 환경변수를 설정하는 곳
- value: 직접 값 입력 (예: APP_ENV=production)
- valueFrom: ConfigMap 또는 Secret에서 특정 key만 가져옴
2. Env From: ConfigMap 전체를 한 번에 환경변수로 주입하는 곳
- Type: configMap 또는 secret 이 방식은 key들을 모두 한꺼번에 주입함.
3️⃣ Ingress 및 Nginx-Ingress(Helm Chart) 구성
설명:외부 요청을 클러스터 내부 서비스로 전달하는 Ingress를 구성하고, Helm을 사용하여 Nginx-Ingress Controller도 설치합니다.
- ✅ Helm Chart: nginx-ingress 설치
- ✅ Ingress 리소스 생성 및 Service와 연결
- ✅ Host 경로와 Prefix 설정
아키텍처
3-1. Nginx Ingress Controller 배치
새 Namespace 아이콘을 가져와 Cluster 안에 배치하고, Nginx Ingress 아이콘을 가져와 해당 Namesapce에 배치합니다.
- Replica Count : Ingress Controller 의 Deployment 복제본 수 지정
- *External Traffic Policy : 외부 트래픽 응답에 관한 정책 설정
- Ingress Class Name: Ingress를 어떤 Ingress Controller에 의해 처리될지 지정하는 리소스의 이름 지정(3번째 글 참조)
💡External Traffic Policy 옵션 차이점
1. Local: Pod가 실제로 할당된 노드에서만 트래픽을 수신할 수 있습니다. 이 설정은 클러스터 내 특정 노드에 할당된 Pod에서만 트래픽을 처리하도록 제한하고, 다음과 같은 특성이 있습니다.
- 트래픽 제한: 요청을 받은 노드에 해당 Pod가 할당되지 않은 경우 트래픽은 전달되지 않습니다.
- 원본 IP 유지: 요청을 전달할 때 외부 클라이언트의 IP 주소가 그대로 유지됩니다.
- 로드 밸런서 비용 절감: 불필요한 로드 밸런서 비용을 줄일 수 있습니다.
2. Cluster: Cluster 옵션을 선택하면 모든 노드에서 외부 트래픽을 수신할 수 있습니다. 트래픽은 클러스터의 모든 노드에서 받아들이고, 각 노드는 트래픽을 해당 서비스의 Pod로 전달합니다.
- 트래픽 분산: 모든 노드에서 트래픽을 받아들여, 클러스터 전체에서 트래픽이 적절히 분산됩니다.
- 원본 IP 손실: 트래픽이 클러스터 내부에서 라우팅될 때 원본 IP 주소가 손실될 수 있습니다.
- 유연한 확장성: 여러 노드에서 트래픽을 받아들이므로 확장성이 높습니다.
3-2. Ingress 배치
Ingress 아이콘을 가져와 Pod가 있는 Namespace에 배치한 후 서비스 명을 지정하고 다음과 같은 작업을 입력합니다.
- Nginx Ingress Controller와 선으로 연결합니다.
- Service 리소스와 선으로 연결합니다.
- Ingress Class Name을 지정합니다. (위에서 설정했던 값 ex: cloudraw)
- Rule 옵션을 추가해 줍니다.
- Rule > Target Service : 대상 백엔드 서비스, Ingress와 연결된 서비스 중 선택 > 배치한 Service 리소스 선택
- Rule > Path: 백엔드와 연결될 통로 지정 > 루트 경로(/)로 선택
- Rule > Port > 80
- Rule > Path Type: 경로 일치의 해석을 결정 > Prefix
4️⃣ DNS 연동 및 HTTPS 인증서 발급 구성
설명:도메인과 LoadBalancer를 연결 및 Let's Encrypt를 통해 HTTPS 인증서를 발급한 후 cert-manager를 Helm으로 설치하고, Issuer와 TLS 설정을 적용합니다.
- ✅ cert-manager 설치 (Helm)
- ✅ Issuer 리소스 생성
- ✅ Ingress 리소스에 TLS, Annotation 추가
- ✅ DNS A 레코드 연결 (Azure 또는 Terraform 사용)
- ✅ HTTPS 접속 확인 (브라우저 인증 🔒)
✅ 위 과정은 도메인과 Ingress Controller의 EXTERNAL-IP가 매핑이 되었다는 가정하에 진행합니다.
아키텍처
4-1. Cert Manager 배치
새 Namespace 아이콘을 가져와 Cluster안에 배치하고, Cert Manager 아이콘을 해당 Namespace에 배치합니다.
4-2. Issuer 배치
Issuer 아이콘을 가져와 Ingress 리소스가 있는 Namespace에 배치하고, Issuer 이름 지정 및 설정을 진행합니다.
- Issuer와 Ingress를 연결하세요.
- Acme 설정을 진행합니다.
- Acme > Server(ACME 서버의 엔드포인트 주소) > https://acme-v02.api.letsencrypt.org/directory 입력
- Acme > Email(문제가 생길경우 받을 이메일) 입력
- Acme > Private Key Secret Ref(ACME 서버와 통신에 사용될 클라이언트 키를 저장하는 Kubernetes Secret의 이름을 지정)
- *Solvers 설정을 진행합니다. (Dns Solvers 또는 Http Solvers) 중 선택
💡Solvers 유형 유형 선택
1. Dns Solvers: solver를 DNS로 설정했을 경우에 해당하는 설정들을 정의(이번 과정에선 해당 방법 선택)✅
2. Http Solvers: HTTP 챌린지 유형을 선택했을 때의 설정값을 지정
적용하기 후 추가 설정 dns를 갖고 있는 credentials 정보를 입력합니다.
⚠️ 주의
Secret Key 같은 경우엔 노출되어선 위험하니 Secret 리소스를 캔버스에 배치하고
Data에 Key:Value 값으로 저장해준 뒤
credentials 정보를 입력 시 Client Secret name에는 Secret 리소스명,
Secret Key에는 Data에 저장한 Key값을 입력합니다.
4-3. Ingress 리소스에 인증서 적용을 위한 설정 추가
위 과정까지 다 진행하였으면 다시 Ingress 리소스에서 인증서 적용을 위해 다음과 같은 설정을 추가해 줍니다.
- Annotations에 아래 Key:Value가 존재하는지 확인하고, 없다면 직접 추가해 주세요.
Annotations
- Key(cert-manager.io/issuer) : Value(letsencrypt-test) -> Issuer 연결이 잘 되었다면 들어가 있습니다.
- Key(kubernetes.io/ingress.class) : Value(cloudraw) -> IngressClass를 참조할 수 있도록 지정합니다.
- Tls 설정 값을 추가해 줍니다.
- Hosts(HTTPS 인증서를 적용할 도메인)을 입력합니다. > ex) test.cloudraw.kr
- Secret Name(발급된 인증서가 저장될 Secret 이름)을 입력합니다. > ex) cloudraw-tls-secret
- Rule > 위에서 추가하였던 Rule(cloudraw-service)에 Host를 입력합니다. ex) test.cloudraw.kr
4-4. 유효성 검사 및 배포하기
좌측의 유효성 검사 카테고리로 이동하여 구성 및 설정이 잘못되지 않았는지 확인합니다.
유효성 검사가 통과하면 배포하기 카테고리로 이동하여 배포를 시작합니다.
배포가 완료되면 아래처럼 확인할 수 있습니다.
인증 상태 확인 및 접속 테스트
kubectl get certificate -A
kubectl describe certificate -n <namespace>
kubectl get secret -A | grep tls
인증 성공 시 위와 같은 결과를 확인할 수 있습니다.
마무리하며
지금까지 Terraform으로 Kubernetes 인프라를 구성하는 전 과정을 직접 따라오며, IaC의 복잡함과 구조화된 설정의 중요성을 체감해보았습니다.
이번 글에서는 이러한 과정을 CloudStudio의 GUI 환경을 통해 Kubernetes 인프라를 구성하고 배포하는 전 과정을 함께 살펴보았습니다. Terraform 코드를 일일이 작성하지 않고도, 시각적인 인터페이스에서 리소스를 배치하고 자동 생성된 코드를 활용해 클러스터에 적용하는 과정을 통해, 복잡한 IaC 작업도 훨씬 직관적이고 효율적으로 수행할 수 있다는 점을 확인할 수 있었습니다.
이번 시리즈를 통해 직접 코드를 다루는 방식과 시각적 도구를 병행하며, Terraform 기반 Kubernetes 인프라 구성의 전 과정을 더 깊이 이해하고, 더 유연하게 선택할 수 있는 기반을 마련하셨기를 바랍니다.
CloudStudio
CloudStudio is a cloud and kubernetes visualization and management service that is Infrastructure as Code(IaC) based. It offers various features such as architecture diagram, convert to IaC(Terraform), state management, cost estimation, version control and
cstudio.app
이제는 복잡한 코드 대신, CloudStudio로 더 빠르고 쉽게 Kubernetes 인프라를 구축해보세요.
Cloudraw는 쉽게 클라우드 인프라를 그리고 사용할 수 있는 서비스를 제공하기 위해 노력하고 있습니다.
클라우드가 있는 곳 어디든 Cloudraw가 함께합니다.
📨 help@cloudraw.kr
'IaC' 카테고리의 다른 글
[IaC] Terraform으로 Kubernetes 다루기 - 4/5 (0) | 2025.06.10 |
---|---|
[IaC] Terraform으로 Kubernetes 다루기 - 3/5 (0) | 2025.05.22 |
[PaC] HCP Terraform Sentinel을 활용한 배포 정책 적용 (0) | 2025.05.12 |
[IaC] Terraform으로 Kubernetes 다루기 - 2/5 (0) | 2025.04.17 |
[IaC] Terraform Enterprise AKS에 배포하기 (0) | 2025.02.07 |