티스토리 뷰

카테고리 없음

Kubeflow Central 3탄(설치)

미니대왕님 2024. 6. 7. 16:30

2024.06.03 - [분류 전체보기] - Kubeflow Central 1탄(개념공부)

2024.06.03 - [분류 전체보기] - Kubeflow Central 2탄(설치)

2024.06.07 - [분류 전체보기] - Kubeflow Central 3탄(설치)

 

시작하기전 주의사항!!

 

우선 CPU Master 는 8core , worknode중 한대는 8core 하시길 바랍니다. 

최소 메모리는 32G 로 사용하고 총 8G(최대) , 4G(최소) 하시길 바랍니다. 

Mysql 오류가 발생할수 있으니 반드시 PV 잘 미리 체크생성하시길 바랍니다. 

NFS 서버 생성하고 PVC PV 잘 이용하시길바랍니다. 

이상

모든 POD 들이 정상적으로 구동되었습니다. 


참조 : https://mkbahk.medium.com/ubuntu-18-04%EC%83%81%EC%97%90-kubeflow-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-496a36c906f9

1. [kubeflow(kfctl)설치하기 3탄]

설치 되었던 kubeflow 에 설치한곳으로 각자 이동하시면됩니다.
저는 아래와 같이 만들어둔 폴더로 이동합니다.
mysql pvc pv 연동되는 부분 아래 위치로 이동하세요 
 
cd /data/manifests/apps/katib/upstream/components/mysql

2. [Kubernetes가 kubeflow에게 제공하는 pv스토리지 ]

인터넷에 공개된 대부분의 설치절차들에는 이 부분이 빠져있어
(또는 기본적으로 kubernetes에 미리 설치되어 있다고 간주해서)
나중에 katib-mysql, metadata-mysql, minio-pv-claim, mysql-pv-claim등이 pending상태로 유지되어 설치가 않됩니다. docker나 kubernetes에 익숙하지 않으신 분들을 위해 아래부분을 적어둡니다.

익숙하신 편집기 vi, vim, nano 등을 이용해 아래 .yaml을 만들세요.

vi sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate

 

아래 명령을 이용해 StorageClass를 만들고 확인하고, Default Storage 클래스로 지정해 줍니다.

# kubectl apply -f sc.yaml

# kubectl get sc


kubectl patch storageclass local-storage -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’
kubectl describe sc

 

결과는 아래와 비슷할 것입니다.

 

# kubectl get sc
NAME PROVISIONER AGE
local-storage (default) kubernetes.io/no-provisioner 86m

 

# kubectl describe sc

Name:            local-storage
IsDefaultClass:  No
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-storage"},"provisioner":"kubernetes.io/no-provisioner","volumeBindingMode":"Immediate"}

Provisioner:           kubernetes.io/no-provisioner
Parameters:            <none>
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>


Name:            nfs-client
IsDefaultClass:  Yes
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"nfs-client"},"parameters":{"archiveOnDelete":"false"},"provisioner":"k8s-sigs.io/nfs-subdir-external-provisioner"}
,storageclass.kubernetes.io/is-default-class=true
Provisioner:           k8s-sigs.io/nfs-subdir-external-provisioner
Parameters:            archiveOnDelete=false
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>



 

디스크 용량이 충분할 것을 /mnt에 마운팅해서 PV를 5개 정도 만들어 줍니다.

먼저디렉토리를 생성합니다.

#sudo mkdir /mnt/pv{1..5}

익숙한 편집기를 이용해 아래 .yaml파일를 작성하세요.

vi  pv.yaml
여기서  NFS 서버 설치후 작업 하려면 스토리지 클레스 네임을 nfs-client 용으로 변경해줘야 합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume1
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/nfs/mnt/pv1"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume2
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/nfs/mnt/pv2"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume3
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/nfs/mnt/pv3"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume4
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/nfs/mnt/nfs"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume5
  labels:
    type: local
spec:
  storageClassName: nfs-client
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/nfs/mnt/pv5"

 

