Skip to content
4 changes: 2 additions & 2 deletions .github/workflows/cd-production.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
run: kubectl apply -k k8s/model-api/overlays/production/

- name: 파드 재시작 # (이미지 태그가 계속 latest여도 새 이미지로 배포되도록)
run: kubectl rollout restart deployment/model-api
run: kubectl rollout restart deployment/model-api -n model-api # 네임스페이스 지정

- name: 배포 확인
run: kubectl rollout status deployment/model-api
run: kubectl rollout status deployment/model-api -n model-api # 네임스페이스 지정
14 changes: 14 additions & 0 deletions k8s/cert-manager/cluster-issuer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: cert-manager.io/v1
kind: ClusterIssuer # 인증서 발급, 클러스터 전체에서 사용 가능
metadata:
name: swmlops-issuer
spec:
acme: # acme 프로토콜이 Let’s Encrypt와 통신하기 위한 표준 프로토콜
server: https://acme-v02.api.letsencrypt.org/directory
email: simgpt02@gmail.com
privateKeySecretRef:
name: swmlops-issuer
solvers:
- http01:
ingress:
ingressClassName: traefik # k3s 에서 기본 제공해주는 ingress controller
1 change: 1 addition & 0 deletions k8s/mlflow-db/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: mlflow-db
namespace: mlflow
spec:
replicas: 1
selector:
Expand Down
1 change: 1 addition & 0 deletions k8s/mlflow-db/pvc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mlflow-db-pvc
namespace: mlflow
spec:
accessModes:
- ReadWriteOnce
Expand Down
1 change: 1 addition & 0 deletions k8s/mlflow-db/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: v1
kind: Service
metadata:
name: mlflow-db
namespace: mlflow
spec:
type: ClusterIP
selector:
Expand Down
3 changes: 2 additions & 1 deletion k8s/mlflow/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: mlflow
namespace: mlflow
spec:
replicas: 1
selector:
Expand Down Expand Up @@ -39,5 +40,5 @@ spec:
- --port=5000
- --default-artifact-root=s3://kube-ml-bucket/mlflow-artifacts # 모델 저장
- --backend-store-uri=postgresql://mlflow:1234@mlflow-db:5432/mlflow
- --allowed-hosts=mlflow,mlflow:5000,mlflow.default.svc.cluster.local,localhost,localhost:5000 # 실제 운영 환경에서는 실제 도메인을 입력하면 될 듯
- --allowed-hosts=mlflow.mlflow.svc.cluster.local,localhost,localhost:5000,mlflow.swmlops.site # 풀 DNS, localhost, 도메인 허용

24 changes: 24 additions & 0 deletions k8s/mlflow/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mlflow
namespace: mlflow
annotations:
cert-manager.io/cluster-issuer: swmlops-issuer # cert-manager에서 인증서를 발급받을 때 사용할 ClusterIssuer 지정
spec:
ingressClassName: traefik # k3s 에서 기본 제공해주는 ingress controller
tls:
- hosts:
- mlflow.swmlops.site # 이 도메인으로 접속할 때 TLS 인증서 사용
secretName: mlflow-tls
rules:
- host: mlflow.swmlops.site # 이 도메인으로 접속할 때 아래의 http 경로로 라우팅
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mlflow # mlflow 서비스로 이동 + 5000 포트로 이동
port:
number: 5000
4 changes: 2 additions & 2 deletions k8s/mlflow/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ apiVersion: v1
kind: Service
metadata:
name: mlflow
namespace: mlflow
spec:
type: NodePort
type: ClusterIP
selector:
app: mlflow
ports:
- port: 5000
targetPort: 5000
nodePort: 30050
2 changes: 1 addition & 1 deletion k8s/model-api/base/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ spec:
- containerPort: 8000
env:
- name: MLFLOW_TRACKING_URI
value: http://mlflow:5000
value: http://mlflow.mlflow.svc.cluster.local:5000
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
Expand Down
2 changes: 2 additions & 0 deletions k8s/model-api/overlays/local/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: model-api

resources:
- ../../base # base 가져다 쓴다
- service.yaml
11 changes: 10 additions & 1 deletion k8s/model-api/overlays/production/ingress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,18 @@ apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: model-api
namespace: model-api
annotations:
cert-manager.io/cluster-issuer: swmlops-issuer # cert-manager에서 인증서를 발급받을 때 사용할 ClusterIssuer 지정
spec:
ingressClassName: traefik # k3s 에서 기본 제공해주는 ingress controller
tls:
- hosts:
- model.swmlops.site # 이 도메인으로 접속할 때 TLS 인증서 사용
secretName: model-api-tls
rules:
- http:
- host: model.swmlops.site # 이 도메인으로 접속할 때 아래의 http 경로로 라우팅
http:
paths:
- path: /
pathType: Prefix
Expand Down
2 changes: 2 additions & 0 deletions k8s/model-api/overlays/production/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: model-api # 네임스페이스 추가(일부러 deployment.yaml에서 네임스페이스 안쓰고 여기서만 씀)

resources:
- ../../base
- service.yaml
Expand Down
15 changes: 14 additions & 1 deletion k8s/monitoring/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,17 @@ prometheus:
- job_name: model-api
static_configs:
- targets:
- model-api.default.svc.cluster.local:8000
- model-api.model-api.svc.cluster.local:8000 # 다른 네임스페이스에 있는 model-api의 클러스터 내부 주소와 포트

grafana:
ingress:
enabled: true
ingressClassName: traefik
annotations:
cert-manager.io/cluster-issuer: swmlops-issuer
hosts:
- monitoring.swmlops.site
tls:
- secretName: grafana-tls
hosts:
- monitoring.swmlops.site
14 changes: 14 additions & 0 deletions k8s/namespaces.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Namespace
metadata:
name: mlflow
---
apiVersion: v1
kind: Namespace
metadata:
name: model-api
---
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
2 changes: 1 addition & 1 deletion services/model-api/app/models/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def load_model(model_name: str, version: str):
if cache_key in _model_cache:
return _model_cache[cache_key]

mlflow_uri = os.getenv("MLFLOW_TRACKING_URI", "http://mlflow:5000")
mlflow_uri = os.getenv("MLFLOW_TRACKING_URI", "http://mlflow:5000") # 환경변수에서 mlflow tracking uri 가져오기, 없으면 기본값으로 http://mlflow:5000 사용
mlflow.set_tracking_uri(mlflow_uri)

model_uri = f"models:/{model_name}-{version}/latest"
Expand Down
2 changes: 1 addition & 1 deletion services/model-api/training/churn/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def main(args):
parser.add_argument('--version', type=str, default='v1')
parser.add_argument('--C', type=float, default=1.0)
parser.add_argument('--data_dir', type=str, default='../data/churn')
parser.add_argument('--mlflow_uri', type=str, default='http://localhost:5000')
parser.add_argument('--mlflow_uri', type=str, default='https://mlflow.swmlops.site') # 로컬에서 실행해도 등록되도록 기본값 변경
args = parser.parse_args()

main(args)
Loading