개요
Kubeflow를 통해 ML Ops 생태계를 이해하고, 전 주기 파이프라인를 구성해본다.
목표
kubeflow의 개요와 설치방법을 정리한다.
여정
Kustomize 설치
Kustomize는 kustomization 파일을 통해 쿠버네티스 오브젝트를
사용자가 원하는 대로 변경하는(customize) 독립형 도구이다.
kubectl 1.14 버전 이상부터 내장되어 apply -f 명령으로 바로 사용할 수 있다.
현재 3.2.0 or 4.5.7버전이 사용가능하며, 4.5.7버전은 간편 설치용 싱글 커맨드를 사용할 수 없다.
# Kustomize 설치 및 명령어 등록
wget https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh
sudo bash ./install_kustomize.sh 4.5.7
# (kustomize 파일이 생성됨)
# 명령어 등록
sudo mv kustomize /usr/bin/
Kubeflow 설치
# Kubeflow 1.6.1 버전 설치
mkdir kubeflow
cd kubeflow
git clone https://github.com/kubeflow/manifests
# 해당 폴더로 이동
cd manifests
# 버전에 맞게 브랜치 변경
git checkout v1.7-branch
# 반복문을 이용한 Single Command 설치
while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
Istio를 통한 Central Dashboard 접속설정
Kubeflow는 기능별 요청을 Central Dashboard에서 요청할 수 있다.
Central Dashboard에서는 Service Mesh(Istio)를 통해 요청을 해당 Pod에게 전달한다.
Central Dashboard에 접속하는 방법은 여러가지가 있다.
보통 예제에서는 expose 설정을 통해 노출한다.
필자는 (Ingress + Istio) 조합으로 아래와 같이 구성하고자 했다.
(그림은 복잡해보이지만, Ingress 설정하나만 추가하면 된다)
그 이유는 L4 ~ L7 레이어의 기능을 폭넓게 사용하기 위해서 이다.
Istio Gateway는 TLS TLS key, 인증 같은 L4-L6 기능만을 구성할 수 있다.
여기에 Ingress가 가진 L7 기능(DNS 가상 호스팅, 로드 밸런싱, SSL 인증서 처리)을 추가한다면
더욱 실용적으로 사용할 수 있다.
# DNS 설정
sudo vi /etc/hosts
...
211.xx.xx.xx myapp.test.local
${IP} ${DNS 주소}
# Ingress 설정
sudo vi kubeflow-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubeflow-ingress
namespace: istio-system
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
spec:
ingressClassName: nginx
defaultBackend:
service:
name: istio-ingressgateway
port:
name: http2
rules:
- host: "${DNS 주소 입력}"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: istio-ingressgateway
port:
name: http2
# 설정 적용
kubectl apply -f kubeflow-ingress.yaml
# istio-ingressgateway Service 오픈
kubectl edit svc istio-ingressgateway -n istio-system
...
type: LoadBalancer # 변경
# IP 포트 확인
# http 포트 : 80번 포트 -> 30918번으로 노출
kubectl svc istio-ingressgateway -n istio-system
PORT(S)
... 15021:32445/TCP,80:${포트번호}/TCP,443:31933/TCP,31400:31387/TCP,15443:30010/TCP 2d2h
# http 포트로 대시보드 접속
http://${DNS 주소}:${포트번호}
Service Mesh 내부 HTTPS 통신 설정(CSRF 방지)
Kubeflow에서 사용하는 web은 Secure cookies를 사용한다.
때문에, HTTPS 통신을 하지 않는다면,
일부 기능을 사용하는데 있어 403 CSRF Error가 발생한다.
이를 해결하기 위해선 2가지 방법이 있는데,
첫번째는 Secure Cookie 기능을 해제하는 것이고,
두번째는 HTTPS 통신을 활성화하는 것이다.
첫번째 방법은 보안을 신경쓰지않는 개인용 클러스터에서 사용할만하나
프로덕션 레벨에서는 권장하지 않느다.
따라서 이를 위한 HTTPS 세팅을 진행한다.
# 현재 사용중인 ClusterIssuer의 이름 확인
# (gateways-issuer인 경우도 있음)
kubectl get ClusterIssuer -A
NAME READY AGE
kubeflow-self-signing-issuer True 3d20h
# HTTPS 통신을 위한 Certificate 작성
vi -f kubeflow-gateway-issuer.yaml
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: kubeflow-ingressgateway-certs
namespace: istio-system
spec:
commonName: ${DOMAIN_NAME} # Ex) kubeflow.mydomain.com
issuerRef:
kind: ClusterIssuer
name: kubeflow-self-signing-issuer # ClusterIssuer 이름 입력
secretName: kubeflow-ingressgateway-certs
---
# Certificate 적용
kubectl apply -f kubeflow-gateway-issuer.yaml
# kubeflow 내부 Gateway에
# Certificate 적용
kubectl edit gateway kubeflow-gateway -n kubeflow
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: kubeflow-gateway
namespace: kubeflow
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- "*"
port:
name: http
number: 80
protocol: HTTP
# 여기 아래부분 추가
tls:
httpsRedirect: true
- hosts:
- "*"
port:
name: https
number: 443
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: kubeflow-ingressgateway-certs
이후부터 kubeflow 접속은 HTTPS로 접속하게 되므로 접속 포트를 다시 한번 확인할 필요가 있다.
# istio-ingressgateway Service 오픈
kubectl edit svc istio-ingressgateway -n istio-system
...
- name: https
nodePort: 31234 # 변경
port: 443
protocol: TCP
targetPort: 8443
# https 포트로 대시보드 접속
https://${DNS 주소}:${포트번호}
Q & A
- Kubeflow를 삭제하고 싶어요
# kubeflow를 git clone했던 디렉토리에서
kustomize build example | kubectl delete -f -
# 네임스페이스 관련 삭제가 되지 않을 때
# 네임스페이스 강제삭제
kubectl get namespace "${네임스페이스 명}" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/"${네임스페이스 명}"/finalize -f -
마무리
이번 시간에는 Kubeflow를 설치하고
Ingress와 조합하여 Central Dashboard에 접속하는 과정을 진행하였다.
다음 시간에는 Kubeflow의 기본적인 흐름을 짚어보도록 하자.
참고자료
Kustomize 빠르게 시작하기 (tistory.com)
[Istio] Service mesh에 적합한 Ingress Gateway는 무엇일까 ? (tistory.com)
Understanding Istio Ingress Gateway in Kubernetes - blog. (jayway.com)
[Istio] gateway 사용법 :: Carry On Progamming (tistory.com)
Dex 기반의 Kubeflow에 사용자 추가하기 – 지구별 여행자 (kangwoo.kr)
'DevOps' 카테고리의 다른 글
Secure K8S - RBAC 설정을 통한 멀티 클러스터 환경 분리 (0) | 2023.03.12 |
---|---|
Kubeflow 라이징 - Kiali로 Service Mesh 모니터링하기 (0) | 2023.03.10 |
Kubeflow 라이징 - GPU 워커노드 환경 구성 (0) | 2023.03.02 |
Kubeflow 라이징 - ML Ops와 Service Mesh 훑어보기 (0) | 2023.02.24 |
CI/CD Pipeline - 클러스터에 Private 저장소 이미지 배포하기 (0) | 2023.02.23 |