
Part1 : K-PaaS의 이해
K-PaaS의 정의
- K-PaaS란 국내 IT 환경에 최적화하여 개발 및 운영을 표준화한 오픈소스 기반의 클라우드 플랫폼(PaaS)를 말한다.
- 쉽게말해 오픈소스 기반인 Cloud Foundry나 Kubernetes를 활용하여 국내 공공 및 민간 환경에 맞게 고도화한 서비스형 플랫폼이다.
- 클라우드 인프라 위에서 SW나 서비스를 개발/실행/운영/관리 하는 기반 SW 환경이다.
- Cloud Native Application을 위한 플랫폼 서비스의 핵심 기능으로, 사용 PaaS의 호환성 보장을 위해 공통된 기능들을 오픈 소스로 개발되었다.
컨테이너 플랫폼의 정의
- 컨테이너 플랫폼은 쿠버네티스 클러스터 및 운영에 필요한 스토리지 서버로 구성되며,
- discription을 기반으로 컨테이너화된 어플리케이션을 배포하는 방식으로 동작한다.
- K-PaaS 컨테이너 플랫폼에는 [단독배포]와 [Edge배포]가 있다.

※ 단독배포의 경우 컨테이너 플랫폼을 단독으로 배포하여 독립된 쿠버네티스 환경을 제공하는 배포 방식이다.
컨테이너 플랫폼의 주요 소프트웨어
| 구성 | 내용 |
| Kubespray | [설치 자동화] - Ansible 기반으로 쿠버네티스 클러스터를 쉽고 빠르게 설치하고 구성합니다. |
| Kubernetes | [오케스트레이션] - 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오케스트레이션 도구 |
| CRI-O | [컨테이너 런타임] - Kubernetes를 위한 표준(OCI) 컨테이너 런타임 인터페이스 |
| Calico | [네트워킹/보안] - L3 기반 가상 네트워크를 구축하고 Pod 간 통신을 위한 네트워크 정책 솔루션을 제공합니다. |
| Metal LB | [로드밸런싱] - Kubernetes의 Service를 LoadBalancer 타입으로 서비스할 수 있도록 해주는 솔루션 |
| NginX ingress Controller |
[네트워킹 / 게이트웨이] - Kubernetes 및 컨테이너화된 환경의 Cloud Native 앱을 위한 트래픽 관리 솔루션 |
| HELM | [패키지 관리] - 복잡한 쿠버네티스 리소스를 차트 단위로 묶어 설치와 업데이트를 간소화합니다. |
| Istio | [서비스 메시] - 분산형 마이크로서비스 기반 앱을 어디서나 실행할 수 있도록 지원하는 서비스 메시 |
| Podman | [컨테이너 런타임] - 오픈소스 기반의 Linux 시스템에서 컨테이너를 개발, 관리, 실행하기 위한 도구 (데몬 X) |
| NFS | [파일 시스템] - 네트워크를 통해 다른 호스트에 있는 파일을 공유해 사용할 수 있도록 한 분산 파일 시스템 |
| OpenTofu | [인프라] - 테라폼을 대체하는 오픈소스로, 클라우드 환경에서 인프라 관리를 단순화하는 프로비저닝 도구 |
| Rook Ceph | [스토리지] - 클라우드 환경에 최적화된 Ceph 분산 스토리지의 배포와 관리를 자동화하는 오픈소스 도구입니다. |
| Vault | [보안] - 암호화 관리 시스템, Key값을 따로 저장 |
| Maria DB | [데이터베이스] - MySQL의 수정 버전으로, 오픈소스 기반의 관계형 데이터베이스 관리 시스템(RDBMS) |
| Harbor | [이미지 관리] - 컨테이너 이미지를 안전하게 저장하고 스캔하는 프라이빗 레지스트리입니다. |
| Keycloak | [인증/보안] - 사용자 인증 및 권한 관리를 통합 제공하는 오픈소스 ID 관리 솔루션입니다. |
Part2 : NHN Cloud의 이해
NHN 아키텍처 : 맨외부 = 조직 → 리젼 → 프로젝트 → 여러 VPC → 네트워킹

AWS 아키텍처 : AWS → 리젼 → VPC → Subnet → (라우터) → Subnet → Gateway(외부-VPC통신)
※ 라우터-Gateway를 연결해야 외부랑 내부랑 통신이 가능.

