테크믈리에의 리뷰 공간

[k8s] KubeFlow 설치 방법 및 각종 설정 방법 본문

프로그래밍|소프트웨어/기타

[k8s] KubeFlow 설치 방법 및 각종 설정 방법

테크믈리에 2024. 2. 1. 13:29

 

KubeFlow? 

https://www.kubeflow.org

 

Kubeflow

Kubeflow makes deployment of ML Workflows on Kubernetes straightforward and automated

www.kubeflow.org

https://github.com/kubeflow/manifests

 

GitHub - kubeflow/manifests: A repository for Kustomize manifests

A repository for Kustomize manifests. Contribute to kubeflow/manifests development by creating an account on GitHub.

github.com

 

 

 

설치 전 준비 작업

설치 하기에 앞서서 필요한 것들을 확인해보도록 하자.

 

1. Kubernetes 환경이 필요하다.

본인이 사용한 Kubernetes 버전은 k0s의 v1.25.16+k0s.0이다. (kubeflow 권장 up to 1.26)

https://korjwl1.tistory.com/28

 

[k0s Cluster 구축] 1. Ansible을 통한 기초 세팅

목차 0. Rocky Linux 8.5 설치 1. Ansible을 통한 기초 세팅 2. k0s 클러스터 구축 및 OpenLens 기초 사용법 3. OpenLens의 기초 세팅법 4. k0s 클러스터에서 Nvidia GPU 사용하기 5. k0s 클러스터에서 Rook Ceph Block Storage

korjwl1.tistory.com

만약 어떻게 환경을 준비할 지 모르겠다면 본인이 쓴 시리즈 글을 참고하여보도록하자.

