💻 프로그래밍/K8s & Docker

[쿠버네티스] docker 이미지 빌드 부터 helm 배포까지 [1부]

피트웨어 제이 (FitwareJay) 2022. 5. 16. 00:16

현재 메인으로 맡고 있는 서비스의 인프라는 쿠버네티스를 사용하고 있습니다.

 

다만 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 실행

미니쿠베 설치 후 minikube start를 실행하면 minikube가 실행됩니다!

 

docker ps로 확인해본 minikube 컨테이너

저 같은 경우는 쿠버네티스 gui툴로 K9S를 사용하기 때문에 context를 미니쿠베로 설정하여 실행하니 아래와 같이 확인할 수 있었습니다.

 

미니쿠베 namespace

설치된 네임스페이스(namespace)들의 리스트를 확인 할 수 있습니다. 네임스페이스리소스 별로 그룹을 나누기 위한 개념입니다!  자세한 내용은 공식문서를 확인해보시길 바랍니다!

 

이왕 하는 김에 배포할 서비스의 네임스페이스를 따로 만들어 보겠습니다! 저는 토이 프로젝트로 진행했던 heymoji를 배포할 것이기 때문에 네임스페이스로 heymoji를 만들어 보겠습니다.

kubectl create namspace <네임스페이스 이름>

 

새로 생성된 heymoji 네임스페이스

네임스페이스가 생성된 걸 확인할 수 있습니다.

그리고 해당 네임스페이스에는 아무런 파드(pod)가 없는 걸 볼 수 있습니다.

 

heymoji에 연관된 Pod가 존재하지 않는다.

연결된 파드가 없습니다. 당연(?)하죠! 방금 네임스페이스를 만들었고 아무것도 배포하지 않았으니 ㅋㅋ

여기까지 했으면 다 한 겁니다(?)

 

 

2. 도커 이미지 빌드(build)


자 이제 도커파일을 빌드(build)해 보도록 하겠습니다!

일단은 본인이 배포하려는 서비스에 dockerfile이 있다는 가정하에 진행하겠습니다!

 

Dockrfile 예시

제 프로젝트는 fastapi로 만든 애플리케이션이라 기본적으로 요 이미지를 사용했습니다.

(docker build에 대한 다양한 옵션 및 자세한 내용은 생략하도록 하겠습니다)

 

프로젝트 구성 및 .dockerignore

도커 이미지를 빌드하기 전에 함께 빌드가 되면 안 되는 파일들은 .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 <도커 허브 저장소 이름>/<이미지 이름>:<버전>

 

docker build후 로컬에 생성된 image
docker push로 docker hub에 업로드된 이미지를 확인할 수 있다

 

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 이미지

이제 이 이미지를 가지고 heymoji 네임스페이스에 pod를 띄워보겠습니다!

 

kubectl run <pod 이름> --image=<이미지 이름>:<태그> -n <네임스페이스>

 

pod가 생성되었다고 알려줌
heymoji namespace에 heymoji-api라는 이름의 pod가 생성된걸 확인할 수 있다.

 

 

3. 마치며


예전부터 쿠버네티스를 스터디하고 싶었는데 막연히 어렵다고만 생각해서 미루다가 이제 시작했습니다 ㅎㅎ 근데 막상 해보니까 제가 새로운 영역에 대한 두려움에 너무 어렵게만 생각했던것 같습니다.

 

찾아보면 자료도 많고 실제로 해보면 삽질을 많이 해보긴 했지만 로컬환경에서 실습해볼수 있는 내용들이었습니다! 아직은 쿠버네티스에 대해 자세하게 아는것은 아니고 겉핧기식이지만, 조금씩 해보면 어느정도 익숙해질 것 같습니다

 

이글은 2부로 이어집니다!

 

 

참고자료

https://ryu-e.tistory.com/10(정말 상세히 잘 되어있는 글)

 

docker 이미지를 만들어보자

이번 시간에는 docker 이미지를 커스터마이징하기 위해 Dockerfile로 이미지를 만들어 봅시다. 더 나아가 만든 도커 이미지를 hub에 올려 봅시다. 💡 목차 이번 시간에 학습할 부분은 아래와 같습니

ryu-e.tistory.com

https://minikube.sigs.k8s.io/docs/

 

Welcome!

minikube is local Kubernetes

minikube.sigs.k8s.io

https://kubernetes.io/ko/docs/tutorials/hello-minikube/

 

Hello Minikube

이 튜토리얼에서는 Minikube와 Katacoda를 이용하여 쿠버네티스에서 샘플 애플리케이션을 어떻게 실행하는지 살펴본다. Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. 참고: 로컬에서

kubernetes.io

https://breezymind.com/troubleshooting-minikube-share-local-image-on-lima/

 

minikube(feat. lima) 환경에서 로컬 이미지를 가져오지 못하는 문제

개발한 어플리케이션 이미지를 지난 글에서 구축한 minikube  환경에 올려 보고자 하면서 문제를 발견했다. 환경정보 silicon m1 macminikube version v1.24.0limactl 0.7.4 로컬에서 빌드한 이미지를 minikube 환

breezymind.com

https://newbiecs.tistory.com/327

 

Minikube에서 Local Docker의 이미지가 안받아 질 때

발단 로컬에서 빌드한 Docker image를 Minikube 환경에서 Helm 차트를 이용하여 Kubernetes 파드를 생성하려고 하였으나 docker login을 하라는 오류와 함께 파드가 이미지를 Pull 받지 못하였습니다. 해결 아

newbiecs.tistory.com