Skip to content

next-gen-dist-sys/aklp-infra

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

AKLP Infrastructure

AI-powered Kubernetes Learning Platform의 인프라 μ„€μ • 및 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ λ ˆν¬μ§€ν† λ¦¬μž…λ‹ˆλ‹€.

Quick Start

μ‚¬μš©μžλ₯Ό μœ„ν•œ 전체 μ„€μ • κ°€μ΄λ“œμž…λ‹ˆλ‹€.

사전 μš”κ΅¬μ‚¬ν•­

# kubectl μ„€μΉ˜ 확인
kubectl version --client

# μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄
# macOS
brew install kubectl

# Linux
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/

1. k3s ν΄λŸ¬μŠ€ν„° ꡬ성

k3s ν΄λŸ¬μŠ€ν„°λŠ” μ‚¬μš©μžκ°€ 직접 ꡬ성해야 ν•©λ‹ˆλ‹€. ꡬ성 ν›„ λ…Έλ“œ μƒνƒœλ₯Ό ν™•μΈν•˜μ„Έμš”:

# λ§ˆμŠ€ν„° λ…Έλ“œμ—μ„œ μ‹€ν–‰
kubectl get nodes

# μ˜ˆμƒ 좜λ ₯
# NAME     STATUS   ROLES                  AGE   VERSION
# master   Ready    control-plane,master   1d    v1.28.x+k3s1

2. λ°±μ—”λ“œ μ„œλΉ„μŠ€ 배포 (λ§ˆμŠ€ν„° λ…Έλ“œ)

git clone https://github.com/next-gen-dist-sys/aklp-infra.git
cd aklp-infra
kubectl apply -k k8s/

# 배포 μƒνƒœ 확인
kubectl get pods -n aklp -w

aklp-agentλ₯Ό μ œμ™Έν•œ λͺ¨λ“  Podκ°€ Running μƒνƒœκ°€ 될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€.

Note: aklp-agentλŠ” CreateContainerConfigError μƒνƒœλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. μ΄λŠ” OPENAI_API_KEY Secret이 아직 μƒμ„±λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ©°, 정상적인 μƒνƒœμž…λ‹ˆλ‹€. CLI 초기 μ„€μ •(5단계) μ™„λ£Œ μ‹œ Secret이 μžλ™μœΌλ‘œ μƒμ„±λ˜κ³  Agentκ°€ μž¬μ‹œμž‘λ©λ‹ˆλ‹€.

3. λ§ˆμŠ€ν„° λ…Έλ“œ IP 확인

ip addr show
# λ˜λŠ”
hostname -I

4. CLI ν™˜κ²½ μ„€μ • (둜컬 PC)

CLIλ₯Ό μ‚¬μš©ν•  ν™˜κ²½(둜컬 PC λ“±)μ—μ„œ λ‹€μŒμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:

# λ§ˆμŠ€ν„° λ…Έλ“œμ—μ„œ kubeconfig 볡사
scp user@MASTER_IP:/etc/rancher/k3s/k3s.yaml ~/.kube/config

# server μ£Όμ†Œλ₯Ό λ§ˆμŠ€ν„° λ…Έλ“œ IP둜 λ³€κ²½
# Linux
sed -i 's/127.0.0.1/MASTER_IP/g' ~/.kube/config
# macOS
sed -i '' 's/127.0.0.1/MASTER_IP/g' ~/.kube/config

# KUBECONFIG ν™˜κ²½λ³€μˆ˜ μ„€μ • (.bashrc λ˜λŠ” .zshrc에 μΆ”κ°€)
echo 'export KUBECONFIG=~/.kube/config' >> ~/.zshrc  # λ˜λŠ” ~/.bashrc

# ν™˜κ²½λ³€μˆ˜ μ¦‰μ‹œ 적용
source ~/.zshrc  # λ˜λŠ” source ~/.bashrc

# μ—°κ²° 확인
kubectl get nodes

μ˜ˆμ‹œ (μœ μ € 이름이 konkuk, λ§ˆμŠ€ν„° IPκ°€ 192.168.118.128인 경우):

scp [email protected]:/etc/rancher/k3s/k3s.yaml ~/.kube/config
sed -i 's/127.0.0.1/192.168.118.128/g' ~/.kube/config  # Linux

5. CLI μ„€μΉ˜ 및 μ‹€ν–‰

