kubernetes & kubeflow 설치 (feat. GCP)

이동욱·2021년 12월 6일
0

Intro

  • k8s & kubeflow는 설치부터 어렵습니다.
  • 설치에 낭비되는 시간을 줄여 더 나은 고민을 하시면 좋겠습니다.
  • GCP환경에서 진행합니다.
    (무료 300달러로 많은 양을 사용할 수 있으니 걱정마시고 진행하셔도 됩니다!)

setup

google compute engine 아래와 같이 2개 생성합니다.

  • e2-standard-2 인스턴스를 선택합니다.
  • 부팅디스크를 위와같이 변경합니다.

ssh 접속


ssh 접속하는 방법은 좋은 글이 많습니다.
링크 를 참고하여 생성한 인스턴스 두개 모두에 접속합니다.

command

  • 노드를 따로 명시하지 않은경우 두 인스턴스 모두에 커맨드를 실행합니다.

swapoff -a : kubelet 작동에 문제가 생길수 있다고 합니다. swap 기능을 disable 시키도록 합니다.

docker 설치

sudo apt-get update
sudo apt-get install -y docker docker.io apt-transport-https ca-certificates curl openssh-client openssh-server traceroute gnupg-agent software-properties-common python3-pip
sudo vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 위 커맨드를 순서대로 실행하여 docker를 설치합니다.
    사용한 docker 버전은 20.10.7 입니다. 문제가 생긴다면 해당 버전으로 재설치를 권장합니다.

k8s 1.19.3

sudo apt-get update && sudo apt-get -y upgrade
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet=1.19.3-00 kubeadm=1.19.3-00 kubectl=1.19.3-00
  • 위 커맨드를 순서대로 실행하여 k8s를 설치합니다.
  • kubernetes 최신버전의 경우 kubeflow 1.2.0 버전설치시 에러를 만났습니다. (v1beta...~ 에러)

master node

sudo kubeadm init --apiserver-advertise-address <master node internal ip> --pod-network-cidr=10.244.0.0/16

  • --pod-network-cidr 의 경우 뒤에서 flannel을 사용하기때문에 권장값인 10.244.0.0/16 을 사용합니다. calico를 사용할 경우 192.168.0.0/16 를 사용하면 될듯합니다.
  • 해당명령어를 실행하고 나오는 값들 중 아래 것만 master node에서 실행합니다.
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

이후 아래 내용을 이어서 진행합니다.

sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
  • 위 명령어를 실행한 후에 spec.containers.command에 아래 정보를 추가해줍니다.
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
- --service-account-issuer=kubernetes.default.svc
- --feature-gates=TokenRequest=true
- --feature-gates=TokenRequestProjection=true

worker node

  • master node에서 kubeadm을 실행하고 나온 아래와 같은 값을 worker node에서 실행해줍니다.
sudo kubeadm join <~~> --token <~~> --discovery-token-ca-cert-hash sha256: <~~>

master node

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sudo systemctl restart kubelet
  • 완료 후 조금 기다렸다가 kubectl get nodes 를 입력하여 node가 Ready인지 확인합니다.

테스트

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

kubectl get pods -o wide 하면 ip 가 나오는데 워커노드에서

curl http://<ip>:8080 하면 k8s가 잘 설치되었는지 테스트 가능합니다.

  • 이제 worker node에서의 작업은 끝났습니다. 아래 부터는 master node에서 계속 진행하시면 됩니다.

kubeflow

kfctl 1.2.0 설치

wget https://github.com/kubeflow/kfctl/releases/download/v1.2.0/kfctl_v1.2.0-0-gbc038f9_linux.tar.gz
tar -xvf kfctl_v1.2.0-0-gbc038f9_linux.tar.gz
sudo mv kfctl /usr/local/bin/

prepare env

export BASE_DIR=/opt/
export KF_NAME=choonsik
export KF_DIR=${BASE_DIR}/${KF_NAME}
export CONFIG_URI="https://raw.githubusercontent.com/kubeflow/manifests/v1.0-branch/kfdef/kfctl_k8s_istio.v1.0.0.yaml"
  • kfctl istio 1.0.0 버전 yaml을 준비합니다.
  • 여기서 kfctl istio 1.2.0 버전을 했을때 작동은 했지만 현재 인스턴스 스펙으로는 cpu insufficient로 pending인 deployment가 많습니다.

create empty dir

mkdir $HOME/kf_installation_temp && cd $HOME/kf_installation_temp
kfctl apply -V -f $CONFIG_URI
  • 여기까지 따라 진행되었다면 3-5분정도 대기합니다.
Encountered error applying application cert-manager:
(kubeflow.error): Code 500 with message: Apply.Run : 
error when creating "/tmp/kout144772096": Internal error 
occurred: failed calling webhook "[webhook.cert-
manager.io](http://webhook.cert-manager.io/)": the server 
is currently unable to handle the request 
filename="kustomize/kustomize.go:284"

위와 비슷한 에러가 몇번 뜨다가 설치가 완료됩니다.

  • 이제 접속은 가능합니다. 하지만
    Failed to open db connection: DB open failed: Timeout waiting for DB conn successfully opened.
    kubeflow pipeline no healthy upstream
    kubeflow unable to contact profile controller
  • 위와 같은 Warning이 뜨기때문에 kubernetes pv를 설정해주어야 합니다.

kubeflow pv설정

kubectl get pvc -n kubeflow

kubectl edit pvc katib-mysql -n kubeflow

  • 위와 같이 pvc를 살펴보면 전부 Pending상태입니다.
  • 따라서 pvc에 맞게 pv를 생성해주고 기다리면 binding된 후에 위에서 볼 수 있었던 warning message들이 사라집니다.

pv 예시

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/pv1
  • 이런식으로 10Gi, 10Gi, 20Gi, 20Gi 총 4개를 생성해줍니다.
  • 여기서 hostPath를 사용하려면 존재하는 경로여야합니다.

katib-mysql 관련 에러

kubelet  Readiness probe failed: mysql: [Warning] Using a
password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 
'root'@'localhost' (using password: YES)
  • 위와 같은 에러메시지가 보이면서 katib-mysql 이 계속 안뜨는경우 katib-mysql pod 안에서 아래 코드를 실행합니다.
mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; RENAME USER 'root'@'localhost' to 'root'@'%'; create database if not exists katib;"

위 코드 같은 경우 password를 기존에 k8s secrets에 있는것으로 바꾸고 host를 percent symbol로 넣어서 접속을 다 허용해버렸지만 실 서비스라면 host를 허용할 때 '192.168.0.%' 이런식으로 잘 허용하는 것이 중요할 것 같습니다.

결과

  • spark~~ 와 tensorboard 관련한 pod이 제대로 뜨지않았는데 logs를 찍어보면 naming문제와 cpu insufficient문제로 생각됩니다.
  • 당장 사용하지 않을 것이기 때문에 설치를 마칩니다.

outro

  • 추가적으로 안되시는게 있다면 댓글 남겨주시면 확인하는대로 포스팅을 해보겠습니다!!
  • 글 마치는게 어색해서 귀여운 춘식이로 마무리합니다.
profile
공부해서 남주자

0개의 댓글