Ubuntu 18.04 서버에 Minikube로 Kubernetes, Kubeflow 1.4.1 버전 구축하기

노하람·2022년 1월 17일
0

오늘은 온프레미스 우분투 서버에서 Minikube를 이용해서 kubeflow를 구축해보겠습니다!

install Minikube

  1. 리눅스 정보 확인

    • Linux bit : uname -m
      x86-64
  2. 다운로드 정보 받아오기

    • https://minikube.sigs.k8s.io/docs/start/
    • cd Desktop \ mkdir minikube \ cd minikube
    • curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    • sudo install minikube-linux-amd64 /usr/local/bin/minikube

  3. minikube start에서 사용할 도커 정보 확인하기

    • MAC OS에서는 Hyperkit을 이용했습니다.
      - HyperKit 은 경량 가상 머신 및 컨테이너 배포에 최적화된 macOS 하이퍼바이저용 오픈 소스 하이퍼바이저입니다.
    • Ubuntu에서는 Hyperkit을 이용할 수 없으니 도커를 이용해봅시다.
      - 도커 드라이브로 Linux에서 실행할 때 하이퍼바이저가 필요하지 않음.
      • 도커 버전이 18.09 이상이여야 하며, docker info --format '{{.OSType}}'으로 도커 포맷이 linux인지 확인합니다.
    • sudo su
    • docker version
    • docker info --format '{{.OSType}}'
  4. 가용 메모리 정보 확인

    • top : 사용가능한 Mem = 63169612
  5. 가용 CPU 정보 확인

    • 일반적인 경우 하이퍼스레딩에 의해, OS에서 코어 수가 실제 수의 2배로 인식됩니다. 따라서 40개의 가상코어 개수가 감지되었다면, 1core(물리코어) 당 2thread(가상코어)이므로 물리적으로 20코어가 있다고 생각하면 됩니다.
    • 1) CPU 당 물리코어 수 확인(20) : grep 'cpu cores' /proc/cpuinfo | tail -1
    • 2) CPU 코어 전체 개수(40) : grep ^processor /proc/cpuinfo | wc -l
    • 3) 물리적인 CPU 개수 확인(1) : grep "physical id" /proc/cpuinfo | sort -u | wc -l

minikube start! and solve docker issue

  1. minikube로 가상머신 구축
    • 서버 리소스가 충분하기 때문에 4개의 다중 노드로 구성하겠습니다!(1개의 컨트롤 플레인 + 3개의 워커 노드)
    • minikube start --driver=docker --kubernetes-version=1.20.11 --memory=24576 —cpus=6 --nodes 4 --disk-size=100g --profile mk
    • alias k=kubectl \ alias m=minikube
    • sudo snap alias kubectl k sudo snap alias minikube m
    • m profile mk : 기본 프로필이 mk로 사용되도록 설정
    • 다양한 기본 설정 확인은 이전 포스팅을 참고하셔도 좋겠습니다.
  2. 노드 구성 확인
    • m node list

install kustomize

  • 3.2 버전을 설치합니다. 4.x 버전은 호환성에 문제가 있습니다.
  • 이전 포스팅에서는 darwin(mac용) 버전을 설치했지만 지금은 linux 버전임에 유의하세요.

https://github.com/kubernetes-sigs/kustomize/releases/tag/v3.2.0

