Azure Kubernetes Service(AKS), 컨ν μ΄λ κΈ°μ , CI/CD μλνλ₯Ό μ€μ΅ν μ μλ νΈμ¦μ¨ λ© κ°μ΄λμ λλ€. Jupyter Notebook κΈ°λ°μΌλ‘ λ¨κ³λ³ μ€μ΅μ μ 곡ν©λλ€.
- νμ΅ λͺ©ν
- λΉ λ₯Έ μμ
- μ¬μ μꡬμ¬ν
- μ€μ΅ λ΄μ©
- νλ‘μ νΈ κ΅¬μ‘°
- νκ²½ λ³μ λ° κ³΅ν΅ μ€μ
- μ€μ΅ μμ
- κ° λ ΈνΈλΆλ³ μ£Όμμ¬ν
- λ¬Έμ ν΄κ²°
- μ°Έκ³ μλ£
- κΈ°μ¬ λ° νΌλλ°±
- λΌμ΄μ μ€
μ΄ μ€μ΅μ μλ£νλ©΄ λ€μμ ν μ μκ² λ©λλ€:
- β 컨ν μ΄λμ κ°μλ¨Έμ μ μ°¨μ΄μ μ΄ν΄
- β Dockerfile μμ± λ° λ©ν° μ€ν μ΄μ§ λΉλ ꡬν
- β 컨ν μ΄λ μ΄λ―Έμ§ λΉλ λ° μ€ν
- β Azure Container Registry νμ©
- β AKS ν΄λ¬μ€ν° μμ± λ° κ΄λ¦¬
- β Kubernetes Deployment λ° Service μμ±
- β HPAλ₯Ό ν΅ν μλ νμ₯ ꡬμ±
- β Node Auto Provisioning νμ©
- β Prometheus/Grafanaλ‘ λͺ¨λν°λ§ ꡬμ±
- β GitHub Actions μν¬νλ‘μ° μμ±
- β Azure Pipelines ꡬμ±
- β GitOps κ°λ μ΄ν΄ λ° Argo CD νμ©
- β μλνλ λ°°ν¬ νμ΄νλΌμΈ ꡬμΆ
- μ λ²νΌμ ν΄λ¦νκ±°λ μ μ₯μμμ
Code>Create codespace on mainμ ν - λͺ¨λ λκ΅¬κ° μλμΌλ‘ μ€μΉλλ©°, λΈλΌμ°μ μμ λ°λ‘ μ€μ΅ κ°λ₯
- Python κ°μνκ²½, Azure CLI, Docker, kubectl μλ μ€μ
-
μ¬μ μ€λΉ
- Docker Desktop μ€μΉ
- VS Code μ€μΉ
- Dev Containers νμ₯ μ€μΉ
-
μ€ν λ°©λ²
git clone https://github.com/junwoojeong100/aks-mini-labs.git cd aks-mini-labs code .
- VS Codeμμ
Reopen in Containerμλ¦Ό ν΄λ¦ - λλ
Ctrl+Shift+PβDev Containers: Reopen in Containerμ€ν
- VS Codeμμ
-
μλ μ€μ
- Python κ°μνκ²½ μμ± (
.venv) - Jupyter 컀λ λ±λ‘
- Spring Boot νλ‘μ νΈ λΉλ
- λͺ¨λ λꡬ μ€μΉ (Java 21, Maven, Docker, kubectl, Azure CLI)
- Python κ°μνκ²½ μμ± (
-
Azure CLI λ‘κ·ΈμΈ
az login --use-device-code
-
λ ΈνΈλΆ μ€ν μμ
01-container-basics.ipynbβ 컨ν μ΄λ κΈ°μ΄ & ACR02-aks-hands-on.ipynbβ AKS ν΄λ¬μ€ν° μ΄μ03-cicd-automation.ipynbβ CI/CD μλν
π‘ Tip: Jupyter 컀λμ μλμΌλ‘
Python (.venv)λ‘ μ€μ λ©λλ€.
- Azure ꡬλ : λ¬΄λ£ κ³μ μμ± κ°λ₯
- GitHub κ³μ : Codespaces μ¬μ©μ μν΄ νμ
- Azure DevOps κ³μ : Azure Pipelines μ€μ΅ μ
- GitHub Personal Access Token: GitHub Actions μ€μ΅ μ
μ΄ μ€μ΅μμ μ¬μ©νλ μ£Όμ Azure 리μμ€:
- Azure Container Registry (Basic): μ½ $5/μ
- AKS ν΄λ¬μ€ν° (2 nodes, Standard_DS2_v2): μ½ $140/μ
- Managed Prometheus & Grafana: μ¬μ©λ κΈ°λ°
π‘ Tip: μ€μ΅ μλ£ ν 리μμ€λ₯Ό μμ νλ©΄ λΉμ©μ μ΅μνν μ μμ΅λλ€.
컨ν μ΄λ κΈ°μ΄λΆν° Azure Container RegistryκΉμ§
- 컨ν μ΄λ κ°λ λ° μν€ν μ²
- Spring Boot μ± μ»¨ν μ΄λν
- Dockerfile μμ± λ° μ΄λ―Έμ§ λΉλ
- ACRμ μ΄λ―Έμ§ νΈμ
AKS ν΄λ¬μ€ν° μμ± λ° μ΄μ
- AKS ν΄λ¬μ€ν° μμ± (μ½ 5-10λΆ μμ)
- 컨ν μ΄λ λ°°ν¬ λ° μλΉμ€ λ ΈμΆ
- HPA μ€ν μ€μΌμΌλ§ λ° NAP(Node Auto Provisioning)
- Prometheus/Grafana λͺ¨λν°λ§ μ€μ
CI/CD νμ΄νλΌμΈ ꡬμΆ
- GitHub Actions μν¬νλ‘μ° μμ± (μλ νμ±ν νμ)
- Azure Pipelines μ€μ
- Argo CDλ₯Ό ν΅ν GitOps λ°°ν¬
μ°Έκ³ : GitHub Actions μν¬νλ‘μ°λ
.disabledνμ₯μλ‘ μμ±λ©λλ€. μ¬μ©νλ €λ©΄ Secrets/Variables μ€μ ν νμ₯μλ₯Ό μ κ±°νμΈμ.
aks-mini-labs/
βββ .devcontainer/ # Dev Container μ€μ
β βββ devcontainer.json # 컨ν
μ΄λ ꡬμ±
β βββ setup.sh # μλ μ€μ μ€ν¬λ¦½νΈ
βββ 01-container-basics.ipynb # 컨ν
μ΄λ κΈ°μ΄ μ€μ΅
βββ 02-aks-hands-on.ipynb # AKS ν΄λ¬μ€ν° μ€μ΅
βββ 03-cicd-automation.ipynb # CI/CD μλν μ€μ΅
βββ config.py # κ³΅ν΅ νκ²½ λ³μ μ€μ
βββ requirements.txt # Python ν¨ν€μ§ μμ‘΄μ±
βββ deployment.yaml # Kubernetes λ°°ν¬ ν
νλ¦Ώ
βββ springboot-docker-demo/ # Spring Boot μν μ±
β βββ Dockerfile # λ©ν° μ€ν
μ΄μ§ λΉλ μ€μ
β βββ pom.xml # Maven μ€μ
β βββ src/ # μμ€ μ½λ
βββ .github/
β βββ workflows/ # GitHub Actions (3λ²μμ μμ±)
βββ azure-pipelines.yml # Azure Pipelines (3λ²μμ μμ±)
λͺ¨λ λ
ΈνΈλΆμμ 곡ν΅μΌλ‘ μ¬μ©νλ μ€μ κ°μ config.py νμΌμμ κ΄λ¦¬λ©λλ€.
μ£Όμ λ³μ:
| λ³μλͺ | μ€λͺ | κΈ°λ³Έκ° | μ¬μ© λ ΈνΈλΆ |
|---|---|---|---|
RESOURCE_GROUP |
Azure 리μμ€ κ·Έλ£Ή μ΄λ¦ | aks-mini-labs-rg |
01, 02, 03 |
LOCATION |
Azure 리μ | koreacentral |
01, 02, 03 |
ACR_NAME |
ACR μ΄λ¦ (01λ² μ€μ΅ ν μ λ°μ΄νΈ νμ) | None β νμμ€ν¬νλ‘ μλ μμ± |
01, 02, 03 |
AKS_CLUSTER_NAME |
AKS ν΄λ¬μ€ν° μ΄λ¦ | aks-mini-labs-cluster |
02, 03 |
APP_NAME |
μ ν리μΌμ΄μ μ΄λ¦ | myapp |
01, 02, 03 |
IMAGE_TAG |
μ΄λ―Έμ§ νκ·Έ | latest |
01, 02, 03 |
ν¬νΌ ν¨μ:
get_acr_login_server(acr_name): ACR λ‘κ·ΈμΈ μλ² μ£Όμ λ°ν (μ:myacr123.azurecr.io)get_full_image_name(acr_name, app_name, tag): μ 체 μ΄λ―Έμ§ μ΄λ¦ μμ±print_config(): νμ¬ μ€μ λ λͺ¨λ λ³μ μΆλ ₯
λ ΈνΈλΆμμ μ¬μ©:
# λͺ¨λ μ€μ λΆλ¬μ€κΈ°
from config import *
# μ€μ νμΈ
print_config()
# κ°λ³ λ³μ μ¬μ©
print(f"리μμ€ κ·Έλ£Ή: {RESOURCE_GROUP}")
β οΈ μ€μ:ACR_NAMEμ λ°μ΄νΈ λ°©λ²μ κ° λ ΈνΈλΆλ³ μ£Όμμ¬νμ μ°Έκ³ νμΈμ.
- ACR μ΄λ¦ μλ μμ±: ACR μ΄λ¦μ΄ νμμ€ν¬νλ‘ μλ μμ±λ©λλ€ (μ:
myacr1760169422) - ACR_NAME μλ μ
λ°μ΄νΈ νμ:
- λ ΈνΈλΆ μ€ν ν μμ±λ ACR μ΄λ¦μ νμΈ
config.pyνμΌμ μ΄μ΄ACR_NAMEκ°μ μ λ°μ΄νΈ# config.py νμΌ μμ μμ ACR_NAME = "myacr1760169422" # μμ±λ μ€μ μ΄λ¦μΌλ‘ λ³κ²½
- νμΌ μ μ₯ ν 02, 03λ² λ ΈνΈλΆμμ ν΄λΉ ACR μ¬μ© κ°λ₯
- AKS ν΄λ¬μ€ν° μμ± μκ°: μ½ 5-10λΆ μμ
- deployment.yaml μλ μμ±: Kubernetes λ°°ν¬ λ§€λνμ€νΈκ° μλμΌλ‘ μμ±λ©λλ€
- GitHub Actions μν¬νλ‘μ° νμ±ν:
- μν¬νλ‘μ° νμΌμ΄
.disabledνμ₯μλ‘ μμ±λ©λλ€ - νμ±ν μ μ°¨:
- GitHub Repository Settingsμμ Secrets μ€μ :
AZURE_CREDENTIALS - GitHub Repository Settingsμμ Variables μ€μ :
ACR_NAME .github/workflows/λλ ν 리μ μν¬νλ‘μ° νμΌμμ.disabledνμ₯μ μ κ±°
- GitHub Repository Settingsμμ Secrets μ€μ :
- μν¬νλ‘μ° νμΌμ΄
- Azure DevOps: Azure Pipelines μ¬μ© μ Service Connection μ€μ μ΄ νμν©λλ€
ACR λ‘κ·ΈμΈ μ€ν¨
- Azure CLI λ‘κ·ΈμΈ μΈμ μ΄ λ§λ£λμμ μ μμ
az loginλͺ λ ΉμΌλ‘ μ¬λ‘κ·ΈμΈ
μ΄λ―Έμ§ λΉλ μ€ν¨
- Docker λ°λͺ¬μ΄ μ€ν μ€μΈμ§ νμΈ:
docker ps - λμ€ν¬ κ³΅κ° νμΈ:
df -h
Pod Pending μν
kubectl describe pod <pod-name>μΌλ‘ μμΈ νμΈ- NAPκ° νμ±νλμ΄ μμΌλ©΄ μλμΌλ‘ λ Έλ μΆκ°
리μμ€ κ·Έλ£Ή λ³κ²½
config.pyμRESOURCE_GROUPλ³μ μμ - μ΄ν λͺ¨λ λ ΈνΈλΆμμ λμΌν μ΄λ¦ μ¬μ©
μ΄ νλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμλ€λ©΄:
- Fork ν μλ‘μ΄ λΈλμΉ μμ±
- λ³κ²½μ¬ν 컀λ°
- Pull Request μ μΆ
λ²κ·Έ 리ν¬νΈλ κΈ°λ₯ μ μμ Issuesλ₯Ό μ΄μ©ν΄μ£ΌμΈμ.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.
Made with β€οΈ for Azure & Kubernetes learners