# Helm Chart Customizing에 대해서 알아본다.
Helm Chart를 활용하여 복잡한 리소스를 관리 할 수 있다.
일단 eks는 deployment.yaml 과 service.yaml 등 기본 리소스를 생성하기 위한 자원들이 존재하는데 이것들을 helm chart에 저장하여 values.yaml에 정의한 변수값들로만 컨트롤을 한다면 기존보다 관리가 쉬워질것이다.
1. Helm Chart 생성
- chart를 생성하는 방법은 크게 2가지가 존재한다. 첫번째는 helm creae를 이용하는 방법이고, 두번째는 직접 리소스 파일들을 작성하는 방법이다.
- 내가 생각하기에 가장 효율적인 방법은 helm create로 기본적인 리소스를 생성하고 deployment.yaml 파일등과 같이 원하는 리소스를 커스텀하여 chart에 덮어쓰는 형태가 가장 좋다.
- 그렇다면 본격적으로 chart를 생성하는 작업을 진행한다.
- helm create 명령어를 사용하여 helm 패키지를 생성한다.
mkdir chart
helm create seung-helm-chart
Creating seung-helm-chart
cd seung-helm-chart/
son-helm-chart# ls
charts Chart.yaml templates values.yaml
위와 같이 helm create [chart_name] 으로 helm chart를 생성한다. helm chart 기본 구조는 아래와 같다.
위의 리스트를 간단하게 설명하는 아래와 같다.
- chart_template : 최상위 디렉토리로 실제 chart의 단위가 되는 디렉토리이다.
- templates : templates 하위에 deployement.yaml, service.yaml과 같은 실제 배포에 사용할 yaml 파일을 저장한다.
변경할 리소스가 변수처리가 되어 있어야 values.yaml에서 처리할 수 있다.
- Chart.yaml : helm chart에 대한 version, writer, description, chart name 등을 정의하는 meta 파일이다.
- values.yaml : templates 디렉토리 하위의 yaml 파일들이 참조하여 실제 yaml 파일 형태로 생성하는데 사용되는 parameter를 저장하는 yaml 파일이다.
- templates 폴더의 하루에 파일을 아래와 같이 deplotment.yaml 파일만 존재하도록 구성한다.
다른 파일이 존재하고, 변수값이 설정되어 있으면, 해당 변수값을 찾는 리소스를 맵핑해주지 않으면 에러가 발생하므로 아래와 같은 파일 구조를 가진다.
2. 리소스를 실제로 배포하기 위해 deployment.yaml 파일을 작성해보자.
- chart 폴더의 templates/deployment.yaml 파일에 아래의 내용을 작성한다.
- 아래의 코드에서 {{ }} 로 감싸져 있는 리소스는 values.yaml 파일에 변수로 담겨있는 리소스라고 할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name}}-deployment
namespace: nginx
labels:
app: {{ .Values.label}}
spec:
replicas: {{ .Values.replicas}}
selector:
matchLabels:
app: {{ .Values.label}}
template:
metadata:
labels:
app: {{ .Values.label}}
spec:
containers:
- name: nginx
image: {{ .Values.image}}
imagePullPolicy: Always
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.name}}
namespace: nginx
annotations:
alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
spec:
selector:
app: {{ .Values.label}}
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Values.name}}-ingress
namespace: nginx
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Values.name}}
port:
number: 8080
파일은 deployment 하나로 관리되거나, (--- 로 구분) deployment.yaml, service.yaml, ingress.yaml로 구분하여 파일을 저장 할 수 있다.
위의 파일의 내용은 deployment, service, ingress가 함께 정의되어 있는 yaml 파일의 내용이다.
위 파일의 특징을 보자면 바로 {{ .Values.xx}} 형태의 변수처리라 할 수 있다.
위에는 크게 4개의 변수가 지정되어 있다.
- {{ .Values.name}} : Service Name을 위한 변수
- {{ .Values.label}} : Node 배치를 위한 Selector, Label 변수
- {{ .Values.replicas}} : Replicas를 위한 변수
- {{ .Values.image}} : Image를 위한 변수
위 4가지 변수는 다음과 같이 values.yaml 파일에서 변수로써 정의된다.
3. values.yaml 파일의 내용을 작성해보자.
name: "nginx"
replicas: 3
label: nginx-label
image: "nginx:1.14.2"
위의 deployment.yaml 파일과 맵핑된 변수를 values.yalm 파일에 위와 같이 설정한다.
- 위에서 설정한 리소스를 검증하는 작업을 아래에서 수행한다.
4. helm chart 검증
- 검증 과정은 두개의 스텝이 존재한다. 첫번째 방법은 chart lint로 검사하는 방법과 chart의 template를 직접 확인하는 방법이 존재한다.
- helm lint 를 활용한 검증
우선 Chart.yaml 파일이 존재하는 경로로 이동 후 helm lint 명령어를 수행하여 문제를 확인한다.
PS C:\chart\seung-helm-chart> helm lint
==> Linting .
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
- 위의 내용처럼 1개의 chart가 정상적으로 검증이 되었는지 확인이 가능하다.
- helm template를 활용한 검증
helm template은 templates/deployment.yaml과 values.yaml 파일의 조합으로 실제 생성하고자 했던 yaml 파일의 리소스가 정상적으로 생성이 되는지 검증하는 단계이다.
PS C:\chart> helm template .\seung-helm-chart\
---
# Source: seung-helm-chart/templates/deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: nginx
annotations:
alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
spec:
selector:
app: nginx-label
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 80
---
# Source: seung-helm-chart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx
labels:
app: nginx-label
spec:
replicas: 3
selector:
matchLabels:
app: nginx-label
template:
metadata:
labels:
app: nginx-label
spec:
containers:
- name: nginx
image: nginx:1.14.2
imagePullPolicy: Always
ports:
- containerPort: 80
---
# Source: seung-helm-chart/templates/deployment.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: nginx
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 8080
- 위와 같이 출력이 된다면 deployment.yaml 파일이 정상적으로 생성이 되었다고 판단할 수 있다.
5. helm 배포
- helm install을 활용하여 직접 구성한 chart를 배포하기
- nginx namespace를 생성하고 위에서 구성한 deplotment.yaml 파일의 리소스를 배포한다.
# namespace 생성
kubectl create ns nginx
# helm install
PS C:\chart> helm install seung-helm-chart-deploy .\seung-helm-chart\
NAME: seung-helm-chart-deploy
LAST DEPLOYED: Thu Mar 9 15:25:56 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
- k8s 환경에서 정상적으로 배포가 되었는지 확인한다.
pod 정보 확인하기
PS C:\chart> kubectl get pod -n nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-864cc6bbb8-qtxhm 1/1 Running 0 3m33s
nginx-deployment-864cc6bbb8-vqlc4 1/1 Running 0 3m33s
nginx-deployment-864cc6bbb8-w9twz 1/1 Running 0 3m33s
svc 정보 확인하기
PS C:\chart> kubectl get svc -n nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 172.20.26.210 <none> 8080:30802/TCP 4m7s
ingress 정보 확인하기
PS C:\chart> kubectl get ingress -n nginx
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress <none> * k8s-nginx-nginxing-000000000000-335858185.ap-northeast-2.elb.amazonaws.com 80 4m39s
해당 ALB DNS 주소로 웹에서 nginx 서비스 확인하기
- 정상적으로 접속이 가능한것을 확인할 수 있다.
- test로 nginx서비스를 helm chart로 만들어 배포하는 과정에 대해서 알아보았다.
- 다음에는 multi 서비스를 구현하는 방법에 대해서 알아본다.
'Helm (헬름) > Helm chart' 카테고리의 다른 글
Helm 차트를 사용하여 Kubernetes 애플리케이션을 패키징, 구성 및 배포 (0) | 2024.08.21 |
---|---|
Helm Chart Customizing - nginx - multi service (0) | 2023.03.09 |
Terraform으로 EKS 클러스터 생성 및 HELM Chart로 리소스 구현 (0) | 2023.03.08 |
helm chart 설치 오류 해결하기 (0) | 2023.03.08 |
helm 원격 리포지토리 (Repository) (0) | 2023.02.21 |