배우기
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 네트워크를 수동으로 설정
- 참조링크 : https://blog.startsomething.dev/2018/10/26/virtualbox-%EC%97%90%EC%84%9C-nat-%EC%99%80-host-only-network-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/
- 어댑터 1과 어댑터 2를 순서를 바꿔서 설정하면 사내 네트워크 정책 때문인지 네트워크가 끊겼다는 메시지가 계속 발생하는데 네트워크에 물음표 표시가 보기 싫어서 순서를 지키는게 좋음
- 192.168.56.2 ~ 5 를 VM 4대에 수동 설정해줌
- 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 ~~~~~
- kubeadm init의 결과로 출력되는 아래 내용을 복사 후 저장해둠(나중에 node 1/2에 입력해야함)
- 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) 네트워크 구성도(유사 사례)
관련링크
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/