배우기

Kubernetes Cluster(VirtualBox) 만들기

yoooni6 2022. 1. 25. 16:26

기록이유

  • Kubernetes는 '19년에 4일짜리 교육을 들으면서 기본 개념을 학습했었음
  • 사내에서는 UI와 CI/CD가 엮인 플랫폼으로 제공되기 때문에 Kubernetes 사용 감각을 쌓는데 부족함을 느낌
  • 사내 환경 및 정책 때문에 실제 Node를 연결해서 사용하는 것이 제한되어 VirtualBox 선택
  • Helm Chart 기반의 어플리케이션들을 연결해서 원하는 기능을 가진 나만의 작은 클러스터 운영 연습을 계획
  • 허락한다면 Hadoop 및 Eco, Spark, Kubeflow, Airflow, BentoML, MLflow, Jenkins 등 사용해 볼 생각임  

Kubernetes(k8s) 란?

  • Container Orchestration Tool 이라고 한마디로 정의됨
  • 보통 Cloud Native Application을 말할 때 k8s를 떠올리고, MSA를 말할 때 k8s를 떠올림
  • POD, Replicaset, Deployment, Service 등 기본 개념들을 가지고 MSA 기반 Ops를 지원하고, Container 기반의 Dev와 합쳐져서 Cloud와 함께 DevOps의 큰 축으로 자리잡고 있는 느낌
  • Data Scientist 로서 소규모 스타트업에 있지 않는 한 직접 운영해볼 일이 없겠지만 어떻게 돌아가는지는 알아야 다양한 직무의 사람들과 협업이 가능함
  • 요즘은 Docker 또는 k8s, Helm 기반으로 Application을 공개하고 있기 때문에 모르면 손해, 알면 본전 느낌
  • 처음 k8s를 학습하는 사람은 Application 개발과 Network에 대한 기초 지식이 있으면 이해하기 좋음
  • '19년에 강사님 왈 "Docker는 리눅스를 알면 반 이상 아는 것이고, Kubernetes는 Docker를 알면 반 이상 아는 것이다"

VirtualBox 내 VM 준비하기

  • VM 4대 : Master 1, Node 2, Client 1
    • Ubuntu 20.04, CPU 2, RAM 4GB 할당(회사 windows PC가 고성능이라 넉넉하게 할당함)
    • Master나 Node에 바로 접속해서 kubectl 명령어들을 사용하는 경우가 없다고 가정하여 클라이언트를 따로 둠
    • 조금 검색해봤을 때 VirtualBox의 VM에서 딥러닝용 GPU를 사용하는 방법이 보이지 않아서 GPU는 고려하지 않을 예정
  • Network : 어댑터 1은 NAT, 어댑터 2는 Host Only Adapter 로 설정하고 192.168.56.0/24 네트워크를 수동으로 설정
  • Install GuestAddition : 클립보드, 마우스 등 보조 기능들 사용 원활
  • Disable SWAP
    sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    sudo swapoff -a​
  • /etc/hosts 수정
    master 기준
    
    # 127.0.1.1    master   <- 주석 처리
    
    192.168.56.2  master
    192.168.56.3  node1
    192.168.56.4  node2​

 

