[쿠버네티스] docker 이미지 빌드 부터 helm 배포까지 [1부]
현재 메인으로 맡고 있는 서비스의 인프라는 쿠버네티스를 사용하고 있습니다.
다만 devOps팀, 저희 팀장님께서 거의 인프라 구성을 다 해주셔서 저는 잘 모르고 있는 상태라 어느 정도 스터디의 필요성을 느끼게 되어 로컬에 minikube 클러스터를 설치하여 실습을 하기로 했습니다ㅎㅎ
what is minikube?
minikube quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows. We proudly focus on helping application developers and new Kubernetes users.
미니쿠베는 말그대로 작은 쿠버네티스? 쿠버네티스를 로컬에서 테스트 할 수 있도록 만든 가벼운 쿠버네티스 정도로만 알면 될 것 같습니다~ㅎㅎ
주의: 이 글에서는 개인적으로 삽질을 하면서 쿠버네티스에 배포하는 과정을 한번 정리해 본 것이기 때문에 쿠버네티스의 자세한 용어 정리와 설명은 하지 않습니다! (글의 흐름에 따라 중간중간 용어를 찾아보시면서 보시길 바랍니다!)
1. minikube 설치 및 실행
미니쿠베(minikube)는 공식 홈페이지에를 보시면 os환경에 맞게 설치방법이 잘 나와있고, 저는 homebrew로 설치를 진행 했습니다.
미니쿠베 설치 후 minikube start를 실행하면 minikube가 실행됩니다!
저 같은 경우는 쿠버네티스 gui툴로 K9S를 사용하기 때문에 context를 미니쿠베로 설정하여 실행하니 아래와 같이 확인할 수 있었습니다.
설치된 네임스페이스(namespace)들의 리스트를 확인 할 수 있습니다. 네임스페이스는 리소스 별로 그룹을 나누기 위한 개념입니다! 자세한 내용은 공식문서를 확인해보시길 바랍니다!
이왕 하는 김에 배포할 서비스의 네임스페이스를 따로 만들어 보겠습니다! 저는 토이 프로젝트로 진행했던 heymoji를 배포할 것이기 때문에 네임스페이스로 heymoji를 만들어 보겠습니다.
kubectl create namspace <네임스페이스 이름>
네임스페이스가 생성된 걸 확인할 수 있습니다.
그리고 해당 네임스페이스에는 아무런 파드(pod)가 없는 걸 볼 수 있습니다.
연결된 파드가 없습니다. 당연(?)하죠! 방금 네임스페이스를 만들었고 아무것도 배포하지 않았으니 ㅋㅋ
여기까지 했으면 다 한 겁니다(?)
2. 도커 이미지 빌드(build)
자 이제 도커파일을 빌드(build)해 보도록 하겠습니다!
일단은 본인이 배포하려는 서비스에 dockerfile이 있다는 가정하에 진행하겠습니다!
제 프로젝트는 fastapi로 만든 애플리케이션이라 기본적으로 요 이미지를 사용했습니다.
(docker build에 대한 다양한 옵션 및 자세한 내용은 생략하도록 하겠습니다)
도커 이미지를 빌드하기 전에 함께 빌드가 되면 안 되는 파일들은 .dockerignore에 정의합니다. (dockerignore 예시)
여기까지 본인의 프로젝트를 도커 이미지로 빌드하기 전까지의 사전작업입니다!
이제 여기서 선택해야 할 사항은 도커 이미지를 빌드하고 어떤 곳에 푸시(push)할 것인가? 입니다!
도커 이미지를 저장하고 관리할 수 있는 곳을 docker registry라고 합니다.
이미지 저장소가 필요한 이유는 배포할 때마다 docker image를 pull 해야 하기 때문입니다. 하나의 버전만 사용한다면 그냥 로컬에 이미지를 저장해서 사용하면 되겠지만, 버전이 바뀔 때마다 배포하려면 그 이미지가 어딘가에 올라와 있고 그걸 pull 해서 사용해야겠죠?
세 가지 정도 방법이 있는데, 어떤 방법들이 있는지 확인해보고 미니쿠베에 파드를 띄워보겠습니다!
a. 로컬에 docker registry 컨테이너를 띄워서 사용
로컬에 registry를 띄워서 저장소로 사용하는 방법입니다.
docker pull registry
docker run --name local-registry -d -p 5000:5000 registry
b. docker hub(외부) 사용
도커허브에 이미지를 저장합니다. (private 1개 무료 사용 가능)
도커허브에 가입 후 콘솔에서 docker login을 진행하면 빌드한 이미지를 push, pull 할 수 있다.
docker build -t <도커 허브 저장소 이름>/<이미지 이름>:<버전> .
docker push <도커 허브 저장소 이름>/<이미지 이름>:<버전>
c. minikube 내부의 registry 사용
미니쿠베 내부에 registry를 사용할 수 있다고 합니다!
kube-system 이라는 네임스페이스에 registry 관련된 파드가 떠있는데 요거인 것 같습니다.
build, push 과정은 b과정과 비슷한데 미니쿠베에서 몇가지 설정들을 해줘야 하는 것 같습니다...;;
일단 c과정, 미니쿠베 내부 registry에 푸시하는 건 삽질을 너무 많이 하다가 시간관계상 멈췄습니다...ㅠㅠ 이 부분을 따로 실습 후 정리하도록 하겠습니다.
3. kubectl 명령어로 Pod 띄워보기
kubectl은 쿠버네티스 클러스터를 제어하기 위한 커멘드 도구입니다. kubectl로 여러 가지 동작을 할 수 있으며 지금은 파드를 띄워보도록 하겠습니다.
저는 빠른 실습을 위해 미니쿠베 내부에 도커 이미지를 bulid 한 뒤, 이 이미지를 가지고 파드를 띄우겠습니다!
eval $(minikube docker-env)
위 명령어를 사용하면 미니쿠베 driver로 연결됩니다. 명령어 실행 후 docker ps를 실행하면 기존 로컬 docker ps 명령어 실행과 다른 결과를 볼 수 있습니다.
이상태에서 docker image를 build하게 되면 미니쿠베 내부에 이미지가 생성되는 걸 볼 수 있습니다.
이제 이 이미지를 가지고 heymoji 네임스페이스에 pod를 띄워보겠습니다!
kubectl run <pod 이름> --image=<이미지 이름>:<태그> -n <네임스페이스>
3. 마치며
예전부터 쿠버네티스를 스터디하고 싶었는데 막연히 어렵다고만 생각해서 미루다가 이제 시작했습니다 ㅎㅎ 근데 막상 해보니까 제가 새로운 영역에 대한 두려움에 너무 어렵게만 생각했던것 같습니다.
찾아보면 자료도 많고 실제로 해보면 삽질을 많이 해보긴 했지만 로컬환경에서 실습해볼수 있는 내용들이었습니다! 아직은 쿠버네티스에 대해 자세하게 아는것은 아니고 겉핧기식이지만, 조금씩 해보면 어느정도 익숙해질 것 같습니다
이글은 2부로 이어집니다!
참고자료
https://ryu-e.tistory.com/10(정말 상세히 잘 되어있는 글)
https://minikube.sigs.k8s.io/docs/
https://kubernetes.io/ko/docs/tutorials/hello-minikube/
https://breezymind.com/troubleshooting-minikube-share-local-image-on-lima/
https://newbiecs.tistory.com/327