개발놀이터

쿠버네티스 실습 : 환경 구축 (feat. EC2) 본문

배포/kubernetes

쿠버네티스 실습 : 환경 구축 (feat. EC2)

마늘냄새폴폴 2024. 9. 15. 01:15

지금 kubectl 명령어를 이용해서 실습을 하고있는데 minikube로 쿠버네티스를 간단하게 설치하고 몇번 만져봤습니다. 

 

현재 진행정도는 MySQL을 배포하고 DBeaver로 붙어보는것, Spring Boot를 배포하고 API로 접근해보는 것 까지입니다. 

 

왜 진행상황을 언급했냐면 이 과정이 순탄하지 않았기 때문인데 무엇보다 minikube라는 것이 쿠버네티스 클러스터 환경을 한 컴퓨터에 로컬에 컨테이너 형태로 구축해주는 것입니다. 

 

즉, 쿠버네티스는 마스터 노드와 워커 노드로 구분할 수 있는데 이 노드들은 사실 원래 각각 물리적으로 분리된 컴퓨터여야합니다. AWS로 치면 각각 다른 EC2인스턴스여야 한다는 것입니다. 

 

하지만 minikube는 이 노드들 (컴퓨터)을 한 컴퓨터에 컨테이너 형식으로 추상화해놓아서 쿠버네티스를 연습하기엔 정말 좋지만 실전에서 사용한다거나 하는 것은 어느정도 제한이 됩니다. 

 

예를 들어서 Spring Boot를 배포하고 외부에서 붙게하려면 External IP를 받을 수 있게 Ingress Controller (Nginx)를 만들어줘야 하는데 Ingress를 만들고 연결했는데 External IP가 안보여서 왜인가 하고 찾아보니 minikube는 로컬환경이라 External IP가 안만들어진다는 것이었습니다. 

 

쓰읍...

 

물론 공부가 목적이라면 그냥 그렇구나 하고 넘어가면 되지만 실제로 동작하는걸 두 눈으로 봐야 직성이 풀리는 저로서는 굉장히 불만족스러웠습니다. 

 

해결책은?

우선 첫번째로 Virtual Box같은 프로그램으로 컴퓨터에 리눅스 환경을 설치해서 그곳에 쿠버네티스 클러스터를 구축하는 것입니다. 

 

두번째로 EC2를 만들어서 인스턴스로 쿠버네티스 클러스터를 구축하는 것입니다. 

 

첫번째는 제가 맥북으로 공부하고 있어서 실패했습니다. 맥은 Virtual Box를 지원하긴 하지만 테스트 버전만 지원해서 굉장히 안좋다고 맥은 Virtual Box를 사용하지 않는 것을 권장하더군요. 

 

그래서 VMWare같은 가상화 서비스를 찾아봤는데 이건 여러개를 어떻게 띄우는지 몰라서 이것도 패스했습니다. 

 

결국 AWS EC2 인스턴스에 쿠버네티스를 직접 설치하자는 결론에 이르렀고 수시간의 삽질끝에 클러스터를 만드는 것 까지는 성공했습니다. 이제 이 포스팅 이후부터 제가 원했던 Ingress Controller를 이용해서 스프링 부트 애플리케이션을 외부에서 붙어보도록 하겠습니다. 

 

쿠버네티스 환경 구축

일단 쿠버네티스 환경 구축에 앞서... 

 

왜 선배 개발자분들이 쿠버네티스는 환경 구축부터 진입장벽이라고 말했는지 알 것 같았습니다. 

 

뭔놈에 설치하는게 이렇게 그지같은지 참... 

 

일단 시작 전에 EC2 인스턴스 세대를 준비해야합니다. 한대는 마스터 노드로, 두대는 워커 노드로 활용될 예정입니다. 참고로 EC2인스턴스는 t2가 디폴트지만 t3a가 일반적인 t2보다 저렴하니 그것을 선택하는 것이 좋습니다. 

 

또한 t3a.medium (2Core, 4GB) 정도는 되어야 도커가 렉 없이 돌아가기 때문에 이정도 인스턴스를 준비하시는 것을 추천드립니다. 

 

본격적으로 환경을 구축해보겠습니다. 

 