$ curl --silent --location --remote-name \
"https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.2.3/kustomize_kustomize.v3.2.3_linux_amd64" && \
chmod a+x kustomize_kustomize.v3.2.3_linux_amd64 && \
sudo mv kustomize_kustomize.v3.2.3_linux_amd64 /usr/local/bin/kustomize
$ kustomize version
![](https://velog.velcdn.com/images%2Fmoey920%2Fpost%2F45ded7cb-d4b2-49c1-9fe4-5340046807be%2Fimage.png)

install kubeflow

$ cd Desktop/minikube
$ 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

  • 설치 후 모든 pod이 성공적으로 running 되려면 2~30분 이상의 시간이 소요될 수도 있습니다. 아무리 기다려도 pending 상태 등이 지속된다면, 컴퓨터의 리소스가(memory 등) 부족하지 않는지 검토해주세요. 관련 내용은 이전 포스팅에 있습니다.

install Lens

  • Lens는 쿠버네티스 리소스 모니터링 및 관리용 GUI 툴입니다.
  • sudo snap install kontena-lens --classic

Kubeflow UI

  1. 서비스 리스트에서 http2/80의 URL를 찾아서 접속해주시면 됩니다!
    • minikube profile mk
    • alias m=minikube \ m service list

이슈

  • "docker" 드라이버는 root 권한으로 실행되면 안 됩니다
    - root 계정에서 docker 드라이버가 실행되면 안되는 이유 : Docker를 사용하면 Docker 호스트와 게스트 컨테이너 간에 디렉터리를 공유할 수 있습니다. 컨테이너의 액세스 권한을 제한하지 않고 그렇게 할 수 있습니다. 이것은 /host 디렉토리가 호스트의 / 디렉토리인 컨테이너를 시작할 수 있음을 의미합니다. 컨테이너는 제한 없이 호스트 파일 시스템을 변경할 수 있습니다.
    - sudo su를 통해 root 계정으로 접속했던 것을 일반 계정으로 되돌리기 : su - <계정명>

  • WARNING: Error loading config file: /home/sysadmin/.docker/config.json: open /home/sysadmin/.docker/config.json: permission denied
    - root 계정 밖에서 minikube start를 하니 도커 config file을 읽어오는데 권한 문제가 있었고, 권장으로 도커 그룹에 유저를 생성하라고 합니다.

  • 해결방법
    1) docker 그룹을 만듭니다. : sudo groupadd docker
    2) docker그룹에 사용자를 추가합니다 : sudo usermod -aG docker $USER ($USER는 변경하지 않습니다)
    3) linux에서는 다음 명령을 활성화하여 그룹에 대한 변경사항을 적용합니다.(다른 OS에서는 로그아웃 후 재 로그인 후 변경사항 적용을 확인합니다.) : newgrp docker
    4) sudo 없이 docker 명령을 실행할 수 있는지 확인하십시오 : docker run hello-world
    5) 위의 사항을 적용하기 전에 sudo 명령을 사용하여 docker 명령을 수행한 적이 있다면 permission dinied 오류가 있을겁니다. 아래와 같이 두 가지 방법으로 해결합니다.

  • ~/.docker/ 디렉토리를 제거합니다.(저는 간단하게 이 방법을 사용했습니다. sudo rm -rf ~/.docker/

  • 디렉터리의 소유권과 권한을 변경합니다(linux 에서만 사용). sudo chown "$USER":"$USER" /home/"$USER"/.docker -R \ sudo chmod g+rwx "$HOME/.docker" -R

    6) 이제 다시 minikube start를 적용해봅시다!

이슈2 : 도커 드라이브를 사용하니 정상적으로 올라오지 않는 pod 존재, service에 접근할 때 권한 문제