# μ„€μΉ˜ 슀크립트 μ‹€ν–‰ (Linux, macOS, Windows 지원)
curl -sSL https://raw.githubusercontent.com/next-gen-dist-sys/aklp-cli/main/install.sh | sh

# μ„€μΉ˜ μ‹€νŒ¨ μ‹œ 직접 λ‹€μš΄λ‘œλ“œ
# https://github.com/next-gen-dist-sys/aklp-cli/releases

# CLI μ‹€ν–‰
aklp

첫 μ‹€ν–‰ μ‹œ ν΄λŸ¬μŠ€ν„° μ£Όμ†Œμ™€ OpenAI API Keyλ₯Ό μž…λ ₯ν•˜λŠ” μ„€μ • λ§ˆλ²•μ‚¬κ°€ μ‹œμž‘λ©λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„° ν—¬μŠ€μ²΄ν¬μ™€ kubernetes secret 등둝에 성곡해야 μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6. μ‚¬μš© μ˜ˆμ‹œ

❯ λͺ¨λ“  λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ νŒŒλ“œ λ³΄μ—¬μ€˜
❯ default λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— nginx λ°°ν¬ν•΄μ€˜
❯ μ„œλΉ„μŠ€ λͺ©λ‘ μ‘°νšŒν•΄μ€˜

CLI 상세 μ‚¬μš©λ²•: aklp-cli README


전체 μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           User (CLI)                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     aklp-agent (NodePort: 30001)                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ β€’ ν•™μŠ΅ κ°€μ΄λ“œ 제곡                                                    β”‚ β”‚
β”‚  β”‚ β€’ YAML 파일 생성/κ²€ν†                                                  β”‚ β”‚
β”‚  β”‚ β€’ kubectl λͺ…λ Ή μ‹€ν–‰ 및 κ²°κ³Ό 뢄석                                       β”‚ β”‚
β”‚  β”‚ β€’ ν•™μŠ΅ 자료 및 λ…ΈνŠΈ μžλ™ 생성                                          β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                     β”‚                     β”‚
         β–Ό                     β–Ό                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   aklp-note     β”‚   β”‚   aklp-task     β”‚   β”‚   aklp-file     β”‚
β”‚(NodePort: 30002)β”‚   β”‚(NodePort: 30003)β”‚   β”‚(NodePort: 30004)β”‚
β”‚                 β”‚   β”‚                 β”‚   β”‚                 β”‚
β”‚ β€’ ν•™μŠ΅ λ…ΈνŠΈ      β”‚   β”‚ β€’ ν•™μŠ΅ 과제      β”‚   β”‚ β€’ YAML 파일      β”‚
β”‚ β€’ μ„Έμ…˜ μš”μ•½      β”‚   β”‚ β€’ Batch 관리    β”‚   β”‚ β€’ μ—…λ‘œλ“œ & λ‹€μš΄λ‘œλ“œβ”‚
β”‚ β€’ λͺ…λ Ήμ–΄ 기둝    β”‚   β”‚ β€’ μ§„ν–‰ μƒνƒœ      β”‚   β”‚ β€’ λ¬Έμ„œ 관리      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                     β”‚                     β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
                               β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   aklp-postgres     β”‚
                    β”‚    (포트 5432)       β”‚
                    β”‚                     β”‚
                    β”‚ β€’ aklp_note DB      β”‚
                    β”‚ β€’ aklp_task DB      β”‚
                    β”‚ β€’ aklp_file DB      β”‚
                    β”‚ β€’ aklp_agent DB     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

개발 ν™˜κ²½ (Docker Compose)

Note: Docker ComposeλŠ” κ°„λ‹¨ν•œ μ„œλΉ„μŠ€ 개발/ν…ŒμŠ€νŠΈ μš©λ„λ‘œλ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€. kubectl λͺ…λ Ήμ–΄ μ‹€ν–‰ κΈ°λŠ₯은 k3s ν΄λŸ¬μŠ€ν„° ν™˜κ²½μ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.

1. λͺ¨λ“  μ„œλΉ„μŠ€ λ ˆν¬μ§€ν† λ¦¬ 클둠

# μž‘μ—… 디렉토리 생성
mkdir aklp && cd aklp

# 인프라 λ ˆν¬μ§€ν† λ¦¬
git clone https://github.com/next-gen-dist-sys/aklp-infra.git

