(13) Helm 과 Kustomize - 1 (Helm vs Kustomize, Helm 배포)

2025. 6. 15. 14:21·🌱 인프런/⚓ 쿠버네티스 어나더 클래스 (지상편)

⚓ 쿠버네티스 어나더 클래스 (지상편) - Spring 1, 2 을 듣고 작성하는 복습 블로그 입니다.

 

(1) 명칭 정리

배포툴

  • Jenkins : 지금까지 배포툴로 사용
  • argo : 이번시간부터 배포툴로 사용

kubectl 을 써서 쿠버네티스로 배포

  • kubectl 은 커맨드 라인 도구인 CLI
  • create 나 apply 로 자원 생성
  • CLI 명령 중 하나를 사용한거지 배포를 위한 부가적인 기능은 없었음
  • 실무에서는 kubectl 을 쿠버네티스 자원을 조회하거나 급한 수정할 때만 사용
  • 실제 자원 생성은 Kustomize 나 Helm 을 통해서 한다

패키지 매니저 : Helm, Kustomize

  • kubectl 과 같이 6명의 명령을 날리지만,
  • 작업자 입장에서는 한 번으로 모두 처리할 수 있다
  • App 을 패키지 단위로 관리

(2) Helm vs Kustomize

2-1. 공통점

  • 사용 목적 : 중복 관리 최소화
    • 마이크로 서비스로 App 종류가 많아졌기 때문에
    • 다양한 배포 환경 때문에
  • 다양한 배포 툴에서 지원
    • 부가적인 기능을 지원해준다

 

2-2. 차이점

  Helm Kustomize.io
배포 편의 기능 갯수 200개 10개
한 패키지 당 활용 범위 (권고) 마이크로 서비스 AND 다양한 배포 환경 마이크로 서비스 OR 다양한 배포 환경
⇒ 점점 패키지 내부 파일량이 많아지는 구조
사용 목적 프로젝트관리 패키지용 + 기업 제품 패키지용 프로젝트관리 패키지용
유즈케이스 대형프로젝트
App 종류 - 5개 이상
간단한 프로젝트
App 종류 - 5개 미만

 

2-3. 최종 의견

  • 쿠버네티스를 하면서 무조건 여러 오픈소스를 도입하게 된다.
  • 그리고 그 오픈소스는 대부분 Helm 형태로 배포
  • 그렇기 때문에 Helm 은 어차피 알아야 한다.
  • 그래서 처음에 학습이 어렵지만 Helm 을 먼저 쓰면 Kustomize 를 사용할 필요는 없어지게 된다.

 

Kustomize 를 알아야 하는 경우

  • 처음부터 끝까지 소규모 프로젝트가 될 경우
  • 빨리 파이프라인을 구축해야하고, 단계적으로 Helm 적용해도 되는 경우
  • 이미 누가 Kustomize 로 배포 파이프 라인을 적용해 놔서 분석해야 할 경우

 

2-4. Helm vs Kustomize 비교

2-4-1. 설치 구성

Kustomize Helm
  • 자체적으로 Kustomize 를 관리하는 사이트가 있고, 다운을 받거나 관리하는 GitHub 도 있다
  • v1.14 부터 kubectl 에 통합
  • 바로 사용 가능하다
  • 폴더를 만들어서 구성
  • 명령어 : helm
  • Artifact HUB : Helm 패키지 저장소 (Github 와 같은 사이트)
    • Helm 패키지에서 Grafana, argo 등 다양한 걸 다운 받을 수 있다
    • 기업에서 설치 가이드도 제공
    • 설치 후 배포를 하면 Kubernates 에 설치된다
  • Helm 사이트가 있고, GitHub 도 있다
  • kubectl 이랑 똑같이 인증서가 있어야지 kube-apiserver 로 통신 가능
  • 폴더를 만들어서 구성
  • 명령어 : kubectl -k

 

 

2-4-2. 사용 방식

Helm → 함수 방식 Kustomize → 오버레이 방식
  • template 이 있고, 파라미터 값이 들어왔을 때
  • 내부 로직에 의해서 치환돼서 결과값이 만들어진다
  • 아무처리가 되지 않은 yaml 파일
  • base 파일에 각각 환경에 맞는 yaml 파일을 덮어서 배포한다

 

 

2-4-3. 패키지 구조