KVM2 드라이버 설정하기

  • 자세한 내용은 링크를 참고하세요!
  • 일부 pod이 죽어있거나, 서비스(kubeflow ui)에 접근 권한이 없는 오류를 해결하고자 사용해봤으나 효과는 없었습니다.
  1. egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
    • yes라는 echo가 나와야함. no라고 나오면 도커나 --vm-driver=None을 사용한다. None은 베어메탈을 이용한다.
  2. sudo apt install cpu-checker
  3. kvm-ok
    • 가상 머신을 계속 실행할 수 있지만 KVM 확장이 없으면 훨씬 느립니다.
  4. egrep -c ' lm ' /proc/cpuinfo
    • 0이 인쇄되면 64비트가 아닙니다. 1 이상이 인쇄되어야합니다. 64비트 커널을 실행하는 것이 권장되지만 필수는 아닙니다. 하지만 위를 포함하여 적절한 환경이 아니라고 생각되면 그냥 도커나 None을 이용합시다.
  5. sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
    • ubuntu 10.04 이상 ~18.10 이전의 경우 위와 같이 입력합니다.
    • 그 이상(18.10 이상)은 다음 명령을 실행합니다. sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
  6. 그룹과 유저를 추가합니다.
    • 완료 후 로그아웃 후 재로그인해야 합니다.
    • sudo adduser 'id -un' libvirt
    • sudo adduser 'id -un' kvm
  7. 설치검증
    • virsh list --all
    sysadmin@tyan:~$ sudo ls -la /var/run/libvirt/libvirt-sock
    srwxrwx--- 1 root libvirt 0  1월 17 14:38 /var/run/libvirt/libvirt-sock
    sysadmin@tyan:~$ ls -l /dev/kvm
    crw-rw---- 1 root kvm 10, 232  1월 17 14:38 /dev/kvm
    • sudo chown root:libvirt /dev/kvm
    • rmmod kvm
    • modprobe -a kvm
    • virt-host-validate : all PASS가 나오면 문제없이 사용하실 수 있습니다. 그룹에 쓰기 권한이 없다는 오류가 나오시는 분은 위 과정을 진행하고 로그아웃 후 재로그인이 되었는지 확인해보세요!
  8. 이제 드라이버를 변경하고 미니쿠버 쿠버네티스를 시작해봅시다~!!
    • minikube start --driver=kvm2 --kubernetes-version=1.20.11 --memory=20000 —cpus=2 --nodes 4 --disk-size=80g --profile mk
    • kvm 오류가 발생했었지만, 서버 자체를 껐다가 다시 켜니(아마 변경한 설정들이 적용되었을 겁니다) 정상적으로 동작합니다!

추가시도

  • minikube start --driver=docker --kubernetes-version=1.20.11 --memory=40000 —cpus=max --disk-size=100g --profile mk
  • 리소스 추가 할당 : minikube start --driver=docker --kubernetes-version=1.20.11 --memory=60000 —cpus=max --disk-size=200g --profile mk
  • 다중노드 구성 : minikube start --driver=docker --kubernetes-version=1.20.11 --memory=60000 —cpus=max --nodes 2 --disk-size=200g --profile mk
  • 보안 포기, 외부 접속 허용(실패, 사용하지 마세요) : minikube start --driver=docker --kubernetes-version=1.20.11 --memory=60000 —cpus=max --nodes 2 --listen-address=0.0.0.0 --disk-size=200g --profile mk
    - 경고가 뜹니다. * minikube is not meant for production use. You are opening non-local traffic ! Listening to 0.0.0.0. This is not recommended and can cause a security vulnerability. Use at your own risk : 미니쿠버는 프로덕션용이 아닙니다. 로컬 트래픽이 아닌 것을 허용했습니다.
  • 재시도 : minikube start --driver=docker --kubernetes-version=1.20.11 --memory=60000 —cpus=max --nodes 2 --listen-address=0.0.0.0 --disk-size=200g --profile miku

프로덕션에 부적합

미니쿠버 환경에서 프로덕션을 시도해봤지만 작동하지 않습니다.

프로덕션 시도 과정

  • Metallb 설치 및 IP 설정
    - minikube addons enable metallb
    • minikube addons configure metallb : 192.168.49.2-192.168.49.100
  • kubeflow 설치 후 로드밸런서로 istio-ingressgateway 서비스 생성
    - 생성되어 있는 서비스를 patch 하였습니다.
    • kubectl patch service -n istio-system istio-ingressgateway -p '{"spec": {"type": "LoadBalancer"}}'
  • 노드 IP 확인 : minikube ip
  • 로드밸런서 활성
    - minikube tunnel -c
  • 서비스 접속 주소 확인
    - minikube service istio-ingressgateway -n istio-system

