개발/Infra

(인강복습) 쿠버네티스 어나더 클래스 Sprint 2 - Helm 과 kustomize 비교하며 사용하기

희묭 2025. 4. 15. 11:16

kubectl 이 아닌 Helm 을 써야한다

배포를 위한 부가적인 기능을 위해, 자원생성을 잘 하기위해 Helm 과 kustomize 를 패키지 매니저라고 부른다

Helm vs kustomize

  • 공통점
    • 중복관리 최소화
    • 다양한 배포툴에서 지원
  • 차이점
    • Helm
      • 배포할 대상이 늘어날수록 좋음
      • 함수방식
      • 생태계 더 강력하다
    • kustomize
      • 소규모프로젝트일수록 좋음
      • 오버레이방식
      • 1.14버전부터 kubectl 에 포함

헬름배포하기

  1. 초기화
    • api-tester : 메인차트폴더 (main app 배포)
      • charts : 서브차트폴더 (마이크로서비스의 sub app 배포)
      • templates : 메인차트 yaml 파일 폴더
        • tests : 메인앱 배포후 통신되는지 확인 (부가확인)
        • helpers.tpl : 사용자 정의 전역변수
        • NOTES.txt : README, 배포후 출력
      • .helmignore : 랜더링시 제외하고픈 파일목록 (git ignore와 유사)
      • Chart.yaml : 차트 기본정보
      • values.yaml : 변수값들 선언 (-f 옵션으로 환경에따라 변경)
        • values-dev.yaml
        • values-qa.yaml
  2. helm create api-tester
  3. 필요없는 파일 삭제
    • 서브차트 폴더 삭제
    • templates/tests 삭제
  4. 수정
    • values.yaml
      • replicaCount : 2
      • image.pullPolicy
        • Always
        • IfNotPresent
      • tag : Chart 파일의 appVersion 이 오버라이드됨
      • serviceAccount.create : false
      • service
        • type : NodePort
        • nodePort : 추가
      • resources
      • volumes
      • volumeMounts
      • nodeSelector
    • deployment
      • port : 서비스포트랑 같은걸 추천하나 일단은 컨테이너 포트를 8080으로
      • probe 정보 변경
    • helm command
      • 인스턴스명 : api-tester-2221
      • 경로 : ./api-tester
      • 네임스페이스 : anotherclass-222
      • .Release. 으로 사용가능
      • 템플릿 변수를 작성하는 곳은 Chart, values, _helpers, 콘솔 총 네곳
    • helm install api-tester-2221 ./api-tester -n anotherclass-222
  5. 추가
    • configmap.yaml
    • secret.yaml
    • nindent : 출력 들여쓰기

helm 배포

  • install → create
  • upgrade → patch
  • upgrade --install → apply
  • -f ./app/values-dev.yaml → 환경에따라 변경

kustomize 배포하기

명령어 없이 직접 만들어야됨

  • api-tester
    • base
      • kustomization.yaml : 배포할 파일선택 및 공통값 설정
    • overlays : 오버레이될 정보
      • dev
      • qa
      • prod

jenkins 에서 파라메터 주입

parameters {
    choice(choices: ['dev', 'qa', 'prod'], name: 'PROFILE')
}

kubectl kustomize ./${CLASS_NUM}/deploy/kustomize/api-tester/overlays/${params.PROFILE}

고민되는 포인트와 해결법

  1. 계정정보 암호화안됨 → 젠킨스 크레덴셜로 등록
    1. withCredentials([file(credentialsId: 'k8s_master_config', variable: 'KUBECONFIG')]) {
  2. 컨테이너업로드 누적으로 용량차지 → 이미지 삭제
    1. sh "docker rmi ${DOCKERHUB_USERNAME}/api-tester:${TAG}”
  3. 그룹개념으로 네임스페이스 → 배포와 별도로 네임스페이스관리
    1. stage('네임스페이스 생성') {
    2. stage('헬름 배포') {
  4. 파드가 실제 기동중인지 확인 → --wait 옵션
    1. --wait --timeout=10m
  5. 배포해도 업그레이드가 안되는 경우(템플릿수정안되는경우) → metadata.annotations
    1. template.metadata.annotations.rollme = {{ randAlphaNum 5 | quote }}
  6. 이미지태그
    1. latest + Always : 늘 새로운 이미지를 가져오지만 롤백이 어려움
    2. 버전명시-날짜시간 + ifNotPresent : 개발도 이것으로 하는게 유리
      1. BUILD_DATE = sh(script: "echo date +%y%m%d.%d%H%M", returnStdout: true).trim()
      2. TAG = "${APP_VERSION}-" + "${BUILD_DATE}”
      3. --set image.tag=${TAG}
  7. 쿠버에 이미지 누적으로 용량차지 → 쿠버 가비지걸렉터