Helm Kustomize
  • heml command : helm create api-tester
  • 명령어를 날리면 api-tester 패키지가 자동으로 생성된다
  • hap.yaml 내부에 if 문이 존재
  • values.yaml 에서 값을 변경하면 이 값이 들어간다
  • 배포를 하려면 helm install api-tester-32222 ./app -f ./app/values-dev.yaml
  • 폴더를 직접 생성해야 한다
  • 하위 폴더 구성도 직접
  • api-tester : 메인 폴더
  • base : 디폴드 포맷 폴더
  • kustomization.yaml : 배포할 파일 선택 및 공통값 설정
    • resource 속성이 있어서 내가 배포할 파일들만 명시적으로 적용
  • deployment.yaml : 베이스 yaml 파일
  • overlays : 오버레이 영역 폴더
  • 배포를 하려면 kubectl apply -k ./app/overlays/dev(환경폴더)

(3) Helm 배포

0. 설치하기

0-1. Helm 설치

[root@cicd-server ~]#
yum install -y tar
curl -O <https://get.helm.sh/helm-v3.13.2-linux-arm64.tar.gz>
tar -zxvf helm-v3.13.2-linux-arm64.tar.gz
mv linux-arm64/helm /usr/bin/helm

 

확인하기

# jenkins 유저로 전환해서 확인
[root@cicd-server ~]# su - jenkins -s /bin/bash
[jenkins@cicd-server ~]$ helm

 

템플릿 생성하기

helm create api-tester

 

 

 

0-2. Kustomize 설치

 

  • kubectl 에 이미 설치되어 있음

 

 

1. Helm 배포 시작하기

1-1. Pipeline 생성

  • item name : 2221-deploy-heml
  • type : Pipeline

 

1-2. Configuration

  • Configure > General > GitHub project > Project url : https://github.com/soyeon207/kubernetes-anotherclass-sprint2/
  • Advanced Project Options > Pipeline
Definition : Pipeline script from SCM
Definition > SCM : Git
Definition > SCM > Repositories > Repository URL : <https://github.com/soyeon207/kubernetes-anotherclass-sprint2.git>
Definition > SCM > Branches to build > Branch Specifier : */main
Definition > SCM > Branches to build > Additional Behaviours > Sparse Checkout paths > Path : 2221
Definition > Script Path : 2221/Jenkinsfile

 

 

1-3. 지금 빌드

  • 배포 시작 버튼을 누르면 Helm 배포
  • Helm 템플릿 확인
더보기
# Source: api-tester/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: api-tester-2221-postgresql
  labels:
    helm.sh/chart: api-tester-0.1.0
    app.kubernetes.io/name: api-tester
    app.kubernetes.io/instance: api-tester-2221
    app.kubernetes.io/version: "v1.0.0"
    app.kubernetes.io/managed-by: Helm
stringData:
  postgresql-info.yaml: |-
    driver-class-name: "org.postgresql.Driver"
    url: "jdbc:postgresql://postgresql:5431"
    username: "dev"
    password: "dev123"
---
# Source: api-tester/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: api-tester-2221-properties
  labels:
    helm.sh/chart: api-tester-0.1.0
    app.kubernetes.io/name: api-tester
    app.kubernetes.io/instance: api-tester-2221
    app.kubernetes.io/version: "v1.0.0"
    app.kubernetes.io/managed-by: Helm
data:
  application_role: ALL
  postgresql_filepath: /usr/src/myapp/datasource/postgresql-info.yaml
  spring_profiles_active: dev
---
# Source: api-tester/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: api-tester-2221
  labels:
    helm.sh/chart: api-tester-0.1.0
    app.kubernetes.io/name: api-tester
    app.kubernetes.io/instance: api-tester-2221
    app.kubernetes.io/version: "v1.0.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
      nodePort: 32221
  selector:
    app.kubernetes.io/name: api-tester
    app.kubernetes.io/instance: api-tester-2221
---
# Source: api-tester/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-tester-2221
  labels:
    helm.sh/chart: api-tester-0.1.0
    app.kubernetes.io/name: api-tester
    app.kubernetes.io/instance: api-tester-2221
    app.kubernetes.io/version: "v1.0.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: api-tester
      app.kubernetes.io/instance: api-tester-2221
  template:
    metadata:
      labels:
        helm.sh/chart: api-tester-0.1.0
        app.kubernetes.io/name: api-tester
        app.kubernetes.io/instance: api-tester-2221
        app.kubernetes.io/version: "v1.0.0"
        app.kubernetes.io/managed-by: Helm
    spec:
      serviceAccountName: default
      securityContext:
        {}
      containers:
        - name: api-tester
          securityContext:
            {}
          image: "1pro/api-tester:v1.0.0"
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          envFrom:
            - configMapRef:
                name: api-tester-2221-properties
          startupProbe:
            httpGet:
              path: "/startup"
              port: 8080
            periodSeconds: 5
            failureThreshold: 24
          livenessProbe:
            httpGet:
              path: "/liveness"
              port: 8080
          readinessProbe:
            httpGet:
              path: "/readiness"
              port: 8080
          resources:
            limits:
              cpu: 200m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 100Mi
          volumeMounts:
            - mountPath: /usr/src/myapp/datasource
              name: secret-datasource
      volumes:
        - name: secret-datasource
          secret:
            secretName: api-tester-2221-postgresql

 