실패한 것

  • minikube driver 변경 : docker, kvm2
  • minikube start 시 listen-address 설정 : minikube start --listen-address=0.0.0.0
    - 보안에 취약하니까 모든 접속을 예상할 수 없는 환경에서는 사용하지 마세요.
  • 프록시 설정
    - kubectl proxy --address='0.0.0.0' --disable-filter=true
    • 설정 후 8001 포트가 열리는데 위에서 얻은 external-ip와 조합
    • curl http://<external-ip>:8001
      • 대시보드 접근 관련해서는 뒤에 /api/v1... 같은 주소가 쭉 붙는데 여러개 시도해봤지만 하나도 작동하지 않음(물론 대시보드 관련 설정을 모두 하고 작동도 확인했습니다. 외부에서 접속이 안될 뿐입니다.)
  • 다중 노드 설정 : 이 부분은 상관이 없습니다.
  • Mac에서 Minikube, kubeflow 구축 후 위 과정을 똑같이 해서 반대로 ubuntu에서 접속해보기(실패)
  • 그래서 저는.. 어차피 실무를 하기 위해선 프로덕션 환경을 구축할 줄 알아야하기 때문에 kubeadm을 이용해서 온프레미스 환경에 쿠버네티스를 구축해보기로 했습니다. 다음 포스팅도 함께 하시죠!

aws routeR3 + port 확인, 열기

  1. 리눅스에 미니큐브 설치, metallb 애드온 활성화

    • minikube start --driver=docker --kubernetes-version=1.20.11 --memory=60000 —cpus=max --nodes 2 --listen-address=0.0.0.0 --disk-size=200g --profile miku
    • m profile miku
    • m addons enable metallb
    • minikube addons configure metallb : 192.168.49.2-192.168.49.100
  2. 쿠브플로 설치, external-ip 확인

$ 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
$ k get svc -n istio-system

  • istio-ingressgateway service가 nodeport이고, 현재 클러스터 내부(ssh접속)에서만 접근할 수 있는 상황
  • 이를 1차적으로 loadbalancer를 이용해서 클러스터 외부(리눅스 서버)로 노출한다!(리눅스 서버에서 진행)
    - kubectl patch service -n istio-system istio-ingressgateway -p '{"spec": {"type": "LoadBalancer"}}'
  • External-ip가 잘 설정되었는지, 리눅스 서버에서 접근할 수 있는지 확인해보자.(192.168.49.2)
    - k get svc -n istio-system istio-ingressgateway
  1. minikube tunnel -c 로 터널링 활성화

    • 앞서 클러스터 내부에서 리눅스 서버(클러스터 외부)까지 꺼내온 서비스를, 이제 완전 외부 ip에서 접근할 수 있게 노출시켜야한다.
    • (리눅스 서버에서) minikube tunnel -c : 터널링 활성화
  2. aws routeR3에 도메인 등록

    • 이 과정은 이전에 aws에 kubeflow 구축하기 포스팅에서 진행하였습니다. 자세한 내용은 이전 포스팅을 참고해주세요!
    • aws에서 값/트래픽 라우팅 대상에 앞서 획득한 external-ip를 넣어보자.
    • 이렇게 하면 로컬 서버에서는 해당 도메인을 통해 접근할 수 있습니다. 하지만 앞으로 사용할 ssh를 이용한 접속은 ip와 포트를 활용해 포워딩을 통해 접근해서 이런 방식으로 도메인을 이용할 수 없습니다ㅠ

내 서버 정보

추후 그림으로 알아보기 쉽게 정리할 예정입니다.

  • 리눅스(우분투 18.04) 서버 : (enpls0f1) 192.168.0.8/24
  • (docker VM) 컨트롤 플레인 : 10.244.0.1/32
  • (docker VM) 워커 노드1 : 10.244.1.1/32
profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글