Kubernetes Node 준비하기

  • Port-Forwarding을 대비하여 socat 패키지 설치
    sudo apt-get update
    sudo apt-get install -y socat​
  • Docker 설치(k8s 와의 호환을 위해 버전에 신경써야함)
    # install packages and download gpg key
    sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release vim openssh-server
    
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # check if specific version of docker exists
    sudo apt-get update && apt-cache madison docker-ce
    apt-cache madison docker-ce | grep 5:20.10.11~3-0~ubuntu-focal
    
    # output 
    => docker-ce | 5:20.10.11~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
    
    # install Docker 5.20.10.11~3-0-ubuntu-focal
    sudo apt-get install -y containerd.io docker-ce=5:20.10.11~3-0~ubuntu-focal docker-ce-cli=5:20.10.11~3-0~ubuntu-focal
    
    # add $USER to docker group
    sudo groupadd docker
    sudo usermod -aG docker $USER
    newgrp docker
  • 네트워크 설정 수정
    sudo modprobe br_netfilter
    
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF
    
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sudo sysctl --system​
  • kubelet, kubeadm, kubectl 설치하기(Docker와의 호환성을 위해 버전 신경써야함)
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl &&
    
    sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg &&
    
    echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list &&
    sudo apt-get update
    sudo apt-get install -y kubelet=1.21.7-00 kubeadm=1.21.7-00 kubectl=1.21.7-00 &&
    sudo apt-mark hold kubelet kubeadm kubectl​
  • Power off
  • VM node1, node2 복제 : 네트워크 주소 새로 할당해야하고 각 node의 hostname, IP address 등 변경한 뒤 네트워크 정상 작동 확인해야함

 

Kubernetes Cluster 설치/연결하기

Master에서 실행

  • kubeadm으로 init하기 / cni로 flannel 사용하기 위해 네트워크 대역 설정
    kubeadm config images list
    kubeadm config images pull
    
    sudo kubeadm init --apiserver-advertise-address=192.168.56.2 \
    				--pod-network-cidr=10.244.0.0/16

    • kubeadm init의 결과로 출력되는 아래 내용을 복사 후 저장해둠(나중에 node 1/2에 입력해야함)
      kubeadm join 192.168.56.2:6443 --token ~~~~~ --discovery-token-ca-cert-hash ~~~~~​
       
  • kube config 정보를 Home 디렉토리로 복사(kubectl 명령 사용하려면 필수)
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config​
  • flannel 설치하기 : VirtualBox로 네트워크를 잡을 때 어댑터1이 NAT인 관계로 아래 박스에 보이는 "--iface=enp0s8" 추가 후 적용
     wget https://raw.githubusercontent.com/flannel-io/flannel/v0.13.0/Documentation/kube-flannel.yml
     
     vim kube-flannel.yml
     
     # In the middle of kube-flannel.yml
     command: 
     	- opt/bin/flanneld
        - --ip-masq
        - --kube-subset-mgr
        - --iface=enp0s8      # add
     
     kubectl apply -f kube-flannel.yml
  •  kubectl get nodes -o wide 명령을 통해 클러스터에 join 된 노드를 확인
    • VM인 경우 INTERNAL-IP에 NAT IP Address나 기타 다른 address가 적혀있지 않은지 꼭 확인할 것

Node 1, 2에서 실행

  • 위에서 따로 저장해뒀던 kubeadm join 명령 실행
    kubeadm join 192.168.56.2:6443 --token ~~~~~ --discovery-token-ca-cert-hash ~~~~~​
  • token은 유효기간(23 h 정도)이 있으니 한참 뒤에 kubeadm join을 할 경우 kubeadm token create 로 토큰을 새로 생성해서 사용하면 됨

Client Node 내 필요 패키지 설치하기

  • kubectl 1.21.7 버전 다운로드 후 폴더의 위치와 권한을 변경
    curl -LO https://dl.k8s.io/release/v1.21.7/bin/linux/amd64/kubectl
    
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
  • kube config 파일을 클라이언트 노드로 복사
    mkdir -p $HOME/.kube
    scp -p {CLUSTER_USER_ID}@{CLUSTER_IP}:~/.kube/config ~/.kube/config​

 

Kubernetes Cluster(on VirtualBox) 네트워크 구성도(유사 사례)

출처 - 아래 '관련링크 2'

관련링크

1. 모두의 MLOps - https://mlops-for-all.github.io/docs/setup-kubernetes/install-prerequisite/

2. VirtualBox 내 Kubernetes Cluster 네트워크 구성도 - https://www.itwonderlab.com/en/nodeport-kubernetes-cluster/