2. Kubeflow 설치 (최신버전 / 온프레미스-가상머신)

Jk Lim·2023년 10월 6일
0
post-thumbnail

이번 글에서는 지난 글에서 가상머신 2개로 구성한 Kubernetes 클러스터에, 공식 Manifest를 사용하여 Kubeflow 최신버전을 배포해 보겠습니다.

진행 순서

  1. 사전 필요 패키지 설치
  2. Manifest를 통한 Kubeflow 배포
  3. Kubeflow UI 접속

1. 사전 필요 패키지 설치

  • 지난 글에서 설치한 Kubernetes 클러스터는 1.25버전이므로 요구사항에 충족합니다.
  • 다음으로 필요한 default StorageClass를 구성하겠습니다.

(1) NFS 서버 설치

  • default StorageClass를 정의하기 위해서는 Kubernetes 클러스터 내에 동적 볼륨 프로비저너가 존재해야합니다.
  • 동적 볼륨 프로비저너를 구성하는 방법은 여러가지가 있지만, 여기서는 클러스터의 Control Node에 NFS 서버를 구축하여 동적 볼륨 프로비저너를 구성합니다.
  • /srv/nfs-volume 이라는 디렉토리를 만들고 해당 디렉토리의 NFS 서버 Mount 정책을 생성합니다.
# [Control Node]
$ sudo apt install -y nfs-kernel-server
$ sudo mkdir /srv/nfs-volume
$ echo "/srv/nfs-volume *(rw,insecure,sync,no_subtree_check,no_root_squash)" | sudo tee /etc/exports
## 출력값 -> /srv/nfs-volume *(rw,sync,no_subtree_check,no_root_squash)
$ sudo systemctl restart nfs-kernel-server.service
  • Worker Node에서도 NFS 서버에 접속 할 수 있도록 NFS 클라이언트를 설치해 줍니다.
# [Worker Node]
$ sudo apt install -y nfs-common

(2) 동적 볼륨 프로비저너 설치

  • Kubernetes 공식 문서에서 제공하는 NFS 동적 볼륨 프로비저너를 설치합니다. (https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner)
  • 해당 프로비저너는 Deployment 리소스로 생성되며, deployment.yaml 에서 NFS 서버와 관련된 내용을 수정한 다음 배포를 진행합니다.
$ git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
$ cd ~/nfs-subdir-external-provisioner/deploy/
$ vim deployment.yaml
# deployment.yaml
...
      containers:
        ...
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 192.168.56.101  # NFS서버 주소
            - name: NFS_PATH
              value: /srv/nfs-volume  # 마운팅할 경로
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.56.101  # NFS서버 주소
            path: /srv/nfs-volume  # 마운팅할 경로
...
# 배포 진행
$ kubectl create -k .
  • 배포가 완료되면 default 네임스페이스에 프로비저너와 StorageClass가 생성됩니다.
  • Kubeflow 배포 시에는 default로 설정된 StorageClass가 필요하므로 새롭게 생성된 StorageClass를 default로 지정하는 설정을 다음 명령어로 수행합니다.
# default StorageClass 설정
$ kubectl patch storageclasses.storage.k8s.io nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
# default StorageClass 설정 확인
$ kubectl get sc
NAME                   PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  19s

(3) Kustomize 설치

  • Kubeflow Manifest는 배포 도구로 Kustomize를 사용합니다. 따라서 요구사항에 맞는 버전의 Kustomize를 설치합니다.
  • 여기서는 최신버전의 Kustomize 바이너리 파일을 다운로드 하고 /usr/local/bin 디렉토리에 복사하여, Kubeflow 배포를 실행할 가상머신(Control Node)에서 실행할 수 있도록 합니다.
$ curl -s "https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
$ sudo mv kustomize /usr/local/bin
$ kustomize version
v5.1.

