ํฐ์คํ ๋ฆฌ ๋ทฐ
์นดํ
๊ณ ๋ฆฌ ์์
[mlops] fastapi(modelํ์ฌ) + kubenetes + helm + gitlablib-upload +argocd + nginxingress + GCP BigQuery
0hyeon์ 2025. 4. 4. 23:21๋ฐ์ํ
๐ฆ MLOps - ๊ตฌ์ถ ํ๋ฆ ์์ฝ
๐ง 1. Build & Deploy ํ์ดํ๋ผ์ธ
1.1 Docker ์ด๋ฏธ์ง ๋น๋ & Artifact Registry ์ ๋ก๋
- mlops-app Docker ์ด๋ฏธ์ง ์์ฑ (FastAPI + Model)
- ํ๋ซํผ๋ณ ๋น๋
# ์ผ๋ฐ
docker build -t mlops-app .
# M1 ๋งฅ๋ถ
docker build --platform linux/amd64 -t mlops-app .
- ๋ก์ปฌ ์คํ ํ ์คํธ
docker run -it -p 80:80 mlops-app
- GCP Artifact Registry ์ ๋ก๋
# ๋ก๊ทธ์ธ
cat key.json | docker login -u _json_key --password-stdin asia-northeast3-docker.pkg.dev
# ํ๊น
ํ ์
๋ก๋
docker tag mlops-app asia-northeast3-docker.pkg.dev/<PROJECT>/docker/mlops-app
docker push asia-northeast3-docker.pkg.dev/<PROJECT>/docker/mlops-app
โ๏ธ 2. Helm ํจํค์ง
2.1 Helm ์ฐจํธ ๊ตฌ์ฑ ๋ฐ ๋ฐฐํฌ ์ค์
- Helm ์ค์น ๋ฐ ์ฐจํธ ์์ฑ
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh && ./get_helm.sh
helm create mlops-helm
- values.yaml ๋ฐ Chart.yaml ์์
- ์ด๋ฏธ์ง ๊ฒฝ๋ก ๋ณ๊ฒฝ
- pullPolicy: Always
- type: LoadBalancer
- ๋ฒ์ ์ ๋ณด ์ค์
- ํฌ๋ฆ ํจํค์ง ๋ฐ Artifact Registry ํธ
helm package .
helm registry login ...
helm push mlops-helm-0.0.1.tgz oci://asia-northeast3-docker.pkg.dev/<PROJECT>/helm
โธ๏ธ 3. Kubernetes ๋ฐฐํฌ
3.1 Helm์ผ๋ก ๋ฐฐํฌ
kubectl create namespace api
helm install nlp-service oci://... --namespace api
kubectl get all -n api
๐ 4. GitLab CI/CD ์ฐ๋
4.1 .gitlab-ci.yml
- build, deploy ์คํ ์ด์ง ์์ฑ
- ํ๊ฒฝ๋ณ์ ๋ฑ๋ก
$GCP_KEY
$ARGOCD_IP
$ARGOCD_ID
$ARGOCD_PW
๐งญ 5. ArgoCD ์ค์
5.1 ์ค์น ๋ฐ ์ด๊ธฐํ
kubectl create namespace argocd
kubectl apply -n argocd -f https://.../install.yaml
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type":"LoadBalancer"}}'
- ArgoCD ์ ์ ํ ๋ก๊ทธ์ธ
- helm repo ๋ฑ๋ก
argocd repo add ... --type helm --enable-oci ...
5.2 Application ์์ฑ
- mlops-helm Chart ์ ํ
- mlops-app ์์ฑ ๋ฐ Sync ์คํ
- ๋ฒ์ ์ ๋ฐ์ดํธ ์ .gitlab-ci.yml ์์
๐ 6. nginx Ingress ์ค์ (stcps.com)
6.1 Ingress Controller ๋ฐฐํฌ
- Helm Chart๋ก nginx-ingress ์ค์น
- External IP → GCP ๊ณ ์ IP๋ก ์ค์
- DNS ์ฐ๋ (A record ๋ฑ๋ก)
6.2 Helm ์ฐจํธ ์์
- ingress.enabled: true
- className: nginx
- hosts: [stcps.com]
- Chart.yaml ๋ฒ์ ์ ๋ฐ์ดํธ → ๋ค์ ํจํค์ง & push
๐ 7. API ์ธ์ฆ ํ ํฐ ์ค์
- ingress.yaml & values.yaml → auth_request ์ค๋ํซ ์ถ๊ฐ
annotations:
nginx.org/location-snippets: |
location /auth {
...
if ($http_x_auth_token ~ ^(user1token|user2token)$) {
return 200;
}
return 403;
}
auth_request /auth;
- FastAPI /predict API์์ Header ์ธ์ฆ ์ฒ๋ฆฌ
@app.post("/predict")
async def predict(input: Input, x_auth_token: str = Header(None)):
...
๐ 8. GCP Logging → BigQuery ์ฐ๋
8.1 FastAPI ๋ก๊ทธ → GCP Logging → BigQuery
- ๋ก๊ทธ๋ฅผ jsonPayload ํํ๋ก ์ ์ก
from google.cloud.logging import Client Client().setup_logging() logging.info({...})
8.2 Logging Sink ๊ตฌ์ฑ
- Sink ๋์: BigQuery dataset predict_logs
- ํํฐ: namespace, path ๊ธฐ์ค์ผ๋ก ์ง์
resource.labels.namespace_name="api" jsonPayload.path="/predict"
8.3 BigQuery ๋ถ์ ์์
SELECT
jsonPayload.request_time,
EXTRACT(DATE FROM TIMESTAMP(jsonPayload.request_time)) AS request_date,
COUNT(*) AS request_cnt
FROM `predict_logs.stderr_YYYYMMDD`
WHERE jsonPayload.x_auth_token="user2token"
GROUP BY 1,2
โ ์ต์ข ๊ฒฐ๊ณผ
- GitLab → CI/CD ์๋ํ
- ArgoCD → Kubernetes GitOps ๋ฐฐํฌ
- Helm → ํจํค์ง ๊ด๋ฆฌ
- Nginx Ingress → ๋๋ฉ์ธ ๋ผ์ฐํ + ์ธ์ฆ
- GCP Logging → BigQuery → API ์ฌ์ฉ๋ ์๊ฐํ๊น์ง ์์ฑ
๋ฐ์ํ
๋ฐ์ํ
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- un-supervised
- ADT
- ํ์ ์คํฌ๋ฆฝํธ
- create_task
- nodejs
- Tailwind
- asyncio.gather
- pscale
- asyncio
- ํจ์ํํ๋ก๊ทธ๋๋ฐ
- next.js
- ์๋์ฐpscale์ค์น
- SSR
- semi-supervised
- Python
- kubectl
- helm
- ๋์์๋ฃ๊ตฌ์กฐ
- 42์์ธ
- nextj์ด๋ฏธ์ง์ ์ฅ
- ์์ฆ์ ์๋ํฐ
- window
- supervised
- planetscale๋ฐฐํฌ
- iris
- ๋น๋๊ธฐ
- CloudFlare
- k8s
- ์ฐํ ์ฝ
- datalabeling
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
๊ธ ๋ณด๊ดํจ