네트워크 기초 (VPC & Subnet)
- VPC (Virtual Private Cloud): 클라우드 내 사용자의 독립적인 가상 네트워크 공간입니다. IP 주소 범위(CIDR)를 직접 설정하여 다른 사용자와 완전히 격리된 환경을 만듭니다.
- Subnet (서브넷): VPC를 다시 쪼갠 하위 네트워크입니다.
- Public Subnet: 외부 인터넷과 직접 통신이 가능한 구역입니다.
- Private Subnet: 외부와 차단되어 DB 등 보안이 중요한 자원을 배치하는 구역입니다.
네트워킹 및 라우팅
- Internet Gateway (IGW): VPC와 인터넷 간의 통신을 가능하게 하는 관문입니다. 이게 없으면 내부 인스턴스는 외부와 데이터를 주고받을 수 없습니다.
- Routing (라우팅): 네트워크 트래픽이 목적지까지 가는 경로를 결정하는 작업입니다. 라우팅 테이블(Routing Table)에 "외부로 나가는 트래픽은 IGW로 가라"는 규칙을 반드시 등록해야 합니다.
- Network Interface (NIC/ENI): 가상 서버(Instance)가 네트워크에 연결되는 통로(랜카드)입니다.
- 계층 구조: 인스턴스 ↔ Network Interface ↔ 서브넷
- Floating IP (플로팅 IP): 인스턴스에 고정적으로 할당할 수 있는 공인 IP입니다. 인스턴스가 바뀌어도 IP를 유지하여 외부 연결성을 보장합니다.
보안 및 컴퓨팅
- Security Groups (보안 그룹): 가상 서버(Instance) 레벨의 방화벽입니다. 특정 포트(예: HTTP 80, SSH 22)를 허용하거나 차단하여 인바운드/아웃바운드 트래픽을 제어합니다.
- Instance (인스턴스): 클라우드에서 제공하는 가상 서버 1대를 의미합니다.
- 구성 요소: 연산을 담당하는 CPU, 임시 데이터를 적재하는 Memory, 영구 저장소인 Block Storage(디스크) 등으로 이루어집니다.
네트워크 흐름 정리
→ 외부 인터넷 요청
→ Internet Gateway(VPC 입구)
→ Routing Table(어느Subnet)
→ Network Interface(외부주소와 내부주소 변경)
→ Security Group(보안검증)
→ Instance(최종 목적지)
Part3 : NHN Cloud 구축
1. Public Key 등록 : Compute → keypair
2. Subnet 생성 : Network → Subnet → 서브넷 생성

3. Subnet을 라우터에 연결하기 : Network → Subnet → 라우팅 테이블 연결

4. Security Group에 보안 규칙 생성하기 : Network → Security Group
해당 프로젝트에서는 Default SG를 사용했으며 test를 위해 모든 포트에 대해 접근 가능하도록 설정해두었다.
※ 보안규칙 생성 - TCP, 1~65535, IPv4 0.0.0.0/0(CIDR)

5. Intance 생성 : Compute -> Instance -> 인스턴스 생성
5-1. 인스턴스 이미지 선택

5-2. 인스턴스 정보 입력 (인스턴스 타입 / 개수 / 키 페어 적용 / 스토리지 )
※ 인스턴스가 5개인 이유 ( 1개 Master Node / 3개 Worker Node / 1개 NFS용 클러스터 )

5-3. 네트워크 설정

5-4. 정보 확인 및 생성 확인.
6. SSH로 터널링하여 클러스터1에 접속하기
6-1. 플로팅 IP만들고 클러스터1에 연결하기

6-2. MobaXterm로 cluster1에 ssh로 연결하기
※ 인스턴스를 생성할 때 사용한 key값과 동일한 private key값을 넣어주면 통신이 가능해진다.

//TODO : 실제 접속했을 때의 .ssh 파일의 상태 사진 추가
7. 네트워크 인터페이스 설정
목적 : 이전에는 터널링 용 네트워크 인터페이스였다면 이번에는 외부에서 접근 가능한 네트워크 인터페이스를 만드는 것.
//TODO : 지정 IP값을 어떻게 설정했는지 사진 추가
8. NFS 서버 연결하기
목적 : cluster5을 공유 폴더를 만들기 위해 cluster5에 대한 내부 ip에 접속하기
ubuntu@kym-cluster1:~/.ssh$ sudo ssh ubuntu@192.168.10.67 -i ~/.ssh/ssu-key.pem
9. Cluster5에서 NFS Server 설치하기
9-1. nfs server 관련 apt 패키지 설치

9-2. nfs server에서 사용할 디렉토리 생성 권한 부여
9-3. 공유 디렉토리 설정
※ 연결하는 private ip는 Cluster1,2,3,4의 ip이다.

9-4. nfs server 재시작

//TODO : 실제 서버에 접속해서 nfs 공유 디렉토리 설정 사진 추가
10. SSH Key 생성 및 배포
목적 : 클러스터들을 연결하는 과정으로, cluster2,3,4에 대해 외부와 연결이 되어 있는 cluster1과 내부적으로 연결하는 과정이다.
10-1. 처음 key pair는 NHN instance를 생성할 때 사용되는 key pair / 현재 만드는 key pair는 cluster끼리 통신하기 위한 key pair이다
10-2. cluster1에서 key pair를 생성한다.
ssh-keygen -t rsa
10-3. cluster1에서 생성한 rs_ids.pub을 1,2,3,4클러스터의 authorized_keys(SSH 인증의 “열쇠 목록”)에 추가하기
※ 외부에서는 cluster1에 접속하고 cluster1의 worker노드랑 2,3,4의 worker노드와 동기화 해주기 위해서 cluster1에 2,3,4의 통신을 위한 key pair를 연결해준 것

//TODO : 실제 사진 추가하기
현재까지 진행한 내용을 정리하면
- 인스턴스 생성 = VPC, Subnet, IGW연결, SG 설정, 인스턴스 생성
- SSH로 Cluster1에 접속
- Network Interface 추가
- NFS 서버 설정
- Cluster1과 Cluster2,3,4 연결하기
Part4 : K-PaaS 컨테이너 플랫폼 배포