2. Manifest를 통한 Kubeflow 배포

  • 공식 Manifest Github 를 참고하여 Kubeflow 배포를 수행합니다. (https://github.com/kubeflow/manifests)
  • Kubeflow 구성요소를 필요에 따라 kustomize build 명령어로 각각 배포할 수 있습니다.
  • 여기서는 공식 문서의 안내에 따라 1번의 명령어로 전체 구성요소를 한번에 설치합니다.
$ git clone https://github.com/kubeflow/manifests.git
$ cd manifests
$ while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done
  • 설치가 완료되면 Kubeflow 네임스페이스에 다양한 리소스가 생성된 것을 확인할 수 있습니다.
$ kubectl get po -n kubeflow
NAME                                                     READY   STATUS            RESTARTS   AGE
admission-webhook-deployment-6cf44ffbdb-v6hzb            1/1     Running           0          2m13s
cache-server-65b7b58f99-mkfbj                            0/2     PodInitializing   0          2m13s
centraldashboard-657df77fc7-8ftrp                        1/2     Running           0          2m13s
kubeflow-pipelines-profile-controller-59ccbd47b9-w942d   1/1     Running           0          2m13s
metadata-envoy-deployment-6448d544f5-kmm2d               1/1     Running           0          2m13s
metadata-grpc-deployment-784b8b5fb4-fw7lv                0/2     PodInitializing   0          2m13s
metadata-writer-76d6d85b4b-rt68m                         0/2     PodInitializing   0          2m13s
workflow-controller-f65c9d9b4-8cfp8                      0/2     PodInitializing   0          2m13s
...

3. Kubeflow UI 접속

  • Kubeflow는 리소스 간 원활한 네트워크 통신과 관리를 위해 서비스 메쉬로 istio 리소스를 사용합니다.
  • istio 구성요소들은 istio-system이라는 별도의 네임스페이스에 존재합니다.
  • Kubeflow UI로 접속하기 위해서는 istio-system 네임스페이스 내에 istio-ingressgateway라는 서비스를 통해야합니다.
$ kubectl get svc -n istio-system 
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                 AGE
authservice             ClusterIP   10.233.24.91    <none>        8080/TCP                                3m49s
cluster-local-gateway   ClusterIP   10.233.25.89    <none>        15020/TCP,80/TCP                        3m49s
istio-ingressgateway    ClusterIP   10.233.27.33    <none>        15021/TCP,80/TCP,443/TCP                3m49s
istiod                  ClusterIP   10.233.42.154   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP   3m49s
knative-local-gateway   ClusterIP   10.233.9.57     <none>        80/TCP                                  3m49s
  • 해당 서비스는 기본적으로 ClusterIP 타입으로 생성되기 때문에, 여기에서는 호스트 환경에서 편하게 접속하기 위해서 NodePort나 LoadBalaner 타입으로 변경하고 특정 포트(31380)를 할당해 주었습니다.
  • istio-ingressgateway 서비스 리소스 정의 파일을 직접 수정합니다.
$ kubectl edit -n istio-system svc istio-ingressgateway
...
spec:
  clusterIP: 10.233.27.33
  clusterIPs:
  - 10.233.27.33
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: status-port
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: http2
    port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 31380     # 이부분 추가
  - name: https
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  sessionAffinity: None
  type: NodePort       # 이 부분 변경
...
  • 수정이 완료되면 호스트 환경에서 Control Node IP + 포트번호를 입력하여 Kubeflow UI 환경으로 접속 할 수 있습니다.

  • 기본 계정은 user@example.com, 패스워드는 12341234 입니다.

  • 접속하면 Kubeflow UI의 대시보드를 확인할 수 있습니다.

이렇게 공식 Manifest를 사용하면 Kubeflow 최신 버전을 손쉽게 배포할 수 있습니다. 다음 글에서는 Kubeflow 리소스 중 하나인 Jupyter Notebook 서버를 사용해 보겠습니다.

0개의 댓글