์ค์ Kubernetes ํด๋ฌ์คํฐ์ ๋คํธ์ํฌ ์ ์ฑ ์ ์๊ฐํํ๋ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
Kubernetes ํด๋ฌ์คํฐ์ Pod, Deployment, NetworkPolicy๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ์ฌ ์ง๊ด์ ์ธ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค. ๋ณต์กํ ๋คํธ์ํฌ ๊ตฌ์ฑ์ ์ฝ๊ฒ ์ดํดํ๊ณ ๋คํธ์ํฌ ์ ์ฑ ์ ์ํฅ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ํด๋ฌ์คํฐ ์ฐ๋:
kubectl
์ ํตํ ์ค์ ํด๋ฌ์คํฐ ๋ฐ์ดํฐ ์์ง - Pod & Deployment ์๊ฐํ: ๋ ๊ฐ์ง ๋ฆฌ์์ค ํ์ ๊ฐ ์ ํ ๊ฐ๋ฅ
- ๋คํธ์ํฌ ์ ์ฑ ๋งคํ: NetworkPolicy์ ๋ฆฌ์์ค ๊ฐ์ ๊ด๊ณ ์๊ฐํ
- ํต์ ์๋ฎฌ๋ ์ด์ : ์ค์ ๋คํธ์ํฌ ์ ์ฑ ๊ธฐ๋ฐ ํต์ ๊ฐ๋ฅ์ฑ ๊ฒ์ฆ
- ํ๋์ ์ธ UI: Material Design ๊ธฐ๋ฐ์ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: WebSocket์ ํตํ ์ค์๊ฐ ์ํ ๋ฐ์
- ์์ธ ์ ๋ณด ํจ๋: ํด๋ฆญ์ผ๋ก ๋ฆฌ์์ค/์ ์ฑ ์์ธ ์ ๋ณด ํ์ธ
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ ๋๋ฐ์ด์ค์์ ์๋ฒฝํ ์ฌ์ฉ ๊ฒฝํ
- ์ค๋งํธ ์บ์ฑ: ํด๋ฌ์คํฐ ๋ฐ์ดํฐ ์บ์ฑ์ผ๋ก ๋น ๋ฅธ ์๋ต (1-2์ด)
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ์ดํฐ ์์ง
- ํจ์จ์ ์ธ ๋ ๋๋ง: Cytoscape.js ๊ธฐ๋ฐ ๊ณ ์ฑ๋ฅ ๊ทธ๋ํ ๋ ๋๋ง
- ๐ข Pod ๋ ธ๋ (์ํ)
- ๐ท NetworkPolicy ๋ ธ๋ (๋ค์ด์๋ชฌ๋)
- ์ค์๊ฐ ํด๋ฌ์คํฐ ๋ฐ์ดํฐ (30+ Pod, 4๊ฐ ์ ์ฑ )
- ๐ฃ Deployment ๋ ธ๋ (์ก๊ฐํ)
- ๐ท NetworkPolicy ๋ ธ๋ (๋ค์ด์๋ชฌ๋)
- ๋ ผ๋ฆฌ์ ๊ทธ๋ฃนํ์ผ๋ก ๊ฐ์ํ๋ ๋ทฐ
- Python 3.11+
- kubectl ์ค์น ๋ฐ ํด๋ฌ์คํฐ ์ ๊ทผ ๊ถํ ์ค์
- ํ์ฑํ๋ Kubernetes ํด๋ฌ์คํฐ (๋ก์ปฌ ๋๋ ์๊ฒฉ)
# ์ ์ฅ์ ํด๋ก
git clone https://github.com/your-username/k8s-network-policy-visualizer.git
cd k8s-network-policy-visualizer
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
# kubectl ์ฐ๊ฒฐ ํ์ธ
kubectl cluster-info
# ์ ํ๋ฆฌ์ผ์ด์
์คํ
python app.py
# ์ด๋ฏธ์ง ๋น๋
docker build -t k8s-netpol-visualizer .
# ์ปจํ
์ด๋ ์คํ (kubeconfig ๋ง์ดํธ ํ์)
docker run -d \
--name netpol-visualizer \
-p 5000:5000 \
-v ~/.kube:/home/appuser/.kube:ro \
k8s-netpol-visualizer
# .env ํ์ผ ์์ฑ
export SECRET_KEY="your-secret-key"
export FLASK_ENV="development"
export KUBECTL_TIMEOUT=30
export LOG_LEVEL="INFO"
- ์น ๋ธ๋ผ์ฐ์ ์์
http://localhost:5000
์ ์ - ๋ฆฌ์์ค ํ์ ์ ํ (Pod โ Deployment ์ ํ)
- ๊ทธ๋ํ์์ ๋ ธ๋ ํด๋ฆญํ์ฌ ์์ธ ์ ๋ณด ํ์ธ
- ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ก ํด๋ฌ์คํฐ ๋ณ๊ฒฝ์ฌํญ ์๋ ๋ฐ์
- ํต์ ์๋ฎฌ๋ ์ด์ : ์์ค/๋์ ์ ํ ํ ํต์ ๊ฐ๋ฅ์ฑ ๊ฒ์ฆ
- ์ ์ฑ ๋ถ์: NetworkPolicy ํด๋ฆญ์ผ๋ก ์ ์ฉ ๋ฒ์ ํ์ธ
- ํฌ์ค ์ฒดํฌ:
/api/health
๋ก ํด๋ฌ์คํฐ ์ฐ๊ฒฐ ์ํ ํ์ธ
์๋ํฌ์ธํธ | ๋ฉ์๋ | ์ค๋ช | ์๋ต ์๊ฐ |
---|---|---|---|
/ |
GET | ๋ฉ์ธ ์น ์ธํฐํ์ด์ค | - |
/api/health |
GET | ํด๋ฌ์คํฐ ์ฐ๊ฒฐ ์ํ ํ์ธ | ~100ms |
/api/data?resource_type=pod |
GET | Pod ๊ทธ๋ํ ๋ฐ์ดํฐ | ~1.5s |
/api/data?resource_type=deployment |
GET | Deployment ๊ทธ๋ํ ๋ฐ์ดํฐ | ~0.8s |
/api/policy/<namespace>/<name> |
GET | NetworkPolicy ์์ธ ์ ๋ณด | ~200ms |
/api/resource/<type>/<namespace>/<name> |
GET | ๋ฆฌ์์ค ์์ธ ์ ๋ณด | ~200ms |
/api/simulate |
POST | ๋คํธ์ํฌ ํต์ ์๋ฎฌ๋ ์ด์ | ~300ms |
- ํด๋ฌ์คํฐ ๊ท๋ชจ: 57๊ฐ Pod, 30๊ฐ Deployment, 4๊ฐ NetworkPolicy
- ์๋ต ์๊ฐ: Pod ๋ทฐ 1.79s, Deployment ๋ทฐ 0.76s
- ๊ทธ๋ํ ํฌ๊ธฐ: Pod ๋ทฐ 61 nodes/30 edges, Deployment ๋ทฐ 34 nodes/10 edges
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Frontend โ โ Flask Backend โ โ Kubernetes โ
โ (Cytoscape.js)โโโโโบโ (Socket.IO) โโโโโบโ Cluster โ
โ + Material UI โ โ + ์ค์๊ฐ ์บ์ฑ โ โ (kubectl) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
Backend
- Flask 3.0 + Socket.IO (์ค์๊ฐ ํต์ )
- Pydantic (๋ฐ์ดํฐ ๊ฒ์ฆ)
- Structlog (๊ตฌ์กฐํ๋ ๋ก๊น )
- Subprocess + kubectl (ํด๋ฌ์คํฐ ์ฐ๋)
Frontend
- Cytoscape.js (๊ทธ๋ํ ์๊ฐํ)
- Material Icons + Modern CSS
- WebSocket (์ค์๊ฐ ์ ๋ฐ์ดํธ)
Infrastructure
- Docker ์ง์
- Kubernetes ๋ค์ดํฐ๋ธ
k8s-network-policy-visualizer/
โโโ src/
โ โโโ models/ # Pydantic ๋ฐ์ดํฐ ๋ชจ๋ธ
โ โ โโโ __init__.py
โ โ โโโ graph.py # ๊ทธ๋ํ ๋ฐ์ดํฐ ๋ชจ๋ธ
โ โ โโโ kubernetes.py # K8s ๋ฆฌ์์ค ๋ชจ๋ธ
โ โ โโโ network.py # ๋คํธ์ํฌ ์ ์ฑ
๋ชจ๋ธ
โ โโโ services/ # ๋น์ฆ๋์ค ๋ก์ง
โ โโโ __init__.py
โ โโโ kubernetes_service.py # ํด๋ฌ์คํฐ ์ฐ๋
โ โโโ graph_service.py # ๊ทธ๋ํ ์์ฑ
โโโ templates/
โ โโโ index.html # ๋ฉ์ธ ์น ์ธํฐํ์ด์ค
โโโ static/
โ โโโ styles.css # ์คํ์ผ์ํธ
โ โโโ scripts.js # ํ๋ก ํธ์๋ ๋ก์ง
โโโ tests/ # ํ
์คํธ ์ฝ๋
โโโ samples/ # ์ํ ๋ฐ์ดํฐ
โโโ app.py # ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
โโโ config.py # ์ค์ ๊ด๋ฆฌ
โโโ requirements.txt # Python ์์กด์ฑ
โโโ Dockerfile # Docker ์ด๋ฏธ์ง
โโโ .gitignore # Git ์ ์ธ ํ์ผ
# ๊ฐ๋ฐ ๋ชจ๋ ์คํ
export FLASK_ENV=development
python app.py
# ๋ก๊ทธ ํ์ธ
tail -f server.log
# ํ
์คํธ ์คํ (๊ตฌํ ์์ )
pytest tests/
- ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ: ํด๋ฌ์คํฐ ๋ฐ์ดํฐ ์บ์ฑ์ผ๋ก ๋ฐ๋ณต ์์ฒญ ์ต์ ํ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: kubectl ๋ช ๋ น์ด ๋น๋๊ธฐ ์คํ
- ๋ฐ์ดํฐ ์์ถ: JSON ์๋ต ์ต์ ํ
- ์ค๋งํธ ๋ ๋๋ง: ๋ ธ๋ ํ์ ๋ณ ์ฐจ๋ณํ๋ ๋ ๋๋ง
- ์ด๊ธฐ ๋ก๋ฉ: 1-2์ด (ํด๋ฌ์คํฐ ํฌ๊ธฐ์ ๋ฐ๋ผ)
- ๋ฆฌ์์ค ํ์ ์ ํ: 0.5-1์ด
- ์์ธ ์ ๋ณด ์กฐํ: 200-300ms
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: WebSocket ๊ธฐ๋ฐ ์ฆ์ ๋ฐ์
1. kubectl ์ฐ๊ฒฐ ์ค๋ฅ
# ํด๋ฌ์คํฐ ์ฐ๊ฒฐ ํ์ธ
kubectl cluster-info
kubectl get nodes
# kubeconfig ๊ฒฝ๋ก ํ์ธ
echo $KUBECONFIG
2. ํฌํธ ์ถฉ๋ (5000๋ฒ ํฌํธ)
# macOS AirPlay ์์ ๊ธฐ ๋นํ์ฑํ
# ์์คํ
ํ๊ฒฝ์ค์ > ์ผ๋ฐ > AirDrop ๋ฐ Handoff
# ๋๋ ๋ค๋ฅธ ํฌํธ ์ฌ์ฉ
export PORT=8080
python app.py
3. ๊ถํ ์ค๋ฅ
# ํด๋ฌ์คํฐ ๊ถํ ํ์ธ
kubectl auth can-i get pods --all-namespaces
kubectl auth can-i get networkpolicies --all-namespaces
- Fork ํ๋ก์ ํธ
- Feature ๋ธ๋์น ์์ฑ:
git checkout -b feature/AmazingFeature
- ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ:
git commit -m 'Add some AmazingFeature'
- ๋ธ๋์น์ Push:
git push origin feature/AmazingFeature
- Pull Request ์์ฑ
- ์ฝ๋ ์คํ์ผ: Black ํฌ๋งทํฐ ์ฌ์ฉ
- ํ์ ํํธ: ๋ชจ๋ ํจ์์ ํ์ ํํธ ์ถ๊ฐ
- ๋ก๊น : Structlog๋ฅผ ์ฌ์ฉํ ๊ตฌ์กฐํ๋ ๋ก๊น
- ํ ์คํธ: ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ ์ฝ๋ ์์ฑ
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Cytoscape.js - ๊ฐ๋ ฅํ ๊ทธ๋ํ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Flask - ์ ์ฐํ ์น ํ๋ ์์ํฌ
- Kubernetes - ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ํ๋ซํผ
โญ ์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์๋ค๋ฉด ๋ณํ๋ฅผ ๋๋ฌ์ฃผ์ธ์!