1-4. 배포 코드 확인

https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2/tree/main/2221

  • 앱을 Helm 패키지로 만들기 위해서 필요한 단계

 

1-5. Helm Package 를 만드는 순서

1-5-1. Helm 템플릿 생성

# helm 템플릿 생성 
[jenkins@cicd-server ~]$ helm create api-tester
[jenkins@cicd-server ~]$ cd api-tester
[jenkins@cicd-server api-tester]$ ls
charts  Chart.yaml  templates  values.yaml

 

1-5-2. 당장 필요없는 내용 삭제하기 (deleting)

 

  • helm create api-tester 를 사용하면 최상단에 메인차트 폴더 생성
  • 하위로
    • charts : 서브차트 폴더 → 사용 X 삭제
    • templates : 메인차트 yaml 파일 폴더
    • .helmignore : 렌더링 시 제외 파일지정, 공유할 필요 없는 파일들
    • Chart.yaml : 차트 기본정보 선언
    • values.yaml : 배포될 yaml 파일에 들어가 있는 변수들의 기본값 선언, 변수 값 argument 를 설정
  • templates : 메인차트 yaml 파일 폴더
    • tests : App 의 통신 상태 확인 (부가기능) → 사용 X 삭제
    • _helpers.tpl : 사용자 정의 전역변수 선언
    • NOTES.txt : 배포 후 안내문구
    • deployment.yaml : 배포 될 파일

 

1-5-3. 내 yaml 파일에 맞게 Helm Package 수정하기 (modify)

  • helm command → .Release 를 써서 변수를 넣을 수 있다
  • Chart.yaml → .Chart 를 써서 변수를 넣을 수 있다
    • .Chart.Name 처럼 뒤에 대문자로 시작
  • values.yaml → .Values 를 써서 변수를 넣을 수 있다
    • .Values.replicaCount 처럼 뒤에 소문자로 시작
  • _helpers.tpl → include 를 써서 import

→ helm 명령이랑 Chart.yaml, values.yaml 은 templates 안에 있는 모든 파일에서 가져다가 사용 가능

→ _helpers.tpl 은 templates 전체에서 사용 가능

 

 

1-5-4. additional

configmap.yaml 이랑 secret.yaml 을 추가

  • helm install → kubectl create
  • helm upgrade → kubectl patch
  • helm upgrade --install → kubectl apply

 

1-6. 실습 후 정리

# helm 조회
helm list -n anotherclass-222

# helm 삭제
helm uninstall -n anotherclass-222 api-tester-2221

# namespace 삭제
kubectl delete ns anotherclass-222

 

이미지 출처 URL : https://inf.run/k7mF

'🌱 인프런 > ⚓ 쿠버네티스 어나더 클래스 (지상편)' 카테고리의 다른 글

(14) Helm과 Kustomize 비교하며 사용-2  (1) 2025.06.24
[미션5] 컨테이너 이미지 사례 실습  (1) 2025.06.16
(12) Jenkins Pipeline (기초부터 Blue/Green 까지)  (1) 2025.06.14
(11) 배포를 시작하기 전에 반드시 알아야 할 것들  (2) 2025.06.11
(10) 손쉽게 데브옵스 환경을 구축하는 방법  (2) 2025.06.10
'🌱 인프런/⚓ 쿠버네티스 어나더 클래스 (지상편)' 카테고리의 다른 글
  • (14) Helm과 Kustomize 비교하며 사용-2
  • [미션5] 컨테이너 이미지 사례 실습
  • (12) Jenkins Pipeline (기초부터 Blue/Green 까지)
  • (11) 배포를 시작하기 전에 반드시 알아야 할 것들
말린
말린
  • 말린
    개발새발
    말린
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 👩🏻‍💻 알고리즘 (17)
        • 백준 (17)
      • ✒️ 글또 10기 (6)
      • 🗃️ 데이터베이스 (5)
      • ☕️ 자바 (1)
      • 🌱 인프런 (28)
        • ⚓ 쿠버네티스 어나더 클래스 (지상편) (22)
        • ☕️ 김영한의 실전 자바 - 중급 1편 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
말린
(13) Helm 과 Kustomize - 1 (Helm vs Kustomize, Helm 배포)
상단으로

티스토리툴바