주의) 이 글은 쿠버네티스를 정말 모르는 상태에서 하루 공부해보고 작성하는 글입니다. 그렇기 때문에 틀린 내용이 있을 수 있으니 참고하기 바랍니다.
저는 프론트엔드 개발자입니다. 근데 쿠버네티스를 공부하려고 합니다. 왜 그럴까요?
참고 : https://fe-developers.kakaoent.com/2023/230925-bff-trouble-shooting/
참고 : https://blog.mathpresso.com/modern-frontend-infrastructure-overview-99b5a8c669df
"페이지 웹 팀은 만든 건 직접 관리하라는 원칙에 따라 서버 환경이나 인프라 세팅도 직접 관리하고 있습니다. "
저는 저 말이 가슴에 와닿더군요. 프론트엔드도 Nginx, Node(Next.js) 와 같은 서버 환경을 다룰 일이 물론 있습니다. 그에 따른 인프라 세팅도 해야 하고요. 개인적인 프로젝트라면 Next.js 를 그냥 Vercel로 간단하게 띄우면 끝입니다. 하지만 실무에서는 그게 안되죠. 얼마나 많은 사용자들이 접속할까? 과연 어디까지 트래픽을 감당할 수 있을까? 많은 고민을 해야 합니다.
참고 : 카카오엔터프라이즈 카카오페이지 서비스 구성도 (쿠버네티스를 사용한 것을 볼 수 있다)
쿠버네티스를 이용하면 파드(쉽게 말해 컨테이너)를 여러개 띄어서 관리할 수 있습니다. 그에 따른 부하분산, 롤링 업데이트 등을 지원하고요. 따라서 요즘에 대부분의 회사들이 사용하는 것 같습니다. 그리고 CI/CD를 잘 구축하면 관리가 편해지겠죠?
저는 간단하게 깃허브에서 뭐.. 실습하기 좋은 저장소를 찾아서 한번 해봐야겠다 싶었는데 시작을 못하겠더군요. 쿠버네티스는 진입 장벽이 높은 편입니다. 어려운 편이죠. 그래서 어떻게 시작할지부터 감이 안잡히는거 같습니다. 실습 환경부터 막막 하죠.
책이 있긴한데 눈에 안들어오고... 공식 홈페이지를 보자니 역시 어렵고... 그래서 강의를 지르긴 했는데 덕분에 감은 잡힌 느낌이랄까요? 시간이 아깝거나 쿠버네티스를 처음 시작하는 저 같은 분들은 강의를 보는것을 추천드립니다. 강의를 보고 책을 보고 공식 홈페이지를 보면 여전히 어렵긴 하지만 그래도 눈에 들어오는게 많아졌습니다.
쿠버네티스는 오케스트레이션 도구입니다. 오케스트레이션... 지휘자라는 뜻입니다. 무엇을 지휘(관리)하느냐. 바로 도커 컨테이너를 관리한다고 보면 됩니다.
쿠버네티스 배포 종류에는 관리형, 설치형, 구성형으로 나뉩니다.
아무래도 실무에서는 관리형을 많이 사용할 거 같고... 아니면 온프레미스로 자체 서버에 쿠버네티스를 설치해서 사용할 수도 있습니다. 그렇지만 처음부터 관리형, 설치형을 사용하면 무리가 있기 때문에 공부를 위해서는 먼저 구성형으로 공부를 하는게 좋은 방법이라고 봅니다.
추가적으로 관리형이나 설치형 모두 쿠버네티스 위에 따로 구현된 형태이기 때문에 코어는 비슷하나 조금씩 다른 형태라고 볼 수 있습니다.
실습을 하기 위한 환경을 먼저 만드는게 가장 좋은데... 인프런 강의에서는 윈도우 환경에서 Virtual Box를 사용하고 있습니다. 음... 나는 윈도우 컴퓨터가 없는데... 아 윈도우 (게이밍) 노트북 사고 싶다...
MacOS에서 Virtual Box를 설치 못하는건 아닌거 같지만 뭔가 설치하기 싫습니다. 그래서 다른 방법을 찾아보다가 Minikube가 제일 유명한거 같고 쿠버네티스 공식문서 튜토리얼에서도 Minikube가 있으니 학습을 위해서는 가장 좋은 방법인거 같습니다. 단, 제약사항과 아쉬운 점이 있습니다.
참고 : https://kubernetes.io/ko/docs/tutorials/hello-minikube/
참고 : https://chance-story.tistory.com/44
설치는 뭐... brew install minikube 를 하면 됩니다. 그리고 나서 cluster 를 시작해주면 되는데 도커가 실행중이어야 합니다. "open -a Docker" 를 먼저 실행해줍니다.
~ ❯ minikube start base
😄 Darwin 14.0 (arm64) 의 minikube v1.32.0
✨ 자동적으로 docker 드라이버가 선택되었습니다
📌 Using Docker Desktop driver with root privileges
👍 minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜 베이스 이미지를 다운받는 중 ...
💾 쿠버네티스 v1.28.3 을 다운로드 중 ...
> preloaded-images-k8s-v18-v1...: 341.16 MiB / 341.16 MiB 100.00% 3.31 Mi
> gcr.io/k8s-minikube/kicbase...: 410.58 MiB / 410.58 MiB 100.00% 2.27 Mi
🔥 Creating docker container (CPUs=2, Memory=4000MB) ...
🐳 쿠버네티스 v1.28.3 을 Docker 24.0.7 런타임으로 설치하는 중
▪ 인증서 및 키를 생성하는 중 ...
▪ 컨트롤 플레인이 부팅...
▪ RBAC 규칙을 구성하는 중 ...
🔗 Configuring bridge CNI (Container Networking Interface) ...
🔎 Kubernetes 구성 요소를 확인...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 애드온 활성화 : storage-provisioner, default-storageclass
🏄 끝났습니다! kubectl이 "minikube" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.
시간은 좀 걸리는 편입니다. (대략 3~4분). kubectl 를 통해 쿠버네티스 명령어를 사용할 수 있습니다. 여기서 모든 파드 보기를 했더니 kube-system이라는 네임스페이스안에 쿠버네티스 Control Plane 관련 파드가 기본적으로 있는 것을 확인할 수 있습니다. 대표적으로 etcd, api, proxy, scheduler 등이 있네요. 나중에 다 배울 겁니다.
~ ❯ kubectl get pods -A 4m 12s base ⎈ minikube
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5dd5756b68-7swvt 1/1 Running 0 100s
kube-system etcd-minikube 1/1 Running 0 113s
kube-system kube-apiserver-minikube 1/1 Running 0 113s
kube-system kube-controller-manager-minikube 1/1 Running 0 113s
kube-system kube-proxy-c2swz 1/1 Running 0 100s
kube-system kube-scheduler-minikube 1/1 Running 0 113s
kube-system storage-provisioner 1/1 Running 1 (70s ago) 112s
쿠버네티스에서 모든 리소스는 오브젝트 형태로 관리됩니다. 오브젝트... "추구하는 상태를 기술해 둔 것" 이라고 보면 됩니다. 컨테이너의 집합(Pods), 레플리카셋, 서비스 등이 전부 오브젝트라고 볼 수 있습니다.
먼저 가장 기본이 되는 파드 입니다. 하나의 파드 안에는 하나 이상의 어플리케이션 컨테이너, IP 주소, 볼륨과 같은 공유 스토리지가 들어갈 수 있습니다.
그렇지만 보통은 하나의 파드 = 하나의 컨테이너 형태로 사용하는 것이 일반적입니다. Nginx 파드, Next.js 파드 같은 어플리케이션을 위한 파드를 띄울 수 있겠죠? 그렇지만 파드를 직접 생성하고 사용하는 일은 거의 없습니다. 아래 레플리카 셋, 디플로이먼트를 사용하면 자동으로 생성되기 때문이죠.
보통 파드는 여러개 띄어서 사용하는 것이 일반적입니다. 그러려고 쿠버네티스를 사용하는거니까요? 그래야 가용성도 좋아지고 장애에 대처할 수 있는 거죠. 부하 분산도 되고요.
만약 파드를 3개 띄워놓고 사용하고 싶다면 Replica Set을 이용하면 항상 3개가 되도록 유지해줍니다. 임의로 Pod 한개를 죽이면 레플리카 셋이 자동으로 하나를 만듭니다.
하지만 일반적으로 레플리카 셋을 단독으로 이용하지 않고 그 상위 버전인 디플로이먼트를 이용합니다. 디플로이먼트를 생성하면 그 안에 레플리카 셋도 자동으로 생성됩니다.
그렇다면 디플로이먼트랑 레플리카 셋의 차이는 무엇일까요? 디플로이먼트를 사용하는 핵심적인 이유는 어플리케이션 업데이트와 배포를 더욱 편하게 만들기 위햇입니다. 예를 들어 어플리케이션을 업데이트할 때 레플리카 셋 변경 사항을 저장하는 리비전을 남겨 롤백을 가능하게 해주고, 롤링 업데이트 전략을 지정할 수도 있습니다.
서비스는 포
음... 보통 마스터 노드가 Control Plane이고, 워커 노드가 파드를 가지고 있는 형태입니다.