아래 명령을 수행하여 적용하세요.

kubectl apply -f pv.yaml

수행결과를 아래 명령을 통해 확인하세요. 기본적으로 4개가 사용되고 1개는 남아있습니다.

kubectl get pv

 

 

참고로 모든 kubeflow서비스들이 생성된 후 아래 명령을 수행하며 어떤 kubeflow서비스가 어떤

영구 스토리지를 사용하는 지 확인이 됩니다. 서비스와 스토리지의 bonding이 확인되어야 합니다.

~# kubectl -n kubeflow get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
katib-mysql Bound pv-volume2 10Gi RWO local-storage 84m
metadata-mysql Bound pv-volume1 10Gi RWO local-storage 84m
minio-pv-claim Bound pv-volume4 20Gi RWO local-storage 84m
mysql-pv-claim Bound pv-volume5 20Gi RWO local-storage 84m

[kubeflow kfctl명령을 이용해 kubeflow 설치]

환경변수를 export합니다.

 

 

export PAT

export PATH=$PATH:/root/kubeflow/v1.0.2
export KF_NAME=mzc-kubeflow
export BASE_DIR=/root/kubeflow/v1.0.2
export KF_DIR=${BASE_DIR}/${KF_NAME}
export CONFIG_URI=”https://raw.githubusercontent.com/kubeflow/manifests/v1.0.0-branch/kfdef/kfctl_k8s_istio.v1.0.0.yaml"

환경변수값을 이용해 관련 디렉토리를 만들고설치용 .yaml파일을 이용해 Docker와 Kubernetes상에
kubernetes를 pod를 다수 생성해 kubeflow를 서비스를 시작합니다.


mkdir -p ${KF_DIR}
cd ${KF_DIR}
kfctl apply -V -f ${CONFIG_URI}

설치되기 위해 시스템의 성능마다 차이게 있겠지만 약 20분이 소요되었습니다. 
설치되는 동안 아래의 명령을 다른 창에서 수행하여 설치되는 내용을 확인해 보세요.

 

 

watch -n 5 kubectl get pods — all-namespaces

Every 1.0s: kubectl get pods — all-namespaces GC8440_106–246–237–171: Sat Oct 3 20:58:04 2020