# μ„œλΉ„μŠ€ λ ˆν¬μ§€ν† λ¦¬λ“€ (같은 λ ˆλ²¨μ— 클둠)
git clone https://github.com/next-gen-dist-sys/aklp-postgres.git
git clone https://github.com/next-gen-dist-sys/aklp-note.git
git clone https://github.com/next-gen-dist-sys/aklp-task.git
git clone https://github.com/next-gen-dist-sys/aklp-file.git
git clone https://github.com/next-gen-dist-sys/aklp-agent.git

2. 디렉토리 ꡬ쑰 확인

aklp/
β”œβ”€β”€ aklp-infra/          # 이 λ ˆν¬μ§€ν† λ¦¬ (Docker Compose, K8s λ§€λ‹ˆνŽ˜μŠ€νŠΈ)
β”œβ”€β”€ aklp-postgres/       # PostgreSQL μ„œλΉ„μŠ€
β”œβ”€β”€ aklp-note/           # Note μ„œλΉ„μŠ€ (ν•™μŠ΅ λ…ΈνŠΈ 관리)
β”œβ”€β”€ aklp-task/           # Task μ„œλΉ„μŠ€ (ν•  일 관리)
β”œβ”€β”€ aklp-file/           # File μ„œλΉ„μŠ€ (파일 관리)
└── aklp-agent/          # Agent μ„œλΉ„μŠ€ (AI μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜)

3. μ„œλΉ„μŠ€ μ‹€ν–‰

cd aklp-infra
docker compose up

λ˜λŠ” λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰:

docker compose up -d

μ„œλΉ„μŠ€ ꡬ성

μ„œλΉ„μŠ€ 포트 λ°μ΄ν„°λ² μ΄μŠ€ μš©λ„
aklp-postgres 5432 - λͺ¨λ“  μ„œλΉ„μŠ€μ˜ 곡용 λ°μ΄ν„°λ² μ΄μŠ€
aklp-agent 8001 aklp_agent AI μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜
aklp-note 8002 aklp_note ν•™μŠ΅ λ…ΈνŠΈ, μ„Έμ…˜ μš”μ•½
aklp-task 8003 aklp_task ν•™μŠ΅ 과제 및 Batch 관리
aklp-file 8004 aklp_file 파일 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ

API λ¬Έμ„œ


Agent/CLI 톡합 κ°€μ΄λ“œ

session_id 관리

λͺ¨λ“  Backend μ„œλΉ„μŠ€λŠ” session_id둜 데이터λ₯Ό κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€. AgentλŠ” μ„Έμ…˜ μ‹œμž‘ μ‹œ UUIDλ₯Ό μƒμ„±ν•˜κ³  λͺ¨λ“  API ν˜ΈμΆœμ— λ™μΌν•œ 값을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

import uuid
SESSION_ID = str(uuid.uuid4())  # μ„Έμ…˜λ‹Ή ν•œ 번만 생성

ν•™μŠ΅ 흐름 μ˜ˆμ‹œ

1. μ„Έμ…˜ μ‹œμž‘
   └── Agent: session_id 생성

2. ν•™μŠ΅ 주제 선택 (예: "Kubernetes Pod 기초")
   └── Agent: POST /api/v1/batches (ν•™μŠ΅ 과제 생성)

3. ν•™μŠ΅ 자료 제곡
   └── Agent: POST /api/v1/files (YAML 파일 μ—…λ‘œλ“œ)
   └── Agent: POST /api/v1/notes (κ°œλ… μ„€λͺ… λ…ΈνŠΈ 생성)

4. μ‹€μŠ΅ μ§„ν–‰
   └── User: 파일 λ‹€μš΄λ‘œλ“œ β†’ kubectl apply
   └── Agent: λͺ…λ Ήμ–΄ 기둝 β†’ POST /api/v1/notes

5. 과제 μ™„λ£Œ
   └── Agent: PUT /api/v1/tasks/{id} (status: completed)

6. μ„Έμ…˜ μ’…λ£Œ
   └── Agent: POST /api/v1/notes (ν•™μŠ΅ μš”μ•½ 생성)

μ„œλΉ„μŠ€λ³„ μ‚¬μš© νŒ¨ν„΄

Task Service (aklp-task)

상황 API λ©”μ„œλ“œ
μƒˆ 주제 ν•™μŠ΅ μ‹œμž‘ /api/v1/batches POST
μΆ”κ°€ 과제 생성 /api/v1/tasks POST
과제 μ™„λ£Œ 처리 /api/v1/tasks/{id} PUT
μ§„ν–‰ 상황 확인 /api/v1/batches/latest GET
μ—¬λŸ¬ 과제 μ™„λ£Œ /api/v1/tasks/bulk PUT

