2023년 전기 졸업과제 37조 클라우드 기반 원격 DaaS
- 본 과제는 코로나 19 이후 원격 교육과 재택 근무 필요성이 급증한 현대 사회에서 교육 분야의 비대면 교육 혁신을 위해 클라우드 기반의 원격 데스크탑 서비스(DaaS, Desktop-as-a-Service)와 여러 학습 관리 기능을 결합한 교육 플랫폼(LMS, Learning Management System) 을 구축한다. 이를 통해 비대면 교육뿐만 아니라 학습 환경의 품질을 향상시키고 효과적인 학습 관리 서비스를 제공하고자 한다.
- 언제 어디서든 접근 가능한 원격 데스크탑 환경을 제공한다.
- 클라우드 기반 원격 데스크탑 서비스를 웹 서비스의 형태로 제공하여 별도의 애플리케이션 설치나 복잡한 설정 없이 간편하게 사용할 수 있다.
- Kubernetes를 사용하여 autoscaling을 제공해 트래픽 증가, 장애 상황에 대응하여 안정적이고 중단 없는 서비스를 제공한다.
- 서버의 부하를 분산시키기 위해 가상 환경 이미지 관리 서버, 가상 환경 접속 서버, 웹 서버를 분리하여 마이크로서비스 아키텍처(MSA, MicroService Architecture)를 실현한다.
- 교육 플랫폼을 제공하여 교육자가 강좌를 효과적으로 관리하고 학생들이 학습 자료와 정보에 쉽게 접근할 수 있다.
- 학생은 교육자의 학습 환경과 동일한 환경을 구성하기 위해 압축 파일, 설명서를 통해 직접 환경 설정할 필요 없이 편리하게 교육자와 동일한 학습 환경을 구성할 수 있다.
- 타 사용자의 가상 환경에서 함께 작업할 수 있다.
- harbor와 s3를 사용한 private docker registry를 구축하여 사용자들의 가상 환경인 docker image를 안전하게 관리한다.
- kubernetes로 구축한 서버를 프로메테우스(Prometheus)와 그라파나(Grafana)를 활용하여 모니터링한다. 또한, private docker registry에 사용된 s3를 AWS CloudWatch로 모니터링한다.
분야 | 사용 기술 및 도구 |
---|---|
Programming Languages | - Java 17 - Python 3.8.10 |
Framework | - Spring Boot 3.1.2 - Flask 3.0.0 |
Template Engine | - Thymeleaf 3.1.2 |
Build Tool | - Gradle 8.2.1 |
Cloud | - Docker 24.0.6 - Kubernetes 1.25.8 - Amazon Web Services(AWS) - Naver CloudPlatform |
DataBase | - MariaDB 10.0 |
Registry | - Harbor 2.8.2 - AWS S3 |
Monitoring | - Prometheus 2.20.1 - Grafana 8.5.27 - AWS CloudWatch |
Version Control | - Git 2.34.1 |
이름 | Github/Email | 역할 |
---|---|---|
박소현 | • https://github.com/sososo0 • [email protected] |
• 전체 구성 설계 및 구축 • 클라우드(AWS, Naver Cloud) 환경 구축 및 멀티 클라우드 적용 • Private Docker Registry 설계 및 구축 • Web Desktop Manager 설계 및 구축 • Pod 관련 기능 설계 및 구현 • Kubernetes & Web Desktop Image Manger 설계 및 구축 • 가상환경 API 구현(Flask) • 서비스 배포 |
김기해 | • https://github.com/xcelxlorx • [email protected] |
• UI 설계 • 강좌, 게시판, 관리자, 사용자 API 구현(SpringBoot) • 모니터링 구현 • 강좌, 게시판, 관리자, 사용자 페이지 구현 |
김수현 | • https://github.com/suuding • [email protected] |
• 기능 정의서 작성 및 DB 설계 • 로그인, 회원가입, 가상환경 API 구현(SpringBoot) • Container Image 생성 및 관리(Flask) • 웹 서버와 가상환경 서버 API 통신 구현 • 로그인, 회원가입, 가상환경 페이지 구현 |
- 멀티 클라우드
- 해당 서비스는 멀티 클라우드 아키텍처로 구성되어 있으며, 클라우드 서비스 공급자는 AWS와 Naver CloudPlatform이다.
- AWS
- Web Server에서 웹 애플리케이션 호스팅 및 웹 사이트를 제공하기 위해 AWS의 EC2를 사용한다.
- AWS의 S3를 사용하여 Private Docker Registry를 구축했다.
- AWS CloudWatch를 사용하여 S3 리소스를 모니터링한다.
- Naver CloudPlatform
- Kubernetes 관리 및 Web Desktop Image를 관리하는 역할을 수행한다.
- k8s 기반으로 구축된 Web Desktop Manager에서 가상 환경을 관리하고 사용자들의 리소스 사용량에 따라 k8s 환경을 scaling한다.
- k8s 리소스 사용량을 보기 위해 모니터링한다.
- 가상환경 관리 서버는 웹 서버의 요청에 따라 가상환경 생성, 실행, 접속, 삭제를 수행하고 사용자의 docker image를 안전하게 저장한다.
- Kubernetes & Web Desktop Image Manager(Flask Server)
- 사용자 요청을 바탕으로 k8s에 명령을 내리고 docker image를 관리한다.
- Web Desktop Manager(Kubernetes Server)
- 클라우드 환경에서 가상환경(kasm container)을 관리한다.
- Private Docker Registry(Harbor)
- docker image를 저장하는 private 저장소이다.
- AWS의 EC2 인스턴스를 활용하여 웹 애플리케이션 호스팅과 웹 사이트를 제공한다.
- 오픈 소스 컨테이너 레지스트리 Harbor와 AWS 클라우드 스토리지 서비스 S3를 결합하여 구축한다. Harbor는 Ec2 인스턴스 위에서 Multi Container 형태로 실행된다.
- 트래픽 분산과 서비스 무중단을 위해 Auto Scaling Group으로 구성하고 Load Balancer를 연동한다.
- Harbor와 S3를 연동하여 데이터 복제 및 백업을 지원한다.
- 사용자는 CLI와 Web UI로 접근할 수 있다.
- 관리자는 Web Server, 사용자의 Web Desktop, Kubernetes & Web Desktop Image Manager, private docker registry에 접근할 수 있다.
- Grafana를 통해 k8s를 모니터링한다.
- AWS CloudWatch를 통해 s3를 모니터링한다.
- [Web Service 접속 URL] : https://www.p2kcloud.com
- [Private Docker Registry 접속 URL] : https://registry.p2kcloud.com
이름 | 내용 |
---|---|
메인 페이지 | |
자신의 가상환경 목록 화면 | |
가상환경 접속 화면 | |
강좌 게시판 화면 | |
교육자의 가상환경 화면 | |
관리자의 모니터링 화면 |
| Use PNU-P2K for Deploy
Copy example yml file to set env
cp docker-compose.yml.example docker-compose.yml
cp application-aws.yml.example application-aws.yml
cp application-mariaDB.yml.example application-mariaDB.yml
cp application-server.yml.example application-server.yml
- docker-compose.yml
version: '3'
services:
db:
image: mariadb:10
container_name: mariadb
ports:
- 3307:3306
environment:
MARIADB_DATABASE: 'p2k'
MARIADB_ROOT_PASSWORD: # password
MARIADB_ROOT_HOST: '%'
TZ: Asia/Seoul
volumes:
- ./mariadb/conf.d:/etc/mysql/conf.d
- ./mariadb/data:/var/lib/mysql
- ./mariadb/initdb.d:/docker-entrypoint-initdb.d
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--bind-address=0.0.0.0']
application:
container_name: springboot
build: .
ports:
- 80:8080
depends_on:
- db
- application-aws.yml
cloudwatch:
credentials:
access-key: # access-key
secret-key: # secret-key
s3:
bucket-name: "p2k"
- application-mariaDB.yml
spring:
datasource:
url: jdbc:mariadb://mariadb:3306/p2k?useSSL=false&createDatabaseIfNotExist=true
driver-class-name: org.mariadb.jdbc.Driver
username: root
password: # password
jpa:
database-platform: org.hibernate.dialect.MariaDBDialect
defer-datasource-initialization: true
hibernate:
ddl-auto: update
show-sql: true
generate-ddl: true
- application-server.yml
server:
port: 443
ssl:
key-store: classpath:ssl/keystore.p12
key-store-type: PKCS12
key-store-password: #password
- Install Docker in SpringBoot & Flask Application
# Install Docker
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Check Docker Install
sudo systemctl status docker
- SpringBoot Application
# Repository git clone
git clone https://github.com/PNU-P2K/webpage.git
# Install JDK 17
sudo apt update
sudo apt install openjdk-17-jdk
# Install docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# Check docker-compose install with version
docker-compose --version
# Run SpringBoot Application
cd webpage
chmod +x gradlew
./gradlew clean build
docker-compose up -d --build
- Flask Application
# Repository git clone
git clone https://github.com/PNU-P2K/vm-server.git
# Install pip
sudo apt update
sudo apt install python3-pip
# Install Flask
pip install flask
# Install pycrypto
pip install pycrypto
# Download Base Docker Image
docker pull registry.p2kcloud.com/base/1/kasmweb:v1
# Run Flask Application
python3 app_v8.py