NAMESPACE NAME READY STATUS RESTARTS AGE
cert-manager cert-manager-5d849b9888-dbgx4 1/1 Running 1 98m
cert-manager cert-manager-cainjector-dccb4d7f-z46gb 1/1 Running 1 98m
cert-manager cert-manager-webhook-695df7dbb-pf8r4 1/1 Running 1 98m
istio-system cluster-local-gateway-7bf56777fb-d8f2g 1/1 Running 1 98m
istio-system grafana-86f89dbd84-gd6zm 1/1 Running 1 98m
istio-system istio-citadel-74966f47d6-kvgfb 1/1 Running 1 98m
istio-system istio-cleanup-secrets-1.1.6-ljcgl 0/1 Completed 0 98m
istio-system istio-egressgateway-5c64d575bc-gsqrw 1/1 Running 1 98m
istio-system istio-galley-784b9f6d75-hsqs8 1/1 Running 1 98m
istio-system istio-grafana-post-install-1.1.6-f29qc 0/1 Completed 0 98m
istio-system istio-ingressgateway-589ff776dd-xt72s 1/1 Running 1 98m
istio-system istio-pilot-677df6b6d4-md4r5 2/2 Running 2 98m
istio-system istio-policy-6f74d9d95d-fvkxf 2/2 Running 8 98m
istio-system istio-security-post-install-1.1.6-nr7hh 0/1 Completed 0 98m
istio-system istio-sidecar-injector-866f4b98c7-zxjz2 1/1 Running 1 98m
istio-system istio-telemetry-549c8f9dcb-9ngtq 2/2 Running 7 98m
istio-system istio-tracing-555cf644d-srlwc 1/1 Running 1 98m
istio-system kiali-7db44d6dfb-wq8cq 1/1 Running 1 98m
istio-system prometheus-d44645598-k9z9w 1/1 Running 1 98m
knative-serving activator-6dc4884-spv8r 2/2 Running 6 95m
knative-serving autoscaler-69bcc99c79–6zpnx 2/2 Running 7 95m
knative-serving autoscaler-hpa-68cc87bfb9-lg6q6 1/1 Running 1 95m
knative-serving controller-95dc7f8bd-p62t8 1/1 Running 1 95m
knative-serving networking-istio-5b8c5c6cff-kzbt7 1/1 Running 1 95m
knative-serving webhook-67847fb4b5-zmx75 1/1 Running 1 95m
kube-system coredns-5c98db65d4–5wd65 1/1 Running 1 111m
kube-system coredns-5c98db65d4-bvbxl 1/1 Running 1 111m
kube-system etcd-minikube 1/1 Running 1 110m
kube-system kube-addon-manager-minikube 1/1 Running 1 111m
kube-system kube-apiserver-minikube 1/1 Running 1 110m
kube-system kube-controller-manager-minikube 1/1 Running 1 110m
kube-system kube-proxy-tjjkc 1/1 Running 1 111m
kube-system kube-scheduler-minikube 1/1 Running 1 110m
kubeflow admission-webhook-bootstrap-stateful-set-0 1/1 Running 1 95m
kubeflow admission-webhook-deployment-569558c8b6-wqxjc 1/1 Running 0 39m
kubeflow application-controller-stateful-set-0 1/1 Running 1 98m
kubeflow argo-ui-7ffb9b6577-zl5rq 1/1 Running 1 95m
kubeflow centraldashboard-659bd78c-866bs 1/1 Running 1 95m
kubeflow jupyter-web-app-deployment-679d5f5dc4-hwxh6 1/1 Running 1 95m
kubeflow katib-controller-7f58569f7d-f6nx5 1/1 Running 2 95m
kubeflow katib-db-manager-54b66f9f9d-lczdt 1/1 Running 2 95m
kubeflow katib-mysql-dcf7dcbd5–6vwf4 1/1 Running 1 95m
kubeflow katib-ui-6f97756598-w9jjt 1/1 Running 1 95m
kubeflow kfserving-controller-manager-0 2/2 Running 3 95m
kubeflow metacontroller-0 1/1 Running 1 95m
kubeflow metadata-db-65fb5b695d-2mpsq 1/1 Running 1 95m
kubeflow metadata-deployment-65ccddfd4c-5wp9x 1/1 Running 1 95m
kubeflow metadata-envoy-deployment-7754f56bff-kgmg7 1/1 Running 1 95m
kubeflow metadata-grpc-deployment-75f9888cbf-rnwcg 1/1 Running 3 95m
kubeflow metadata-ui-7c85545947-qm7km 1/1 Running 1 95m
kubeflow minio-69b4676bb7-pvthq 1/1 Running 1 95m
kubeflow ml-pipeline-5cddb75848–72fgk 1/1 Running 1 95m
kubeflow ml-pipeline-ml-pipeline-visualizationserver-7f6fcb68c8–9fl7n 1/1 Running 1 95m
kubeflow ml-pipeline-persistenceagent-6ff9fb86dc-gmgpr 1/1 Running 3 95m
kubeflow ml-pipeline-scheduledworkflow-7f84b54646-lkhs7 1/1 Running 1 95m
kubeflow ml-pipeline-ui-6758f58868–6zhlq 1/1 Running 1 95m
kubeflow ml-pipeline-viewer-controller-deployment-745dbb444d-rnws6 1/1 Running 1 95m
kubeflow mysql-6bcbfbb6b8-pnqtr 1/1 Running 1 95m
kubeflow notebook-controller-deployment-5c55f5845b-z82b7 1/1 Running 1 95m
kubeflow profiles-deployment-78f694bffb-62dvc 2/2 Running 2 95m
kubeflow pytorch-operator-cf8c5c497-wr9zk 1/1 Running 1 95m
kubeflow seldon-controller-manager-6b4b969447–8bczw 1/1 Running 1 95m
kubeflow spark-operatorcrd-cleanup-kmk5t 0/2 Completed 0 95m
kubeflow spark-operatorsparkoperator-76dd5f5688-cl5rw 1/1 Running 1 95m
kubeflow spartakus-volunteer-5dc96f4447-n4brp 1/1 Running 1 95m
kubeflow tensorboard-5f685f9d79-lmcwf 1/1 Running 1 95m
kubeflow tf-job-operator-5fb85c5fb7-qnmfj 1/1 Running 1 95m
kubeflow workflow-controller-689d6c8846-wz8jh 1/1 Running 1 95m

