CloudForet 활용 (최소 사양)

흑두루미·2026년 6월 8일

CloudForet 란

CloudForet는 한마디로 말하면 오픈소스 멀티클라우드 관리 플랫폼(CMP, Cloud Management Platform)

예전에는 SpaceONE이라는 이름으로 시작되었고, 현재는 CloudForet라는 이름으로 발전했으며, Linux Foundation 프로젝트로 운영됨
AWS, Azure, GCP, OpenStack, Kubernetes 등 여러 클라우드 환경을 하나의 화면에서 통합 관리할 수 있도록 해줌

전체 구성

현재 서버는 아래와 같이 구성

  • 1core / 2Memory / 100GB / Rocky 8.10 / 1대
    최소 구동 확인용으로 시작

다만, 1C / 2GB는 공식 최소 사양보다 낮기 때문에 “CloudForet 콘솔 접속 + 리소스 몇 개 조회 테스트” 목적
공식 개발용 권장은 2Core / 8GB / 30GB Disk, 최소 설치 예제도 3GB 메모리 이상을 전제로 함

Rocky 8.10 VM
 ├─ Swap 4GB
 ├─ k3s
 ├─ kubectl
 ├─ helm
 └─ CloudForet
     ├─ console
     ├─ inventory
     ├─ identity
     ├─ mongodb
     └─ redis

사전 설정

Swap 4GB 추가 / k3s 설치 / helm 설치 / CloudForet Helm Repo 추가 / Namespace 생성 / RBAC 적용

1) 최소 설치용 values 파일 준비
1C/2GB에서는 기본 설치하면 Pod가 너무 많이 떠서 거의 버거움
CloudForet 최소 설치 예제에서는 cost-analysis, notification 등을 끄고 scheduler/worker를 줄이는 방식을 사용

wget https://raw.githubusercontent.com/cloudforet-io/charts/master/examples/values/minimum.yaml -O minimum.yaml
cp minimum.yaml minimum-1c2g.yaml
vi minimum-1c2g.yaml
global:
  shared_conf:
    LOG_LEVEL: INFO

cost-analysis:
  enabled: false

notification:
  enabled: false

marketplace-assets:
  enabled: false

plugin:
  enabled: true
  scheduler: false
  worker: false

inventory:
  enabled: true
  scheduler: false
  worker: false

monitoring:
  enabled: false

statistics:
  enabled: false

2) CloudForet 설치

helm install cloudforet cloudforet/spaceone \
  -n spaceone \
  -f minimum-1c2g.yaml
kubectl get pods -n spaceone -w

3) 초기화 작업

wget https://raw.githubusercontent.com/cloudforet-io/charts/master/examples/initializer.yaml -O initializer.yaml

helm install cloudforet-initializer cloudforet/spaceone-initializer \
  -n spaceone \
  -f initializer.yaml
kubectl get pods -n spaceone | grep initialize
kubectl logs -n spaceone $(kubectl get pod -n spaceone | grep initialize | awk '{print $1}')

로그 끝 부분 확인 시 'FINISH SPACEONE INITIALIZE' 문구 확인

콘솔 접속

폐쇄망 환경으로 SSH Port Forwarding 진행

  • VM 서버
nohup kubectl port-forward -n spaceone svc/console 8080:80 >/tmp/console.log 2>&1 &
nohup kubectl port-forward -n spaceone svc/console-api 8081:80 >/tmp/console-api.log 2>&1 &
nohup kubectl port-forward -n spaceone svc/console-api-v2-rest 8082:80 >/tmp/console-api-v2.log 2>&1 &
  • 접속 PC 터미널
ssh -i pemkey -L 8080:127.0.0.1:8080 -L 8081:127.0.0.1:8081  -L 8082:127.0.0.1:8082 vmuser@VMIP
  • 콘솔 접속
    도메인 : root
    초기 ID : admin
    초기 PW : Admin123!@#

