코딩 기록 저장소

[쿠버플로우] 설치 및 세팅하기 본문

개인 공부/쿠버네티스

[쿠버플로우] 설치 및 세팅하기

KimNang 2025. 6. 5. 10:13

목차

     

    Master노드 버전 정리

    - kubernetes : v1.28.15

    - kustomize : v5.6.0

    - kubeflow : v1.8.0

    1. Kubeflow 설치 및 접속

    01. Kubeflow 설치하기

    kustomize를 설치함
    curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
    install kustomize /usr/bin/kustomize

     

     

     

    manifest git을 clone 함
    git clone https://github.com/kubeflow/manifests.git
    cd manifests
    git checkout v1.8.0

     

     

     

    http로 접속할 수 있도록 설정함

    - 아래 3개 파일의 secure_cookies를 false로 설정함

    1. apps/jupyter/jupyter-web-app/upstream/base/params.env
    2. apps/tensorboard/tensorboards-web-app/upstream/base/params.env
    3. apps/volumes-web-app/upstream/base/params.env

     

     

    deployment.yaml 수정

    common/oidc-client/oauth2-proxy/base/deployment.yaml

    - ndots를 4로 설정

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: oauth2-proxy
      labels:
        app: oauth2-proxy
    spec:
      replicas: 2
      selector:
        matchLabels:
          app.kubernetes.io/name: oauth2-proxy
      template:
        metadata:
          labels:
            app.kubernetes.io/name: oauth2-proxy
        spec:
          dnsConfig:
            options:
              - name: ndots
                value: "4"

     

     

     

    kustomize를 사용해 kubeflow 설치하기

    - 5분에서 10분 정도 소요됨

    - 모든 pod가 running이 될 때까지 기다림

    while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 20; done

     

     

     

    02. Kubeflow 접속하기

    istio-ingressgateway 수정

    - 기본적으로 ClusterIP 타입으로 생성되기 때문에, 호스트 환경에서 접속하기 위해 NodePort로 변경

    kubectl edit -n istio-system svc istio-ingressgateway

     

     

    Kubeflow 접속 해결

    - http://{Node IP + 포트번호}로 접속

    - 이때 Access to {IP주소} was denied You don't hava authorization to view this page. HTTP ERROR 403 이런 오류가 뜸

     

    1. PVC 정보 확인함
      - authservice-pvc가 Pending 상태로 뜸
      - 요청한 PersistentVolumeClaim(PVC)에 연결할 수 있는 PersistentVolume(PV)이 없음
      - 이로 인해 oidc-authservice Pod도 실행되지 않고, 결국 403 인증 오류가 생김
      kubectl get pvc -n istio-system


    2. local-path-provisioner 설치함
      - 로컬 테스트 환경이라 local-path StorageClass를 사용함
      kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

      - 설치 후 StorageClass 목록에 local-path가 나타나야 함
      kubectl get storageclass


    3. PVC에 local-path 지정
      - oidc-authservice에서 사용하는 PVC 리소스를 수정함
      nano authservice-pvc.yaml

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: authservice-pvc
        namespace: istio-system
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: local-path

      - PVC yaml 파일 수정 후 적용함
      kubectl delete pvc authservice-pvc -n auth
      kubectl apply -f authservice-pvc.yaml


    4. PVC 바인딩 상태 확인
      kubectl get pvc -n istio-system


    Kubeflow 접속

    - http://{Node IP + 포트번호}로 접속

    - 아래 사진과 같은 사이트가 뜨는데 기본 계정으로 로그인 

    • 기본 계정 : user@example.com
    • 패스워드 : 12341234

     

    - 이렇게 뜨면 접속 성공!

     

    03. Kubeflow 삭제

    - 단일 명령어로 Kubeflow 삭제가 가능함

    cd /home/$USER/manifests
    kustomize build example | kubectl delete -f -

     

     

    2. kubeflow 사용자 세팅

    01. 유저 프로필 생성하기

    1. profile.yaml을 활용해 유저 프로필 생성하기
      - kubeflow > manifests > common > dex > base 경로에 yaml 파일 생성
      - nang-profile.yaml로 생성함

      apiVersion: kubeflow.org/v1
      kind: Profile
      metadata:
          name: nang # 생성하고 싶은 프로필의 이름(네임스페이스로 지정할 이름)
      spec:
          owner:
              kind: User
              name: nang@example.com # 생성하고 싶은 프로필의 이메일(Kubeflow로그인ID)

      - apply 명령어를 이용해 profile을 적용함
      kubectl apply -f nang-profile.yaml

      ※ 프로필 생성 시 spec 하위에 resourceQuotaSpec 추가할 수 있음
      - 유저를 추가할 때 프로필 별 사용할 수 있는 리소스 양 지정 가능
      apiVersion: kubeflow.org/v1beta1
      kind: Profile
      metadata:
          name: nang
      spec:
          owner:
              kind: User
              name: nang@example.com
       	resourceQuotaSpec:
              hard:
                  cpu: "2"
                  memory: 1Gi
                  persistentvolumeclaims: "1"
                  requests.storage: "10Gi"


    2. config-map.yaml을 활용해 유저 등록
      - kubeflow > manifests > common > dex > base >config-map.yaml 파일을 수정하면 위에서 생성한 유저의 네임스페이스와 Kubeflow의 정보를 매핑함
      - username: 네임스페이스명 / email: Kubeflow 로그인 ID / hash: 암호화된 비밀번호

      - config-map.yaml 적용함
      kubectl apply -f config-map.yaml -n auth


    3. 적용 후 확인하기
      - 네임스페이스 및 config 설정을 적용하기 위해서는 dex를 재실행해야 함
      kubectl rollout restart deployment dex -n auth
       

      - 적용이 잘 되었음!!

     

     

    02. kubeflow 권한 제한하기

    kim 프로필 생성

    - 이 Profile을 만들면 kim 네임스페이스와 kim@example.com 사용자에게 edit 권한이 부여됨

     

     

    Role 생성

    - kim 사용자가 nang 네임스페이스에 접속했을 때 오직 Notebook만 생성/조회/삭제할 수 있도록 Role을 정의함

     

     

    Rolebinding 부여

     

     

    3. Kubeflow 대시보드 설정

    01. MLflow 설치 및  대시보드 추가하기

    - 두 가지 성격의 저장소가 필요함

    • DB (metadata 저장)
    • Storage (Artifact 저장)

    - DB를 위해 일반적으로 PostgreSQL을 사용하고, 아티팩트를 저장하기 위해 S3를 사용함

    - Kubeflow는 기본적으로 저장소로 MinIO를 사용하기에 여기에 mlflow용 버킷을 만들고 사용할 수 있음

     

    MLflow를 위한 Minio bucket 생성

    - Kubeflow를 위해 이미 설치된 minio 서비스에 접속해 버킷을 생성함

    kubectl port-forward -n kubeflow svc/minio-service 9000:9000

     

     

     

    - http://localhost:9000/ 에 접속한 뒤 아래 계정으로 로그인함

    • Access Key: minio
    • Secret Key: minio123

     

     

    - 이후 mlflow라는 이름으로 버킷을 생성함

     

    - mlflow를 위한 artifact 저장소가 준비됨

    - mlflow를 설치할 Helm 차트에서 설치를 제공해서 따로 설치를 하지 않음

     

     

    MLflow 설치

    - 아래 명령어로 설치를 함

    kubectl create ns mlflow
     
    kubectl create -n mlflow secret generic mlflow-secret \
        --from-literal=AWS_ACCESS_KEY_ID=minio \
        --from-literal=AWS_SECRET_ACCESS_KEY='minio123'
     
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm upgrade --install mlflow bitnami/mlflow -n mlflow --version 0.10.3 \
    --set minio.enabled=false \
    --set externalS3.host=minio-service.kubeflow \
    --set externalS3.port=9000 \
    --set externalS3.existingSecret=mlflow-secret \
    --set externalS3.existingSecretAccessKeyIDKey="AWS_ACCESS_KEY_ID" \
    --set externalS3.existingSecretKeySecretKey="AWS_SECRET_ACCESS_KEY" \
    --set externalS3.bucket="mlflow" \
    --set externalS3.protocol=http

     

     

    - http://localhost:32429에 접속하고 로그인하면 아래와 같은 화면이 나와야 함

    • username: user
    • password: kubectl get secret --namespace mlflow mlflow-tracking -o jsonpath="{.data.admin-password }" | base64 -d

     

    virtual service 생성

    - Kubeflow의 Central Dashboard에서 하나의 탭을 클릭할 때 다양한 엔드포인트로 라우팅 하기 위해 VirtualService를 사용 (Jupyter, Katib, pipeline 등)

    - MLflow 버튼을 클릭하면 mlflow tracker UI로 라우팅 해야 하므로 추가로 Virtual Service를 생성해야 함

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: mlflow
      namespace: kubeflow
    spec:
      gateways:
      - kubeflow/kubeflow-gateway
      hosts:
      - '*'
      http:
      - match:
        - uri:
            prefix: /mlflow/
        rewrite:
          uri: /
        route:
        - destination:
            host: mlflow-tracking.mlflow.svc.cluster.local
            port:
              number: 80
    kubectl apply -f mlflow_virtual_service.yaml

     

     

    - /mlflow/ 라는 라우터에 접근 시 mlflow-tracking.mlflow.svc.cluster.local:80로부터 요청을 받아옴

     

     

    Central Dashboard 수정

    - Central Dashboard에 버튼을 추가하기 위해, configmap에 정의된 것을 수정함

    kubectl edit cm centraldashboard-config -n kubeflow

     

     

    - 아래와 같은 내용을 추가함

    {
      "type": "item",
      "link": "/mlflow/",
      "text": "mlflow",
      "icon": "device:access-alarm"
    }

     

     

     

    - 그 후 Central Dashboard를 재시작함

    kubectl rollout restart deploy centraldashboard -n kubeflow

     

     

     

    - 다시 대시보드에 접근하여 확인함!

     

     

    02. Kubeflow 대시보드 탭 삭제하기 

    현재 탭 확인

    - 이중에서 'Endpoints'부터 'Executions'까지의 탭을 전부 삭제하고 확인해볼 예정

     

    configmap 수정

    - 'Volumes'부터 이전에 추가한 'mlflow' 사이의 탭을 전부 삭제함

    kubectl edit cm centraldashboard-config -n kubeflow

     

     

     

    - 그 후 Central Dashboard를 재시작함

    kubectl rollout restart deploy centraldashboard -n kubeflow

     

     

    - 다시 대시보드에 접근하면 탭이 삭제된 것을 확인할 수 있음!

     

     

     

    참고한 링크

    1. Kubeflow 설치 및 접속

    https://kyeongseo.tistory.com/entry/kubeflow-190-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

     

    kubeflow 1.9.0 설치하기

    kubernetes versionv1.29.8kubeflow version1.9.0kustomize versionv5.4.31. kustomize를 설치한다.curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash install kustomize /usr/bin/kustomize 2. manifes

    kyeongseo.tistory.com

     

    https://dolphincoding.tistory.com/entry/Kubeflow-18%EC%9D%84-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-Kubernetes-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

     

    Minikube (k8s 1.28.2) + Kubeflow 1.8 설치하기

    [1단계] Minikube 로 K8S 세팅하기이번 글에서는 Minikube로 Kubernetes 버전 1.28.2버전을 설치하고, 현재 기준 최신 버전인 kubeflow 1.8을 설치할 거에요먼저 k3s, kubespray, kubeadm등 다양한 방식으로 설치해볼

    dolphincoding.tistory.com

     

    2. Kubeflow 세팅

    https://semizero.tistory.com/47

     

    [Kubeflow] Kubeflow 유저 추가하기(유저 분기처리하기)

    Kubeflow를 활용하다보면 user@example.com/12341234 라는 샘플 계정을 활용하여, 테스트하는 경우가 많다. 그러나 서비스 관점에서는 사용자별 Kubeflow 기능을 분기하여 관리해야할 필요가 있다. 그렇기에

    semizero.tistory.com

     

    3. Kubeflow 대시보드 설정

    https://suwani.tistory.com/170

     

    1.1. Kubeflow 대시보드 내에 MLFlow 임베딩하기

    참고한 블로그 - https://medium.com/dkatalis/kubeflow-with-mlflow-702cf2ebf3bf 앞선 포스팅에서 Kubeflow를 설치했다. 그리고 MLflow도 설치했다. 이번 포스팅의 목적은 Kubeflow 대시보드에 MLFlow가 하나의 탭으로 추

    suwani.tistory.com