(이 때, k0s_setup.yml 파일 내의 Install latest k0s 내용을 조금 수정해야한다.

 *수정 전 shell: curl -sSLf https://get.k0s.sh | DEBUG=true sh

 -> * 수정 후 shell: curl -sSLf https://get.k0s.sh | K0S_VERSION=v1.25.16+k0s.0 sh)

 

2. Default Storage Class가 설정되어 있어야 한다.

보통 많이 쓰는 Storage는 LongHorn, Rook Ceph, OpenEBS, Minio 등이 있다.

노드 3개 이상이라면 Rook Ceph를 추천하고 본인은 Rook Ceph 1.13.3 버전을 사용하였다.

https://korjwl1.tistory.com/32

 

[k0s Cluster 구축] 5. k0s 클러스터에서 Rook Ceph Block Storage 사용하기

목차 0. Rocky Linux 8.5 설치 1. Ansible을 통한 기초 세팅 2. k0s 클러스터 구축 및 OpenLens 기초 사용법 3. OpenLens의 기초 세팅법 4. k0s 클러스터에서 Nvidia GPU 사용하기 5. k0s 클러스터에서 Rook Ceph Block Storage

korjwl1.tistory.com

k0s에 Rook Ceph를 사용하고자 한다면 위의 글을 참고해보도록 하자.

# 기존 기본 저장장소 해제
kubectl patch storageclass <이름> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

# 새 기본 저장장소 지정
kubectl patch storageclass <이름> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

본인만의 Storage를 구축한 다음에는 위의 코드를 참고하여 Default Storage를 하나 지정해주도록 하자.

 

3. Kustomize 설치

아래의 명령어를 참고하여 Kustomize를 설치해두도록 하자.

curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
sudo mv kustomize /usr/local/bin

 

번외. MetalLB를 통한 Load Balancer 준비

아래 명령어를 통해 MetalLB를 설치하도록 하자.

helm repo add metallb https://metallb.github.io/metallb
helm --namespace metallb-system install --create-namespace metallb metallb/metallb

설치 후에는 아래 내용을 metallb_config.yaml로 저장하고 kubectl apply -f metallb_config.yaml로 반영하도록 하자.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: nat
spec:
  addresses:
    - [시작 IP]-[끝 IP]
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: empty
  namespace: metallb-system

 

설치 방법

 

우선은 k0s 등의 환경에서는 미리 istio를 설치해두고 istio 관련 설정을 적용해놔야 KubeFlow가 정상적으로 올라간다.

(Rancher + Calico 조합에서는 아래 작업 없이 올라갔었다)

(만약 istio 관련 설정이 제대로 되지 않았다면 command error output: xtables parameter problem: iptables-restore: unable to initialize table 'nat' 에러가 발생할 것이고 dashboard에서는 unhealthy upstream 에러가 발생하고 있을 것인데, 아래 istio 설정 관련 내용을 진행한 다음 각 노드를 재부팅해주고 pending 상태인 pod들을 강제로 끄기를 반복해주다보면 정상화 될 것이다.)

# 모든 참여 노드에서 아래 내용을 진행한다.
sudo nano /etc/modules-load.d/k8s.conf

# 아래 내용 추가
overlay
br_netfilter
nf_nat
xt_REDIRECT
xt_owner
iptable_nat
iptable_mangle
iptable_filter

# 내용 추가 및 저장 후에는 노드를 재시작한다.
sudo reboot

이제 KubeFlow 설치파일을 다운받도록 한다.

git clone https://github.com/kubeflow/manifests.git
cd manifests

# 아래 명령어로 설치
while ! kustomize build example | awk '!/well-defined/' | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

모든 Pod가 정상적으로 올라간 다음에 대시보드에 접속해보려면 아래 명령어를 통하여 LoadBalancer나 NodePort 설정을 해주도록 하자.

KUBE_EDITOR="nano" kubectl edit svc istio-ingressgateway -n istio-system

초기 ID는 user@example.com이고 초기 PWD는 12341234이다.

성공적으로 설치가 되었다면 아래와 같은 화면이 보일 것이다.

 

오류 해결 방법 및 KubeFlow 설정 방법

1. HTTP 상에서 정상적으로 동작하게 하는 방법

nano apps/jupyter/jupyter-web-app/upstream/base/params.env

# 내부에서 - name: APP_SECURE_COOKIES 항목을 value: "false"로 변경

kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -
nano apps/volumes-web-app/upstream/base/params.env

# 내부에서 - name: APP_SECURE_COOKIES 항목을 value: "false"로 변경

kustomize build apps/volumes-web-app/upstream/overlays/istio | kubectl apply -f -

2. 로그아웃 버튼이 동작하지 않을 때 고치는 방법

# 아래 내용을 아무 이름으로나 저장한 다음 kubectl apply -f 명령어로 적용하도록 하자.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: authservice-logout
  namespace: istio-system
spec:
  gateways:
    - kubeflow/kubeflow-gateway
  hosts:
    - '*'
  http:
    - match:
        - uri:
            prefix: /logout
      rewrite:
        uri: /authservice/logout
      route:
        - destination:
            host: authservice.istio-system.svc.cluster.local
            port:
              number: 8080

3. LDAP 로그인 방법을 추가하는 방법

# 아래 명령어로 dex-config.yaml 파일을 생성한다
kubectl get configmap dex -n auth -o jsonpath='{.data.config\.yaml}' > dex-config.yaml

# 파일 내용 수정 -> dex-config.yaml 제일 아래에 # LDAP Configuration 부터의 내용을 추가한다.
# 만약 STARTTLS 미적용 상태라면 startTLS: false로 두고 rootCAData: 줄을 삭제한다.
# LDAP Configuration
connectors:
- type: ldap
  name: OpenLDAP
  id: ldap
  config:
    host: <Host 주소>
    insecureNoSSL: false
    insecureSkipVerify: false
    startTLS: true
    rootCAData: "<CA 증명서 내용 삽입>"
    bindDN: <Bind DN 정보>
    bindPW: <Bind DN 비밀번호>
    usernamePrompt: LDAP Username
    userSearch:
      baseDN: <Base DN 정보>
      filter: "(objectClass=posixAccount)"
      username: uid
      idAttr: uid
      emailAttr: mail
      nameAttr: cn
    groupSearch:
      baseDN: <Group Base DN 정보>
      filter: "(objectClass=posixGroup)"
      nameAttr: cn
      
# 파일 저장 후 아래 명령어를 통하여 변경 사항을 적용한다.
kubectl create configmap dex --from-file=config.yaml=dex-config.yaml -n auth --dry-run -oyaml | kubectl apply -f -
kubectl rollout restart deployment dex -n auth

5. LDAP 등 로그인 방식 추가 후 계정의 자체 NameSpace를 생성할 수 없는 문제 해결 방법

nano apps/centraldashboard/upstream/base/params.env

# registration flow true

kustomize build apps/centraldashboard/upstream/overlays/istio | kubectl apply -f -

6. GPU Vendor 선택 안 되는 이슈 해결 방법

KubeFlow 1.8 버전에서는 기본 소스 코드에서 왜인지 몰라도 GPU Vendor 내용이 위의 사진과 같이 빈 Array 상태로 오는 것을 확인할 수 있다. 이를 해결하기 위해서는 vendors: [] 줄을 삭제하고 그 아래 vendors: 부터 uiName: "AMD" 까지를 전부 주석 해제하도록 하자.

내용을 전부 수정한 다음 변경 사항을 반영하기 위해서는 설치 코드를 다시 돌려주도록 하자. 

7. NodeAffinity를 통한 GPU 선택권 제공하기

KubeFlow는 기본적으로 AWS나 GKE 등에서 돌아가도록 나왔기에 GPU를 선택하는 옵션이 기본적으로 들어있지 않다.

하지만 일반 사용자 입장에서는 노드를 구매한 시기가 제각각이고 때문에 GPU가 제각각인 일이 많을텐데, 기본적으로 GPU 종류에 무관하게 랜덤 Pod 생성이 일어나는 점이 여간 신경쓰이지 않을 수 없다.

이를 해결하기 위해서는 NodeAffinity를 통해 Pod 생성 시 GPU를 고르도록 할 필요가 있다.

NodeAffinity가 무엇인지 모르는 사람은 해당 내용을 제대로 공부한 다음 위의 스크린샷을 참고하여 파일을 수정하고 설치 코드를 다시 돌려 변경 사항을 반영해주도록 하자.

8. 설치 코드 때문에 LoadBalancer / NodePort 설정 변경되는 것 방지하기

GPU의 새로운 종류가 추가되어서 NodeAffinity 정보를 수정한다던지의 이유로 인해 설치 코드를 통해 해당 내용을 반영할 때마다 service 정보가 기본으로 돌아가버려 LoadBalancer / NodePort 설정정보가 바뀐다면 여간 귀찮은 일이 아닐 것이다.

이를 방지하기 위해서는 위의 스크린샷을 참고하여 아예 설치 파일을 수정해두도록 하자.

Comments