주녁, DevNote
article thumbnail

개요

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의 기본적인 흐름을 짚어보도록 하자.


참고자료

Documentation | 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)

Istio / Getting Started

Dex 기반의 Kubeflow에 사용자 추가하기 – 지구별 여행자 (kangwoo.kr)

crud-web-apps 1.3 Could not find CSRF cookie XSRF-TOKEN in the request · Issue #5803 · kubeflow/kubeflow (github.com)

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!