Note Service (aklp-note)

상황 API λ©”μ„œλ“œ
ν•™μŠ΅ λ‚΄μš© 기둝 /api/v1/notes POST
λͺ…λ Ήμ–΄ 기둝 μ €μž₯ /api/v1/notes POST
μ„Έμ…˜ μš”μ•½ 생성 /api/v1/notes POST
λ…ΈνŠΈ μ—…λ°μ΄νŠΈ /api/v1/notes/{id} PUT
μ„Έμ…˜ λ…ΈνŠΈ 쑰회 /api/v1/notes?session_id=... GET

File Service (aklp-file)

상황 API λ©”μ„œλ“œ
YAML 파일 생성 /api/v1/files POST
kubectl 좜λ ₯ μ €μž₯ /api/v1/files POST
파일 λ‹€μš΄λ‘œλ“œ /api/v1/files/{id}/download GET
파일 ꡐ체 /api/v1/files/{id} PUT
μ„Έμ…˜ 파일 λͺ©λ‘ /api/v1/files?session_id=... GET

곡톡 응닡 ν˜•μ‹

λͺ©λ‘ 쑰회 응닡

{
  "items": [...],
  "total": 25,
  "page": 1,
  "limit": 10,
  "total_pages": 3,
  "has_next": true,
  "has_prev": false
}

μ—λŸ¬ 응닡

{
  "detail": "Resource not found"
}

개발 κ°€μ΄λ“œ

ν™˜κ²½ λ³€μˆ˜ μ„€μ •

각 μ„œλΉ„μŠ€μ˜ .env νŒŒμΌμ„ ν™•μΈν•˜κ³  ν•„μš”μ— 따라 μˆ˜μ •ν•˜μ„Έμš”:

# 각 μ„œλΉ„μŠ€ λ””λ ‰ν† λ¦¬μ—μ„œ
cp .env.example .env

κ°œλ³„ μ„œλΉ„μŠ€ μž¬μ‹œμž‘

docker compose restart aklp-note
docker compose restart aklp-task
docker compose restart aklp-file

둜그 확인

# 전체 둜그
docker compose logs -f

# νŠΉμ • μ„œλΉ„μŠ€ 둜그
docker compose logs -f aklp-task

λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™”

# λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆμ™€ λ³Όλ₯¨ μ‚­μ œ
docker compose down -v

# λ‹€μ‹œ μ‹œμž‘
docker compose up

Health Check

# λͺ¨λ“  μ„œλΉ„μŠ€ μƒνƒœ 확인
curl http://localhost:8001/health  # agent
curl http://localhost:8002/health  # note
curl http://localhost:8003/health  # task
curl http://localhost:8004/health  # file

Kubernetes 배포

k3s ν΄λŸ¬μŠ€ν„°μ— λ°°ν¬ν•˜λ €λ©΄ k8s/README.md λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

# 전체 배포
kubectl apply -k k8s/

# μƒνƒœ 확인
kubectl get all -n aklp

기술 μŠ€νƒ

ν•­λͺ© 기술
μ»¨ν…Œμ΄λ„ˆ Docker & Docker Compose
λ°μ΄ν„°λ² μ΄μŠ€ PostgreSQL 17
λ°±μ—”λ“œ μ–Έμ–΄ Python 3.12
μ›Ή ν”„λ ˆμž„μ›Œν¬ FastAPI
ORM SQLAlchemy 2.0 (async)
νŒ¨ν‚€μ§€ 관리 uv

κ΄€λ ¨ λ ˆν¬μ§€ν† λ¦¬

λ ˆν¬μ§€ν† λ¦¬ μ„€λͺ… λ‹΄λ‹Ή
aklp-postgres PostgreSQL μ„œλΉ„μŠ€ λ‚˜ν˜•μ§„
aklp-note Note μ„œλΉ„μŠ€ λ‚˜ν˜•μ§„
aklp-task Task μ„œλΉ„μŠ€ λ‚˜ν˜•μ§„
aklp-file File μ„œλΉ„μŠ€ λ‚˜ν˜•μ§„
aklp-agent Agent μ„œλΉ„μŠ€ κΉ€μˆ˜λ―Ό
aklp-cli CLI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 박범식

λΌμ΄μ„ μŠ€

MIT

About

Infrastructure and orchestration for AKLP microservices (Docker Compose, K8s manifests)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •