Cloud

[Cloud] - NHN Cloud와 K-PaaS 구축하기

yongyongcoding 2026. 1. 4. 23:33

 

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 → 네트워킹

NHN 아키텍처(https://docs.nhncloud.com/ko/Security/Network-Firewall/ko/overview/)

 

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

AWS 아키텍처

네트워크 기초 (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 설치하기

(https://github.com/K-PaaS/container-platform/blob/branch/1.6.x/install-guide/nfs-server-install-guide.md)

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 : 실제 사진 추가하기

 

 

현재까지 진행한 내용을 정리하면

  1. 인스턴스 생성 = VPC, Subnet, IGW연결, SG 설정, 인스턴스 생성
  2. SSH로 Cluster1에 접속
  3. Network Interface 추가
  4. NFS 서버 설정
  5. 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를 활용한 보안 통신 체계를 직접 구성하며 인프라의 유기적인 연결 원리를 깊이 있게 이해할 수 있었습니다. 결국 클라우드 운영의 핵심은 '설치' 그 자체가 아니라, 각 자원들이 어떤 목적과 경로로 연결되는지에 대한 설계 역량에 있음을 깨달을 수 있었다.