최소 사양으로 구성하여 서비스 접속 및 로그인에 초점을 둠

구성 확장

minimum.yaml 수정
플러그인 및 인벤토리 worker 활성화 > helm update -f

plugin:
  enabled: true
  scheduler: false
  worker: true
  
inventory:
  enabled: true
  scheduler: false
  worker: true

1) 유저 추가
root 도메인으로 admin 접속
[IAM] +add 통한 유저 추가
초기 ID : 설정
초기 PW : 설정

2) 신규 유저 계정으로 접속
도메인 변경 (root 도메인X)

3) 현재 상황
✅ Root Domain 생성
✅ User Domain(spaceone) 생성
✅ Managed Repository 생성
✅ Domain Admin User 생성
✅ Role / Policy 생성
✅ Console ↔ Repository 연동 성공
✅ Dashboard 메뉴 활성화
✅ Asset Inventory 메뉴 활성화
✅ Cost Explorer 메뉴 활성화
✅ Alert Manager 메뉴 활성화

4) Service Account 생성

5) Collector 생성

6) Collector Data 확인
AWS에서 신규 생성한 볼륨을 SpaceOne에서 확인 완료 (연동)

Trouble Shooting

1) Github 다운로드 실패

curl -sfL https://get.k3s.io | sh - 
[INFO] Finding release for channel stable 
[INFO] Using v1.35.5+k3s1 as release 
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.35.5%2Bk3s1/sha256sum-amd64.txt [ERROR] Download failed

확인 사항

# 1. DNS 확인
nslookup github.com

# 2. GitHub HTTPS 접근 확인
curl -Iv https://github.com

# 3. 실제 실패한 파일 직접 확인
curl -IvL "https://github.com/k3s-io/k3s/releases/download/v1.35.5%2Bk3s1/sha256sum-amd64.txt"

# 4. 프록시 환경변수 확인
env | grep -i proxy

확인 결과
DNS 정상 / TCP 443 정상 / TLS 인증서 정상 / GitHub 응답은 오는데 HTTP/2 504 발생

아래 명령어를 통해 해결

curl -4 --http1.1 -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.32.6+k3s1 sh -

원인

GitHub 접속 자체는 가능
↓
HTTP/2 환경에서 GitHub Release 다운로드 실패 (504)
↓
k3s 최신버전(v1.35.5) 다운로드 실패
↓
구버전(v1.32.6) + HTTP/1.1 경로로 우회 성공

2) Github 다운로드 실패2

Error: INSTALLATION FAILED: failed to fetch https://github.com/cloudforet-io/charts/releases/download/spaceone-1.12.15/spaceone-1.12.15.tgz : 504 Gateway Timeout

로컬에서 수동으로 다운로드 → SCP를 통해 VM 업로드하여 해결

3) 404 에러

3-1) 증상

CloudForet Console 접속 시 로그인 화면이 아니라 아래 화면으로 이동함.

http://localhost:8080/error-page
404
Sorry, we can’t seem to find what you’re looking for.

처음에는 Console 정적 페이지는 뜨지만, 내부 API 호출 실패로 인해 /error-page로 이동하는 상태

3-2) 실제 원인

원인 1.

