Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Study_note

[kubernetes] Helm 및 chart 커스텀 본문

Kubernetes

[kubernetes] Helm 및 chart 커스텀

Study_note 2022. 11. 16. 21:28

Kubernetes 매니페스트 파일들을 패키징하고 관리하는 패키지 매니저로 Node.js의 npm과 Python의 pip와 같은 역할이라고 보면 된다.

 

예를들어 여러 리소스를 사용하여 앱을 생성하였고 똑같은 리소를 사용하여 다른 dev, stg 환경들을 만들려고하면 

 

앱을 생성하였을 때 만들었던 yaml파일을 다시 하나하나 실행시키거나 중간에 실수로 빼먹는 yaml파일이 있어서 문제가 발생할 수 있거나 단순 반복으로 인해 불편한점이 많다

하지만 helm을 사용하게 되면 리소스를 패키징한 뒤에 해당 패키징을 사용해서 간단하게 완성된 앱 서비스를 한 번에 배포할 수 있다

 

여기서 helm은 중요한 3가지 개념이 있다.

 

1. Chart

위에서 예를 들었듯이 필요한 모든 리소스들이 포함된 헬름 패키징이다 

 

2.Repository

차트 저장소로, 차트를 모아두고 공유하는 장소입니다.

 

3. Release

현재 클러스터에서 돌아가는 차트들을 rollback 및 update가능하게  버전관리

 

Helm 특징

• 패키징된 Chart를 통해 애플리케이션을 실행하는데 필요한 종속성 관리

• 환경별로 서로 다른 설정 값들을 변수화

• Chart repository를 통해 잘 구축된 애플리케이션을 손쉽게 사용

• 명령어 하나만으로 필요한 리소스를 모두 생성하기 때문에 CI/CD 파이프라인 간소화

• 수명 주기 hook으로 단계별로 특정 작업을 자동화헬름 버전!!!!

 

헬름 버전!!!!

 Helm v2 → Helm v3로 업그레이드 됐는데 버전마다 지원하는 환경이 다르고 특징이 다르기 때문에 주의해야한다

( 버전 달라서 삽질 많이 해봤다... 차이는 생략 )

 

명령어 내용
helm create helm create 새로운 Cart를 생성합니다.
helm search Repo에 등록된 Chart들을 검색합니다.
helm install 쿠버네티스에 Chart를 설치합니다. 이를 릴리즈라고 합니다.
helm list 쿠버네티스에 설치된 Chart의 리스트를 출력합니다.
helm repo Helm repo를 추가, 갱신, 삭제합니다.
helm uninstall  쿠버네티스에 설치된 릴리즈를 제거합니다.
helm upgrade  쿠버네티스에 설치된 릴리즈를 업그레이드합니다.
helm rollback 이전 버전의 릴리즈로 되돌립니다.

 

1. 개발자는 리소스들을 패키징하여 차트 생성

2. 레포지토리 내부에 등록된 차트 검색

3. 특정 차트사용하여 릴리즈 생성

4. helm uninstall or helm delete로 생성된 릴리즈 제거

 

테스트

 

우선 헬름 설치 및 실행

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

차트는 기본 형태가 있는데 아래와 같다.

mychart/
  Chart.yaml # 차트 버전 및 이름
  values.yaml # 동적 데이터 
  charts/
  templates/ # 내부에 생성할 리소스 yaml를 넣는다

creat 명령어로 테스트 차트를 만들면 위와 같은 형태로 생성되는것을 확인 가능하다.

필자는 하나하나 디렉토리와 yaml파일을 만들어 차트를 생성했다.

 

templates 내부에는 생성할 리소스는 간단하게 디플로이먼트와 서비스를 넣어줬다.

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: helm-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}

 

chart.yaml에는 생성할 차트에 대한 정보 입력 후 install 사용해서 차트 릴리즈 list로 생성한 차트 확인

apiVersion: v2
name: test-chart # 차트 이름
version: 0.0.1 # 차트 버전

list로 생성한 차트 확인

생성한 차트 제거 하고 list 시 제거된 모습을 확인 가능

 

이번에는 values.yaml을 사용해서 동적으로 내용을 커스텀해보자

기존에 생성 했던 helm.yaml에서 ngnix이미지와 서비스에 프로토콜을 아래처럼 바꾸고 values.yaml 값을 넣어보자

 spec:
   containers:
   - image: {{ .Values.image }}
     name: nginx 
   ---
  ports:
  - port: 80
    protocol: {{ .Values.protocol }}
Valuse.yaml에 해당 값 입력
image: nginx
protocol: TCP

생성된 리소스들을 list해보면 제대로 생성된것을 확인 가능

웬만한 모든 차트들은 이렇게 values를 사용하여 동적으로 사용할 수 있게 만들어져있다.

 

다음으로는 release.name이다

만약에 차트를 한번 생성하고 똑같은 차트를 배포할때 yaml내부에서 지정한 리소스의 이름이 같으면 생성이 안되기 때문에 겹치는것들을 바꿔줘야한다. 

그럴때 사용하는게 release.name이다

아래 그림과 같이 test라는 이름의 차트를 릴리즈하고 test2로 다시 한번 차트를 릴리즈하게 된다면

컨테이너 리소스가 이미 존재하여 생성이 안된다는 에러문을 볼 수 있다.

아래와 같이 라벨 값과 이름에 {{ .Release.Name }}값으로 수정 후 배포하면 차트가 릴리즈 된것을 확인 가능하며 값들도  {{ .Release.Name }} 영향을 받아 입력값이 된것을 확인 가능

kind: Deployment
metadata:
  labels:
    app: {{ .Release.Name }}
  name: {{ .Release.Name }}
  
  ---
  kind: Service
metadata:
  labels:
    app: nginx
  name: {{ .Release.Name }}

 

다음으로는 네임스페이스 설정이다 위에 {{ .Release.Name }}과 같이 입력값으로 리소스가 생성되는데

네임스페이스 또한 {{ .Release.Namespace }}를 통해 리소스 넣어주면 helm 생성 시에 입력 값으로 네임스페이스가 생성된다

네임스페이스를 디플로이먼트, 서비스 메타데이터에 넣어준다.
namespace: {{ .Release.Namespace }}
네임스페이스가 있다면 아래처럼 생성
helm install -n (네임스페이스 이름) (릴리즈이름) (경로)

네임스페이스가 없다면 네임스페이스 생성하면서 같이 차트 릴리즈
helm install --create-namespace -n (네임스페이스 이름) (릴리즈이름) (경로)

 

 

현재 아래 같이 test 릴리즈있는 상태에서 get을 사용해서 릴리즈 내용을 가져와 상태를 확인할 수 있다.

 

또한 내가 작성한 차트의 문법이 맞는지 확인하려면 lint 사용

만약 아래처럼 release.namespace에서 }를 하나 지우고 install 했을때 

아래처럼 에러 위치와 문제점을 말해주는데 install 하기전에 lint한다면

아래와 같이 에러 위치와 문제점을 말해준다

 

마지막으로 차트를 릴리즈하기전에 내가 작성한 values갑이 적용된 결과를 보고싶다면 아래처럼 template 사용해서 확인 가능하다

 

레포지토리 내부에 있는 차트 릴리즈 

 

우선 

1. 해당 경로에서 stable이라는 안정 버전에 이른 차트가 존재하는 리포지토리를 add

2. update로 레포지토리 업데이트

3. search를 통해 레포지토리 내부에 차트들 검색 

4. install를 통해 생성될 차트 이름을 명시하고 레포지토/차트 선택 후 생성

5. list 시 릴리즈된 차트 확인 가능

 

Comments