쿠버네티스 환경 구축 전 사전 지식

쿠버네티스를 위해서는 인스턴스에 아래의 프로그램이 설치되어야합니다. 

  1. 컨테이너 런타임 (containerd, docker)
  2. 쿠버네티스 (kubelet, kubeadm, kubectl)
  3. Calico

본격적으로 시작해보죠. 

 

저는 우분투에서 시작했습니다. 

 

도커설치

1. 우분투 패키지 업데이트

sudo apt-get update

 

2. 패키지 설치

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 

3. 도커의 공식 GPG키 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

4. 도커의 공식 apt 저장소를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

5. 시스템 패키지 업데이트

sudo apt-get update

 

6. 도커설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

 

7. 도커 설치 확인

sudo systemctl status docker

 

kubelet, kubeadm, kubectl 설치 (모든 노드에 설치해야합니다.)

1. 메모리 스왑 끄기

sudo swapoff -a

 

2. etcd 설치

sudo apt-get update && sudo apt-get install -y apt-transport-https curl etcd

 

3. 패키지 다운로드

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

 

4. GPG키 추가

sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

 

5. 패키지 업데이트

sudo apt-get update

 

6. kubelet, kubeadm, kubectl 설치

sudo apt-get install -y kubelet kubeadm kubectl

 

7. apt-mark 홀드

sudo apt-mark hold kubelet kubeadm kubectl

 

8. 설치 잘 됐는지 확인

kubectl version --client && kubeadm version

 

9. containerd 설치

sudo apt-get install -y containerd

sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

 

10. containerd 설정 변경

sudo vi /etc/containerd/config.toml

 

이 파일을 열고 들어가면 이 부분을 찾아서 바꿔주시면 됩니다. 

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = false

false를 true로

 

11. socat 설치

sudo apt-get install -y socat

sudo systemctl restart socat

sudo systemctl enable socat

 

12. 메모리 스왑 및 추가 설정

sudo swapoff -a

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

sudo modprobe br_netfilter

echo 'br_netfilter' | sudo tee /etc/modules-load.d/k8s.conf

sudo tee /etc/sysctl.d/k8s.conf<<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

마스터 노드 초기화 (마스터 노드에만 해주세요!)

1. 패키지 업데이트

sudo apt-get update

 

2. etcd 종료

sudo systemctl stop etcd

sudo systemctl disable etcd

 

이 작업을 해야하는 이유가 etcd는 깔려있어야하지만 마스터 노드를 초기화할 때 etcd를 자동으로 세팅해주기 때문입니다. 

 

3. 포트확인

sudo lsof -i :2379

sudo lsof -i :2380

 

이 두개 포트가 없으면 정상적으로 완료된 것입니다. 만약 있다면 kill -9 {PID} 이 명령어를 이용해서 프로세스를 죽여주세요. 

 

4. 노드 초기화

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

 

5. 방화벽 제거

sudo ufw disable

 

6. 설정 파일 세팅

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

7. calico 설치

kubectl apply -f [calico](https://docs.projectcalico.org/manifests/calico.yaml)

 

8. 설정 추가

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

sudo modprobe br_netfilter

sudo sysctl --system

 

9. 토큰 생성

kubeadm token create --print-join-command

 

이렇게 명령어를 치면 아래와 같은 결과물이 출력됩니다. 

kubeadm join {마스터노드의 private IP}:6443 --token {TOKEN} --discovery-token-ca-cert-hash sha256:{HASH VALUE}

 

이제 이 명령어를 그대로 복사해서 워커 노드에다 실행시키면? 

 

끝!

 

이제 마스터 노드에서 kubectl get nodes 로 확인해보시면 됩니다. 

 

이때 모든 보안그룹의 인바운드 규칙에 6443 포트를 열어줘야합니다. 

 

 

마치며

진짜 쿠버네티스는 미친놈이 아닌가 싶을정도로 세팅하는게 정말 힘들었습니다. 하지만 지금 안되어있는게 kube-proxy가 설치가 안되어있는데 calico가 설치되어있어서 괜찮으려나? 싶기도 합니다. 

 

다음 포스팅에선 MySQL 배포해보고 DBeaver 연결하고 Spring Boot까지 배포해보겠습니다. 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요!