본체: cloudforet/*:2.0.dev*
initializer: cloudforet/spacectl:1.12.1

cloudforet/spacectl:1.12.1  ← 존재
cloudforet/spacectl:1.12.12 ← 없음
cloudforet/spacectl:1.12.13 ← 없음
cloudforet/spacectl:1.12.15 ← 없음
cloudforet/spacectl:latest  ← 없음

spaceone-1.12.15 chart를 사용했을 때는 본체 이미지가 2.0.dev 계열로 배포되어 spacectl:1.12.1과 API 버전이 맞지 않음

No module named 'spaceone.api.identity.v2'

그래서 본체 chart를 1.12.12로 낮춰서 spacectl:1.12.1과 호환되도록 맞췄음

원인 2.
Console API Endpoint가 예제값으로 남아 있었음
console-conf ConfigMap 안의 production.json이 아래처럼 되어 있었음

"CONSOLE_API": {
  "ENDPOINT": "https://console.api.example.com"
},
"CONSOLE_API_V2": {
  "ENDPOINT": "https://console-v2.api.example.com"
}

즉 브라우저가 실제 VM의 API가 아니라 존재하지 않는 예제 주소로 요청
그래서 Console 화면은 뜨지만 API 호출이 실패했고, 결과적으로 404 페이지로 이동

원인 3.
로컬 브라우저 기준 8081, 8082 터널링이 빠졌음

Console 설정을 아래처럼 변경

"CONSOLE_API": {
  "ENDPOINT": "http://localhost:8081"
},
"CONSOLE_API_V2": {
  "ENDPOINT": "http://localhost:8082"
}

그런데 브라우저에서 보는 localhost는 VM의 localhost가 아니라 내 PC의 localhost이므로 VM에서만 포트포워딩을 해서는 부족

구조는 아래와 같아야 함

내 PC 브라우저 localhost:8080
  → SSH 터널
  → VM localhost:8080
  → Kubernetes svc/console

내 PC 브라우저 localhost:8081
  → SSH 터널
  → VM localhost:8081
  → Kubernetes svc/console-api

내 PC 브라우저 localhost:8082
  → SSH 터널
  → VM localhost:8082
  → Kubernetes svc/console-api-v2-rest

8080만 SSH 터널링하면 Console 정적 화면은 뜨지만, API 호출은 실패

원인 4.
Initializer가 제대로 완료되지 않아 초기 데이터가 불완전했음
처음 initializer 실행 시 아래 오류가 발생했음

channel = identity:50051
Channel is not ready

원인은 identity 서비스가 완전히 준비되기 전에 initializer가 실행되었기 때문

또 한 번은 namespace가 맞지 않아 initializer가 다른 namespace에서 identity:50051을 찾으면서 실패

global:
  namespace: cloudforet

CloudForet 본체는 spaceone namespace에 있었기 때문에 아래처럼 수정

global:
  namespace: spaceone

3-3) 해결 과정

1단계. CloudForet 본체 버전 정리
기존 1.12.15 제거 후 1.12.12로 재설치

helm uninstall cloudforet-initializer -n spaceone
helm uninstall cloudforet -n spaceone
curl -4 --http1.1 -L -o spaceone-1.12.12.tgz \
https://github.com/cloudforet-io/charts/releases/download/spaceone-1.12.12/spaceone-1.12.12.tgz
helm install cloudforet ./spaceone-1.12.12.tgz \
  -n spaceone \
  -f minimum-1c2g.yaml

2단계. Initializer namespace 수정
initializer.yaml을 수정

global:
  namespace: spaceone

설치:
helm install cloudforet-initializer cloudforet/spaceone-initializer \
  -n spaceone \
  -f initializer.yaml

3단계. Console API endpoint 수정
console-conf의 production.json을 수정

kubectl patch cm console-conf -n spaceone --type merge -p \
'{"data":{"production.json":"{\"AMCHARTS_LICENSE\":{\"CHARTS\":\"\",\"MAPS\":\"\",\"TIMELINE\":\"\"},\"ASSET_PATH\":{},\"CONSOLE_API\":{\"ENDPOINT\":\"http://localhost:8081\"},\"CONSOLE_API_V2\":{\"ENDPOINT\":\"http://localhost:8082\"},\"DOMAIN_IMAGE\":{},\"DOMAIN_NAME\":\"spaceone\",\"DOMAIN_NAME_REF\":\"config\",\"GTAG_ID\":\"DISABLED\",\"GTM_ID\":\"DISABLED\",\"MOCK\":{\"ALL\":false,\"ENDPOINT\":\"\"}}"}}'

Console Pod 재시작:
kubectl delete pod -n spaceone -l app.kubernetes.io/name=console

확인:
kubectl exec -n spaceone deploy/console -- cat /var/www/config/production.json

4단계. VM 내부 Kubernetes 포트포워딩

VM에서 실행:

kubectl port-forward -n spaceone svc/console 8080:80
kubectl port-forward -n spaceone svc/console-api 8081:80
kubectl port-forward -n spaceone svc/console-api-v2-rest 8082:80

백그라운드 실행 버전:

nohup kubectl port-forward -n spaceone svc/console 8080:80 >/tmp/console.log 2>&1 &
nohup kubectl port-forward -n spaceone svc/console-api 8081:80 >/tmp/console-api.log 2>&1 &
nohup kubectl port-forward -n spaceone svc/console-api-v2-rest 8082:80 >/tmp/console-api-v2.log 2>&1 &

5단계. 로컬 PC에서 SSH 터널링

로컬 PC에서 실행:

ssh -i pms-test2.pem \
  -L 8080:127.0.0.1:8080 \
  -L 8081:127.0.0.1:8081 \
  -L 8082:127.0.0.1:8082 \
  vmuser@123.37.28.73

콘솔 접속 : http://localhost:8080/sign-in

3-4) 확인했던 주요 증거

Console 정적 파일은 정상
GET / 200
GET /assets/index...js 200
GET /config/production.json 200

즉 nginx나 console Pod 자체 문제는 아니었음

API endpoint가 example.com으로 되어 있었음
"CONSOLE_API":{"ENDPOINT":"https://console.api.example.com"}
/reflection 요청이 실패했음

브라우저 DevTools에서 확인:
Request URL: http://localhost:8081/api/reflection

Console API 로그:
Token is not set. (Headers.authorization: Bearer )

이 자체는 로그인 전이면 발생 가능하지만, 로그인 화면으로 정상 진입하지 못하는 상태에서는 API endpoint/초기화 문제 확인 포인트가 되었음

Initializer 실패 로그
ERROR_GRPC_CONNECTION
channel = identity:50051
Channel is not ready

그리고 버전 불일치 시:
No module named 'spaceone.api.identity.v2'

3-5) 최종 결론

이번 404 에러의 핵심 원인은 다음과 같다.

  1. Console 설정의 API endpoint가 example.com으로 남아 있었음
  2. 로컬 브라우저 기준 8081/8082 SSH 터널링이 빠져 있었음
  3. Initializer가 identity 준비 전 실행되거나 namespace/version 불일치로 초기화가 불완전했음

최종 해결은 다음 조합으로 완료함

CloudForet chart: 1.12.12
Initializer namespace: spaceone
Console API endpoint: localhost:8081 / localhost:8082
VM port-forward: 8080, 8081, 8082
Local SSH tunnel: 8080, 8081, 8082
Browser cache/site data 초기화 후 /sign-in 접속

Collector 생성 시 에러

Collector 신규 생성 시
Service Account 선택(oliver) 후
Additional Options Reload 발생

원인
AWS Collector 플러그인을 실행할 Supervisor가 등록되어 있지 않아 발생

→ TOKEN 오류
spaceone 서비스 계정에서 토큰 생성하여 conf 파일에 추가, 업데이트
→ RBAC 403 오류
1. supervisor가 바라보는 spaceone-plugin 네임스페이스 생성
2. spaceone-plugin 네임스페이스에 Role 생성
3. spaceone 네임스페이스의 default ServiceAccount를 그 Role에 RoleBinding

문제:
supervisor-scheduler는 플러그인을 만들려고 했지만
spaceone-plugin 네임스페이스 접근 권한이 없었음

해결:
spaceone:default ServiceAccount에
spaceone-plugin 네임스페이스 조작 권한을 RoleBinding으로 부여

결과:
AWS Collector 플러그인 Pod 4개 생성 성공

0개의 댓글