모든 kubernetes, kubeflow 관련 서비스들이 running 또는 completed 상태이어야 합니다.

[관리용 DASHBOARD접속하기]

아래 명령을 수행하여 istio-ingressgateway를 접속포트 80:31380/TCP,443:31390/TCP 를 확인합니다. 31380이 외부에서 공인IP로 접속할 포트입니다.

 

 

~# kubectl get service -n istio-system

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cluster-local-gateway ClusterIP 10.111.252.88 <none> 80/TCP,443/TCP,31400/TCP,15011/TCP,8060/TCP,15029/TCP,15030/TCP,15031/TCP,15032/TCP 99m
grafana ClusterIP 10.102.198.32 <none> 3000/TCP 99m
istio-citadel ClusterIP 10.100.8.228 <none> 8060/TCP,15014/TCP 99m
istio-egressgateway ClusterIP 10.102.187.43 <none> 80/TCP,443/TCP,15443/TCP 99m
istio-galley ClusterIP 10.96.251.122 <none> 443/TCP,15014/TCP,9901/TCP 99m
istio-ingressgateway NodePort 10.96.63.167 <none> 15020:31462/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:32235/TCP,15030:31184/TCP,15031:32031/TCP,15032:30239/TCP,15443:31355/TCP 99m
istio-pilot ClusterIP 10.106.117.168 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 99m
istio-policy ClusterIP 10.110.199.184 <none> 9091/TCP,15004/TCP,15014/TCP 99m
istio-sidecar-injector ClusterIP 10.110.161.15 <none> 443/TCP 99m
istio-telemetry ClusterIP 10.107.127.53 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 99m
jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 99m
jaeger-collector ClusterIP 10.104.13.82 <none> 14267/TCP,14268/TCP 99m
jaeger-query ClusterIP 10.96.60.230 <none> 16686/TCP 99m
kiali ClusterIP 10.110.114.176 <none> 20001/TCP 99m
prometheus ClusterIP 10.98.24.55 <none> 9090/TCP 99m
tracing ClusterIP 10.107.58.31 <none> 80/TCP 99m
zipkin ClusterIP 10.96.241.25 <none> 9411/TCP

호스트의 공인IP(Nodeport나 ClusterIP가 아님): 31380 포트로 브라우저를 이용해 접속합니다.

http://공인IP:31380/

초기 setup화면에서 anonymous 네임스페이스를 선택하고 finish하세요.

[모든 작업 초기화]

대부분은 kubeflow version을 변경하고 싶을 때나 모든 작업을 삭제하고 싶으시면 아래 절차를 수행하세요.

(kubeflow version 변경하여 재-설치)

minikube stop

docker images -f $(docker image ls -a -aq)

rm -rf /root/.kube

rm -rf /root/kubeflow

rm -rf /root/.minikube

위 명령을 수행 후에 “[minikube설치]” 단계 이후를 수행하세요.

(모든 것을 초기화)

바로 위의 “(kubeflow version 변경하여 재-설치)” 과정을 수행하고,

rm kfctl /usr/bin/kfctl
rm /usr/local/bin/kubectl
apt-get remove docker-ce docker-ce-cli containerd.io -y

[설치후기]

  • pipeline을 정상동작 확인됨
  • jupyter notebook server가 재대로 동작않됨

향후에 동작유무등을 추가로update하도록 하겠습니다.

감사합니다.

댓글