💡 2024 공개SW 개발자대회 메가존 클라우드의 기업 지정 과제를 수행하며 정리한 내용입니다.
SpaceONE에서 DevOps toolchain 연동 개발 및 관리 기능을 구현했고, CI/CD 파이프라인의 정보들을 수집하는 것에 중점을 두었습니다.
사전 지식
- GitHub Actions: GitHub에서 소프트웨어 워크플로우를 자동화하는 CI/CD 서비스
- Jenkins: 오픈 소스 자동화 서버로, 애플리케이션의 빌드, 테스트, 배포를 자동화
- ArgoCD: Kubernetes에 GitOps 방식으로 애플리케이션을 배포하고 모니터링하는 도구
- Helm: Kubernetes 패키지 관리자로, 애플리케이션 배포를 간편하게 해주는 도구
- Helm Chart: Kubernetes 애플리케이션 템플릿으로 구성된 패키지
- Docker: 애플리케이션을 컨테이너로 패키징해 일관된 환경을 제공
- Docker Hub: Docker 이미지의 공개 저장소
- Minikube: 로컬에서 Kubernetes 클러스터를 생성해 테스트와 개발에 사용된다.
- Kubernetes: 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 플랫폼
- CI/CD: 지속적 통합과 지속적 배포/전달을 통해 소프트웨어 개발 프로세스를 자동화하는 관행
- SpaceONE과 Cloudforet는 멀티 클라우드 환경에서 클라우드 자원과 비용을 통합 관리할 수 있는 오픈소스 플랫폼이다. AWS, Azure, Google Cloud 등 다양한 클라우드 서비스 제공자를 지원하며, 클라우드 네이티브 기술을 기반으로 설계되었다.
이외에도 Cloudforet의 개략적인 아키텍처, Cloudforet Plugin 개발 방법, Cloudforet Plugin 등록 방법을 알아야 한다. 추가로 SpaceONE 설치가 필요하다.
사전 작업
SpaceONE을 설치하고, 팀원들과 동일한 환경에서 개발하기 위해 GCP VM instance 서비스를 사용했다.
2코어(가상 CPU 4개), 메모리 16GB, 한달 비용은 138달러
다행히 GCP 최초 가입자는 40만 크레딧을 지원해준다.
두 개의 구글 계정 크레딧이 날라갔고, 이것으로 나름 막대한(?) 서버 비용을 해결했다.
처음엔 이것보다 한 단계 낮은 스펙의 인스턴스를 사용했다.
하지만, 사양이 부족한 탓인지 세 명이 들어가서 사용하니 가끔씩 서버가 죽었다.
그래서 e2-standard-4를 선택하게 된 것이고, 아주 원활하고 쾌적하게 개발을 진행할 수 있었다.
SpaceONE이 쿠버네티스 환경에서 동작하기 때문에 로컬에서 테스트와 개발을 진행하기 위한 minikube가 필요했고, 그러한 minikube를 간편하게 사용하기 위해 먼저 도커를 설치한다.
Docker 설치
sudo apt-get update
sudo apt install docker.io
Docker 설치 후, Docker 명령어를 사용할 때마다 sudo
를 입력하지 않도록 사용자 그룹에 추가해준다.
sudo usermod -aG docker $USER
newgrp docker
Minikube 설치
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin/
Kubectl 설치
Kubernetes 클러스터와 상호 작용하기 위한 커맨드라인 툴인 kubectl
을 설치한다.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
Helm 설치
Kubernetes용 패키지 관리자 Helm을 설치한다.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Minikube 시작
Docker를 사용하여 12GB 메모리로 Minikube 클러스터를 초기화한다.
minikube start --driver=docker --memory=12000mb
6GB, 8GB로 설정하고 실행해봤는데,
CPU 사용률이 급증하고 메모리 부족으로 인해 스왑이 발생하면서 전체적인 클러스터 성능이 떨어졌다.
여러 번 종료하고 실행시키는 것조차 피로도가 쌓였기 때문에 12GB로 메모리를 잡아주게 되었고,
대회가 마무리 될 때 까지 원활하게 동작했다.
테스트하는 애플리케이션이 복잡하거나 Kubernetes에서 많은 서비스가 동시에 실행될 경우
안정적인 클러스터 운영을 위해 충분한 메모리 할당이 필요하다는 것을 배웠다.
물론 적절한 메모리를 할당하는 것이 가장 중요하다. (비용과의 Trade-off)
SpaceONE 설치
SpaceONE 설치는 가이드나 공식문서대로 진행했다.
환경 설정
1. Namespace 생성
kubectl create ns cloudforet
kubectl create ns cloudforet-plugin
- cloudforet과 cloudforet 플러그인 개발을 위해 namespace를 생성한다.
- 네임스페이스는 클러스터 내 리소스를 그룹화하여 격리하고 관리하기 위한 논리적 단위이다.
2. Role 및 RoleBinding 적용
mkdir cloudforet-deployment && cd $_
wget https://raw.githubusercontent.com/cloudforet-io/charts/master/examples/rbac.yaml -O rbac.yaml
kubectl apply -f rbac.yaml -n cloudforet-plugin
- RBAC (Role Based Access Control)는 개별 사용자의 역할에 따라 액세스를 제한하는 방식이다.
- rbac.yaml 파일에 정의된 권한 설정을 cloudforet-plugin 네임스페이스에 적용한다.
- 이 설정은 Kubernetes 클러스터 내에서 리소스에 대한 접근 권한을 관리하는 데 사용한다.
https://github.com/cloudforet-io/charts/blob/master/examples/rbac.yaml
charts/examples/rbac.yaml at master · cloudforet-io/charts
Cloudforet Helm Charts Repository. Contribute to cloudforet-io/charts development by creating an account on GitHub.
github.com
Helm Chart 설치
1. 헬름 차트를 설치하기 위해 yaml 파일을 다운 받고, helm chart를 다운 받아서 압축 해제 후 helm을 설치한다.
wget https://raw.githubusercontent.com/cloudforet-io/charts/master/examples/values/release-1-12.yaml -O release-1-12.yaml
wget https://github.com/cloudforet-io/charts/releases/download/spaceone-1.12.12/spaceone-1.12.12.tgz
tar zxvf spaceone-1.12.12.tgz
helm install cloudforet spaceone -n cloudforet -f release-1-12.yaml
release-1-12.yaml
...
console:
enable: true
image:
name: cloudforet/console
version: 1.12.12
production_json:
CONSOLE_API:
ENDPOINT: http://${ServerUrl}:8081
CONSOLE_API_V2:
ENDPOINT: http://${ServerUrl}:8082
DOMAIN_IMAGE:
CI_LOGO: https://raw.githubusercontent.com/cloudforet-io/artwork/main/logo/symbol/Cloudforet_symbol--dark-navy.svg
CI_TEXT_WITH_TYPE: https://raw.githubusercontent.com/cloudforet-io/artwork/main/logo/wordmark/Cloudforet_wordmark--primary.svg
SIGN_IN: https://raw.githubusercontent.com/cloudforet-io/artwork/main/illustrations/happy-new-year-2024.png
CI_TEXT: https://raw.githubusercontent.com/cloudforet-io/artwork/main/logo/wordmark/Cloudforet_wordmark--primary.svg
...
global:
namespace: cloudforet
supervisor_namespace: cloudforet
shared_conf:
TOKEN: "CHANGE_ME"
release-1-12.yaml 에서 TOKEN
값과 ServerUrl를 바꿔줘야 한다.
그렇지 않으면 설치를 해도 domain access denied 에러나 404 Error Page만 주구장창 보게된다.
2. helm 설치가 끝났다면 Pod를 확인한다.
kubectl get pod -n cloudforet
NAME READY STATUS RESTARTS AGE
board-6785c9fb6d-rxcch 1/1 Running 0 14m
config-5956655ccc-rnz9n 1/1 Running 0 14m
console-7d4595758b-md8f6 1/1 Running 0 14m
console-api-56f4496f7d-tvgq7 2/2 Running 0 14m
console-api-v2-rest-644b847b57-cqjm7 2/2 Running 0 14m
cost-analysis-659ff5d88f-ckds7 1/1 Running 0 14m
cost-analysis-scheduler-8474c56c95-57qpj 1/1 Running 0 14m
cost-analysis-worker-7bc667f5b4-qwjn9 1/1 Running 0 14m
dashboard-759ccd74b7-dh4rf 1/1 Running 0 14m
file-manager-85dbb6c46b-sz5g6 1/1 Running 0 14m
identity-644b45c8df-6dzwx 1/1 Running 0 14m
inventory-6bd9df778b-kwfl4 1/1 Running 0 14m
inventory-scheduler-5455f95c99-vkrrm 0/1 CrashLoopBackOff 7 (2m57s ago) 14m
inventory-worker-67d7599f5b-9m52m 1/1 Running 0 14m
mongodb-7fd58fcf75-lkhp6 1/1 Running 0 14m
monitoring-7b94cc8db8-zg2km 1/1 Running 0 14m
monitoring-rest-86d785f565-z6ztm 2/2 Running 0 14m
notification-6f96487ddb-rcm6h 1/1 Running 0 14m
notification-scheduler-77789bb9fd-gpjvx 1/1 Running 0 14m
notification-worker-f567c5c77-2kwfp 1/1 Running 0 14m
plugin-598865d6dc-s5mb9 1/1 Running 0 14m
plugin-scheduler-c9bdbd94f-94lwl 0/1 CrashLoopBackOff 7 (2m55s ago) 14m
plugin-worker-584d7b6b59-q6cn6 1/1 Running 0 14m
redis-646677656f-gc5sg 1/1 Running 0 14m
repository-54dc68fb4f-rmjgb 1/1 Running 0 14m
secret-5d7c9b86bf-nk4js 1/1 Running 0 14m
spacectl-54b4d5d5cb-p5k7d 1/1 Running 0 14m
statistics-5fd4bcb4cc-6z5jh 1/1 Running 0 14m
statistics-scheduler-687fd4ccb-blxqx 0/1 CrashLoopBackOff 7 (3m22s ago) 14m
statistics-worker-7d97f6cf4d-k9l4p 1/1 Running 0 14m
supervisor-scheduler-7b5cd9c9f9-zszj7 2/2 Running 0 14m
- CrashLoopBackOff 상태의 scheduler pod의 경우 spaceone-initializer 설치 후 Running 상태가 된다.
- 저 세 개의 scheduler pod를 제외하고 나머지 pod가 Running이 되기까지 기다리자.
spaceone-initializer 설치
1. spaceone 초기화를 위해 initializer.yaml 파일을 다운 받아서 helm install 해준다.
wget https://raw.githubusercontent.com/cloudforet-io/charts/master/examples/initializer.yaml -O initializer.yaml
wget https://github.com/cloudforet-io/charts/releases/download/spaceone-initializer-1.3.3/spaceone-initializer-1.3.3.tgz
tar zxvf spaceone-initializer-1.3.3.tgz
helm install initializer spaceone-initializer -n cloudforet -f initializer.yaml
initializer.yaml
global:
namespace: cloudforet
main:
import:
- /root/spacectl/apply/root_domain.yaml
- /root/spacectl/apply/create_managed_repository.yaml
- /root/spacectl/apply/user_domain.yaml
- /root/spacectl/apply/create_role.yaml
- /root/spacectl/apply/add_statistics_schedule.yaml
- /root/spacectl/apply/print_api_key.yaml
var:
domain:
root: root
user: spaceone
default_language: en
default_timezone: UTC
domain_owner:
id: admin
password: Admin123!@# # Change your password
user:
id: system_api_key
나중에 cloudforet 로그인 창에서 domain_owner에 대한 id, password로 로그인해주면 된다.
2. Token 값 변경
helm 설치가 끝났다면 또 한번 Pod의 status를 확인한다.
initializer pod의 상태가 completed임을 확인했다면, kubectl logs 명령어를 통해 시스템 토큰 값을 가져온다.
kubectl logs initialize-spaceone-qsrku-lnwjk -n cloudforet
이런식으로 API key 값이 나오는데 이전에 다운 받았던 release-1-12.yaml
파일의 TOKEN 값을 대체한다.
3. 헬름 차트 업그레이드를 통해 변경사항을 반영한다.
helm upgrade cloudforet spaceone -n cloudforet -f release-1-12.yaml
4. label
이 app.kubernetes.io/instance
이고 값이 cloudforet
인 Pod를 cloudforet 네임스페이스에서 삭제한다.
kubectl delete po -n cloudforet -l app.kubernetes.io/instance=cloudforet
Pod 확인
initialize-spaceone
Pod를 제외한 모든 Pod가 Running
상태로 변경되었다면 초기 설정이 끝났다.
포트 포워딩
kubectl port-forward svc/console -n cloudforet 8080:80 --address=0.0.0.0 &
kubectl port-forward svc/console-api -n cloudforet 8081:80 --address=0.0.0.0 &
kubectl port-forward svc/console-api-v2-rest -n cloudforet 8082:80 --address=0.0.0.0 &
안해주면 마찬가지로 Error Page를 마주하게 된다.
Cloudforet 로그인 및 User 생성, API key 발급
1. http://${ServerUrl}:8080/ 에 접속해서 관리자 계정(initializer.yaml 참고)으로 로그인을 한 후, 새로운 사용자를 추가한다.
2. 계정이나 프로필 설정을 변경한다.
3. API & CLI 설정에서 API key 생성
후 spacectl_config.yml
을 다운로드 받는다.
아직 끝난게 아니다
spaceone-core와 spaceone-api 패키지가 필요하다.
또한 파이썬 언어로 작성되었으므로 필요한 도구들을 설치한다. Python은 3.11 이상의 버전이 필요하다.
SpaceONE에서 관리하는 리소스에 대한 명령을 실행할 수있는 커맨드라인 도구(CLI)를 설치한다.
sudo apt-get install python3-pip
sudo pip3 install spaceone-core spaceone-api --upgrade
sudo pip3 install spacectl --upgrade
Config 초기화
개발한 플러그인에 대해서 로컬 테스트를 진행하기 위해 spacectl config를 초기화하는 작업이 필요하다.
spacectl config init -f spacectl_config.yml
Environment [default]: local
또한 gRPC 통신을 위해 해당 엔드포인트로 통신하기 위한 설정을 해준다.
spacectl config endpoint add plugin grpc://localhost:50051
로그인 후 Cloudforet을 탐험해보면 된다.
REF
https://docs.spaceone.megazone.io/ko/developers/setup/installing_spaceone/
SpaceONE 설치
docs.spaceone.megazone.io
'project > 2024 공개SW 개발자대회' 카테고리의 다른 글
2024 공개SW 개발자대회 복기3 - 프로젝트 마무리 (0) | 2024.11.15 |
---|---|
2024 공개SW 개발자대회 복기2 - 플러그인 개발기 (0) | 2024.11.14 |
2024 공개SW 개발자대회 1차 합격 복기 (0) | 2024.09.10 |