ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [쿠버네티스] docker 이미지 빌드 부터 helm 배포까지 [2부]
    💻 프로그래밍/K8s & Docker 2022. 5. 17. 20:46

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

    1부에 이어서 2부 시작하겠습니다! :D

     

    1부에서는 도커 이미지를 빌드하고 빌드한 이미지로 k8s(쿠버네티스) 파드로 띄우기까지 했습니다!

    2부에서는 이 과정을 Helm Chart(이하 helm)라는 도구를 통해 서비스 배포를 해보겠습니다.

     

     

    1. What is Helm Chart?


    helm 홈페이지 (https://helm.sh/)

    홈페이지에 대문작만하게 쿠버네티스를 위한 패키지 매니저라고 쓰여있네요 ㅋㅋ 맞습니다. 정말 말 그대로 쿠버네티스 배포를 위해 서비스들을 템플릿 형태로 정의하고 그 정의된 템플릿으로 배포하는 도구입니다!

     

    자세한 내용은 공식문서를 확인하시길 바라며, 저희는 일단 먼저 써보도록 하겠습니다!

    먼저 helm을 설치해야 합니다. (helm 설치 가이드)

     

    mac 에서는 homebrew로 설치가 가능합니다

    brew install helm

     

     

    2. helm chart 만들기


    차트를 만들 프로젝트 베이스 경로에서 아래 명령어를 입력하면 기본적으로 차트를 생성해줍니다!

    helm create NAME [flags]

    생성된 차트

    helm create 명령어를 실행하면 위처럼 차트들이 생성된 걸 확인할 수 있습니다.

    간단하게 기본적으로 생성되는 차트 파일들에 대해서 알아보겠습니다.

     

    1. deployment.yaml : 쿠버네티스 디플로이먼트를 생성하기 위한 기본 매니페스트
    2. service.yaml : 디플로이먼트의 서비스 엔드포인트를 생성하기 위한 기본 매니페스트
    3. serviceaccount.yaml : pod를 식별하기 위한 리소스 매니페스트
    4. hpa.yaml : HorizontalPodAutoscaler 의 줄임말이며, pod 오토 스케일링을 위한 매니페스트
    5. ingress.yaml : ingress 관련 매니페스트. ingress는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함. 인그레스는 부하 분산, SSL 종료, 명칭 기반의 가상 호스팅을 제공할 수 있다.
    6. NOTES.txt : 차트의 "도움말". 이것은 helm install 을 실행할 때 사용자에게 표시.
    7. _helpers.tpl : 차트 전체에서 다시 사용할 수 있는 템플릿 헬퍼를 지정하는 공간
    8. values.yaml : 차트에 전달되는 환경설정 정의
    9. chart.yaml : 차트에 대한 정보를 가지고 있다.

     

    차트파일구조 설명은 여기서 확인 할 수 있습니다.

     

    일단은 각각의 파일들이 저런 역할을 한다 정도만 알고 지나가면 될 것 같습니다.

    일단 values.yaml을 먼저 살펴보겠습니다.

     

    image 정의

    아마 기본적으로 nginx 이미지로 되어있을 거예요! respository에는 도커 이미지를 가져올 repository를 정의하면 됩니다. 저는 미니쿠베의 로컬에 저장한 이미지를 사용할 거라 위처럼 정의했습니다.

     

    미니쿠베 로컬에 저장되어있는 heymoji 이미지

    이상태에서 helm으로 배포를 해보겠습니다.

     

     

     

    3. helm 배포하기


    helm install <pod이름> <차트경로> --namespace=<네임스페이스 이름>

     

    헬름 차트로 배포
    헬름 배포후 pod가 뜬것을 볼 수 있다.

    helm install 명령어를 실행하게 되면 파드(pod)가 뜬것을 볼 수 있습니다. 근데 좀 이상합니다. CrashLoopBackOff 상태가 되면서 pod가 계속 restart를 합니다!!

     

    CrashLoopBackOff은 파드의 상태가 이상(crash)이 생겨서 재시작을 하는 상태를 말합니다. 왜 그럴까요? 파드의 로그를 한번 보겠습니다!

     

    파드 로그

    보니까 / 경로를 어딘가에서 호출하는데 계속 404를 리턴해주고 결국 shutting down을 진행합니다.

     

    확인해보니 쿠버네티스는 컨테이너가 잘 살아있는지 확인하고 이상인 경우 재시작을 하기 위해 health check를 진행한다고 합니다! 그렇기 때문에 health check api를 만들고 helm 차트에서 경로를 지정해줘야 합니다!

     

    helath check api

    간단하게 헬스체크 api를 만들어주고 deployment.yaml 에 가서 health check 경로를 지정해줍니다. health check의 경우 프로브(probe)라는 것을 통해 설정 할 수 있습니다.

     

    프로브 종류 (출처: https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/)
    경로설정을 해주었다

    저는 헬스체크 api 경로를 이렇게 해주었습니다.

    이상태에서 helm chart를 다시 배포해보겠습니다!

     

    helm chart를  재배포 할때는 upgrade를 사용합니다. 위에서 사용했던 install 명령어는 말 그대로 install이기 때문에 첫 배포 후 chart가 변경되는 경우에는 upgrade 명령어로 배포해야 합니다.

     

    helm upgrade <차트경로> -f <컨피그 경로> --recreate-pods --namespace=<네임스페이스> --atomic --cleanup-on-fail

     

    upgrade시 몇가지 옵션을 함께 사용하는데 아래와 같습니다.

     

    • -- recreate-pods : pod 재생성
    • --atomic: 설정된 경우, 업그레이드 실패 시 변경 사항을 롤백. --atomic 을 사용하면 --wait 플래그가 자동으로 설정
    • --cleanup-on-fail: 롤백이 실패할 때 이 롤백에서 생성된 새 리소스의 삭제를 허용

     

    새로운 파드가 띄워지고 기존 파드가 종료
    새로 생성된 파드 로그

    새로 생성된 파드의 로그를 보면 health check가 잘 이루어진 걸 볼 수 있습니다 (슬래시 때문에 리다이렉트를 하네요 ㅎㅎ)

     

     

    4. 외부에서 api 호출하기


    자 이제 배포는 되었으니 실제로 api가 호출되는지 확인해봐야겠죠??

     

    외부 연결은 service.yaml 에서 설정할 수 있습니다.

     

    service type 종류

    service type은 위와 같이 네가지 타입이 있습니다. 저는 LoadBalancer를 사용하겠습니다!

    사실 NodePort로 했다가 엄청난 삽질 끝에 연결이 안 되어서...

     

    8088 포트로 연결

    저는 8088 포트로 연결되도록 정의했습니다. 이제 postman으로 한번 heymoji health check를 호출해보겠습니다!

    그전에!! 그럼 어떤 ip로 호출해야 하는 거죠?!라고 생각할 수 있습니다.

     

    kubectl get services -n <네임스페이스>

     

    위 명령어를 사용하면 현재 배포되어있는 service를 확인할 수 있습니다.

    get service 실행결과

    heymoji라는 네임스페이스에 떠있는 heymoji-api 정보를 확인할 수 있습니다. 일단 포트(Port)를 보면 8088로 설정된 걸 볼 수 있는데 EXTERNAL-IPpending 되어있는 걸 볼 수 있습니다. 딱 봐도 뭐가 이 EXTERNAL-IP가 외부로 연결되는 IP 같죠??!

     

    미니쿠베를 사용하는 경우 외부 연결을 열어주기 위해 다음과 같은 명령어를 사용한다고 합니다!

     

    minikube tunnel

     

    실행 결과

    뭔가 터널을 열어주다? 이런 의미인가?? 실제 쿠버네티스와 이 부분이 조금 다르다고 하는데... 어쨌든 위 명령어를 실행하고 다시 service를 확인하면

     

    외부 아이피가 생성
    200 응답

    pending 상태였던 외부아이피가 127.0.0.1로 세팅되어있는 걸 볼 수 있습니다.

    다시 api를 호출하면 정상적으로 응답이 오는 걸 확인할 수 있습니다!!

     

    외부 아이피가 127.0.0.1인 이유는 아마도 로컬에서 미니쿠베 클러스터를 띄워서 사용하기 때문이지 않을까 합니다 ㅎㅎ

     

    만약, 현재 실행 중인 service를 내리고 싶다면 아래 명령어를 사용하면 한 번에 삭제되는 걸 확인할 수 있습니다.

    helm uninstall <서비스 이름> -n <네임스페이스>

    https://helm.sh/ko/docs/helm/helm_uninstall/

     

    Helm Uninstall

    헬름 - 쿠버네티스 패키지 매니저

    helm.sh

     

     

    5. 마치며


    "도커 이미지 빌드부터 helm 배포까지"의 기나긴 여정이 종료되었습니다. 개인적으로 백엔드 애플리케이션을 이미지로 빌드하고 helm 차트를 만들어서 배포하는 과정을 로컬에서 진행해 보기 위함이었는데 삽질도 많이 하고 그랬던 것 같습니다.

     

    아직 쿠버네티스에 좀 더 공부해야겠지만, 일단은 회사 내부에서 어떤 식으로 쿠버네티스 배포가 이루어지는지 정도는 감은 생긴것 같습니다! 

     

    다음에는 아마도 쿠버네티스 네트워크 쪽을 공부해서 현재 인프라가 어떻게 연결되어있고 어떻게 구성할 수 있는지에 대해 알아볼 것 같습니다! 그럼 여러분도 쿠버네티스와 더 친해지시길 바라며!! 아디오스~

     

     

    참고

    https://wookiist.dev/141

     

    [Kubernetes] Helm Chart 만들기

    Prologue 일반적으로 Kubernetes Manifest 파일은 정적인 형태입니다. 따라서 데이터를 수정하기 위해선 파일 자체를 수정해야 합니다. 잘 관리를 한다면야 큰 어려움은 없겠지만, 문제는 CI/CD 등 자동화

    wookiist.dev

    https://happycloud-lee.tistory.com/4

     

    1. 기존 Helm chart 설치, 업그레이드, 삭제

    이번 장에서는 공개된 오픈소스소프트웨어의 Helm chart를 설치, 업그레이드, 삭제하는 명령어들에 대해 배워 보겠습니다. 각 목적에 맞는 명령어 리스트를 1 page로 정리하면 아래와 같습니다. 이

    happycloud-lee.tistory.com

     

    댓글

운동하는 개발자 JAY-JI