Single Cloud 배포 방식으로 K-PaaS 컨테이너 플랫폼을 배포해보려고한다.
과정은 크게 4가지, 배포해야하는 것은 3가지 이다.
1. 클러스터 설치
2. 포터 설치 및 배포
3. 파이프라인 설치 및 배포
4. 소스 컨트롤 설치 및 배
※ 설치 가이드(https://github.com/K-PaaS/container-platform?tab=readme-ov-file#ideas-rexx4314)
1. 클러스터 설치
1-1. K-PaaS 컨테이너 플랫폼 클러스터 Deployment 다운르드
$ git clone https://github.com/K-PaaS/cp-deployment.git -b branch_v1.7.x
1-2. 클러스터 설치에 필요한 환경변수를 사전 정의 후 쉘 스크립트를 통해 설치 진행
$ cd ~/cp-deployment/single
$ vi cp-cluster-vars.sh
//TODO : 실제 값 확인해야함.
#!/bin/bash
# --------------------------------------------------------------------
# Control Plane 노드 설정
# --------------------------------------------------------------------
# Control Plane (Master) 노드 개수 (예: 1, 3, 5 ...)
KUBE_CONTROL_HOSTS= {마스터 노드 개수는 1개}
# Control Plane (Master) 노드 정보
# Control Plane 노드 개수에 맞춰 설정
MASTER1_NODE_HOSTNAME= {Cluster1의 name}
MASTER1_NODE_USER=ubuntu
MASTER1_NODE_PRIVATE_IP= {Cluster1의 private IP}
MASTER1_NODE_PUBLIC_IP= {Cluster1의 플로팅 IP}
MASTER2_NODE_HOSTNAME=
MASTER2_NODE_PRIVATE_IP=
MASTER3_NODE_HOSTNAME=
MASTER3_NODE_PRIVATE_IP=
# --------------------------------------------------------------------
# LoadBalancer 설정
# --------------------------------------------------------------------
# Control Plane 노드가 2개 이상일 때 필수 설정
# 외부 로드밸런서 도메인 또는 IP
LOADBALANCER_DOMAIN=
# --------------------------------------------------------------------
# ETCD 노드 설정
# --------------------------------------------------------------------
# ETCD 구성 방식
# Control Plane 노드가 2개 이상일 때 필수 설정 (예: external, stacked)
# - external : 별도 ETCD 노드 구성
# - stacked : Control Plane 노드에 ETCD가 통합된 구성
ETCD_TYPE=
# ETCD_TYPE=external 일 때 필수 설정
# Control Plane 노드 수와 동일 개수로 설정
ETCD1_NODE_HOSTNAME=
ETCD1_NODE_PRIVATE_IP=
ETCD2_NODE_HOSTNAME=
ETCD2_NODE_PRIVATE_IP=
ETCD3_NODE_HOSTNAME=
ETCD3_NODE_PRIVATE_IP=
# --------------------------------------------------------------------
# Worker 노드 설정
# --------------------------------------------------------------------
# Worker 노드 개수
KUBE_WORKER_HOSTS= {워커 노드 개수는 3개}
# Worker 노드 정보
# Worker 노드 개수에 맞춰 설정
WORKER1_NODE_HOSTNAME= {Cluster2의 name}
WORKER1_NODE_PRIVATE_IP= {Cluster2의 private IP}
WORKER2_NODE_HOSTNAME= {Cluster3의 name}
WORKER2_NODE_PRIVATE_IP= {Cluster3의 private IP}
WORKER3_NODE_HOSTNAME= {Cluster4의 name}
WORKER3_NODE_PRIVATE_IP= {Cluster4의 private IP}
# --------------------------------------------------------------------
# Storage 설정
# --------------------------------------------------------------------
# Storage 구성 방식 (예: nfs, rook-ceph)
STORAGE_TYPE= {nfs방식을 사용, cluster5}
# Storage 구성 방식 'nfs'일 때 NFS 서버 Private IP
NFS_SERVER_PRIVATE_IP= {Cluster5의 private IP}
# --------------------------------------------------------------------
# MetalLB 설정
# --------------------------------------------------------------------
# MetalLB Address Pool 범위 (예: 192.168.0.150-192.168.0.160)
METALLB_IP_RANGE= {기억안남}
# Ingress Nginx Controller LoadBalancer Service용 External IP
# - 인터페이스 추가 방식 : 인터페이스 Private IP 입력
# - LoadBalance 서비스 방식 : LoadBalance 서비스 Public IP 입력
INGRESS_NGINX_IP= {기억안남}
# --------------------------------------------------------------------
# Kyverno 설정
# --------------------------------------------------------------------
# Kyverno 설치 여부 (예: Y, N)
# - Y : 설치, PSS (Pod Security Standards) 및 cp-policy 정책 (네임스페이스간 네트워크 격리) 자동 적용
# - N : 설치하지 않음
INSTALL_KYVERNO=
# --------------------------------------------------------------------
# CSP LoadBalancer Controller 설정
# --------------------------------------------------------------------
# CSP 설정 (예: NHN, NAVER)
CSP_TYPE=
# NHN Cloud 환경 변수 (CSP_TYPE=NHN 일때 필수 입력)
NHN_USERNAME=
NHN_PASSWORD=
NHN_TENANT_ID=
NHN_VIP_SUBNET_ID=
NHN_API_BASE_URL=https://kr1-api-network-infrastructure.nhncloudservice.com
# NAVER Cloud 환경 변수 (CSP_TYPE=NAVER 일때 필수 입력)
NAVER_CLOUD_API_KEY=
NAVER_CLOUD_API_SECRET=
NAVER_CLOUD_REGION=KR
NAVER_CLOUD_VPC_NO=
NAVER_CLOUD_SUBNET_NO=
1-3. K-PaaS 컨테이너 플랫폼 클러스터 설치 및 확인
쉘 스크립트를 통해 필요 패키지 설치, 클러스터 설치 환경변수 설정, Ansible playbook을 통한 컨테이너 플랫폼 클러스터 설치를 순차적으로 진행
$ ./deploy-cp-cluster.sh

2. 포털 설치 및 배포
2-1. 컨테이너 플랫폼 포털 Deployment 파일 다운로드
# Deployment 파일 다운로드 경로 생성
$ mkdir -p ~/workspace/container-platform
$ cd ~/workspace/container-platform
# Deployment 파일 다운로드 및 파일 경로 확인
$ wget --content-disposition https://nextcloud.k-paas.org/index.php/s/qrApL4sP5eC2WMX/download
$ ls ~/workspace/container-platform
cp-portal-deployment-v1.7.0.tar.gz
# Deployment 파일 압축 해제
$ tar -xvf cp-portal-deployment-v1.7.0.tar.gz
※ Deployment 파일 디렉토리 구성
cp-portal-deployment
├── script # (싱글) 포털 배포를 위한 변수 및 스크립트 파일 위치
├── script_mc # (멀티) 포털 배포를 위한 변수 및 스크립트 파일 위치
├── script_fed # (페더레이션) 포털 배포를 위한 변수 및 스크립트 파일 위치
├── values_orig # Helm 차트 values 파일 위치
├── secmg_orig # 시크릿 관리 시스템 배포 파일 위치
└── istio_mc # Istio 서비스 메시 관련 파일 위치
2-2. 컨테이너 플랫폼 포털 변수 정의
$ cd ~/workspace/container-platform/cp-portal-deployment/script
$ vi cp-portal-vars.sh
# COMMON VARIABLE (Please change the value of the variables below.)
K8S_MASTER_NODE_IP="{k8s master node public ip}" # Kubernetes Master Node Public IP
K8S_CLUSTER_API_SERVER="https://${K8S_MASTER_NODE_IP}:6443" # kubernetes API Server (e.g. https://${K8S_MASTER_NODE_IP}:6443)
K8S_STORAGECLASS="cp-storageclass" # Kubernetes StorageClass Name (e.g. cp-storageclass)
HOST_CLUSTER_IAAS_TYPE="1" # Kubernetes Cluster IaaS Type ([1] AWS, [2] OPENSTACK, [3] NAVER, [4] NHN, [5] KT)
HOST_DOMAIN="{host domain = 플로팅 IP + .nip.io}" # Host Domain (e.g. xx.xxx.xxx.xx.nip.io)
※ host domain에서 외부IP는 아래 명령어를 통해 확인 가능하다
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.233.49.255 192.168.0.xxx (확인) 80:30465/TCP,443:32226/TCP 26h
2-3. 컨테이너 플랫폼 포털 배포 스크립트 실행
$ chmod +x deploy-cp-portal.sh
$ ./deploy-cp-portal.sh
// TODO : 실제 사진 넣기
# OpenBao Pod 조회
$ kubectl get pods -n openbao
# MariaDB Pod 조회
$ kubectl get pods -n mariadb
# Harbor Pod 조회
$ kubectl get pods -n harbor
# Keycloak Pod 조회
$ kubectl get pods -n keycloak
# 컨테이너 플랫폼 포털 Pod 조회
$ kubectl get pods -n cp-portal
# 서비스 접속 Host 조회
$ kubectl get ingress -A
3. 파이프라인 설치 및 배포 : 링크 방법 확인
4. 소스 컨트롤 설치 및 배포 : 링크 방법 확인
이번 실습은 NHN Cloud 인프라 구축부터 K-PaaS 연동까지 클라우드 네이티브 환경의 전 과정을 경험할 수 있는 시간이었다.
단순히 도구를 설치하는 것을 넘어, 클라우드 아키텍처의 근간이 되는 VPC 네트워크 흐름을 설계하고, Key Pair를 활용한 보안 통신 체계를 직접 구성하며 인프라의 유기적인 연결 원리를 깊이 있게 이해할 수 있었습니다. 결국 클라우드 운영의 핵심은 '설치' 그 자체가 아니라, 각 자원들이 어떤 목적과 경로로 연결되는지에 대한 설계 역량에 있음을 깨달을 수 있었다.
'Cloud' 카테고리의 다른 글
| [Cloud] 마이크로서비스 아키텍처(MSA)란? (0) | 2026.01.07 |
|---|---|
| [Cloud] - AWS Gen & Agentic AI (with. AWS Cloud 특강) (0) | 2026.01.04 |
| [Cloud] - CI/CD란? (with. AWS Cloud 특강) (0) | 2026.01.04 |
| [Cloud] - SECloudIT란? (1) | 2026.01.04 |
| [Cloud] - Cloud Native Application란? (0) | 2025.12.27 |