# helm을 활용하여 k8s의 리소스를 매니징 해보자.
1. 일단 helm 이란?
- helm은 쿠버네티스 패키지 매니저 이다. 앞에서도 언급 했지만 apt-get, npm, yum, pip와 같은 패키지된 라이브러리를 설치하는 k8s의 도구라고 볼 수 있다.
- 그리고 애플리케이션을 배포 할때 여러 리소스들을 개별로 생성하여 배포하는 것이 아닌 하나의 패키지로 묶어서 배포하기 위해서 주로 사용 된다. 그렇다면 왜 이런 식으로 약간은 번거롭게 배포 하는가? 생각해 볼수 있는데 답은 간단하다. 패키지로 묶어서 관리를 하게되면 여러 리소스들을 동시에 추가 및 업그레이드, 수정 하기가 편리해 진다. 당연한 답이지만 그렇다.
- 그렇다면 helm chart의 간단한 구조에 대해서 알아보자.
helm chart의 구조는 크게 values.yaml과 template/ 디렉토리로 구성된다.
values.yaml : 사용자가 원하는 값들을 설정하는 파일이다.
template/ : 설치할 리소스 파일들이 존재하는 디렉토리라고 보면 쉽다. 해당 디렉토리 안에는 Deployment.yaml, Service.yaml, Ingress.yaml 등과 같은 쿠버네티스에서 리소스를 실제적으로 생성하는 YAML 형태의 파일들이 존재한다고 보면 된다. 그리고 아래서 살펴 보겠지만 각 파일들의 설정값을 비워져 있고, values.yaml에 정의된 설정 값들로 채워진다고 볼 수 있다.
동작 과정을 보면, 패키지가 설치된 시점에 values.yaml파일의 설정값들을 이용하여 templates 디렉토리에 들어 있는 YAML 파일의 구멍난 부분을 채우고 해당 값을 기반으로 리소스를 생성한다.
values.yaml 파일에는 자주 바뀌거나 사용자마다 달라지는 설정값들을 입력하는 용도로 사용하고 templates 디렉토리는 패키지의 뼈대를 이룬다고 볼 수 있다.
- 우리가 npm, apt-get, pip 등과 같은 라이브러르 활용 도구를 잘 활용하는 것처럼 helm을 잘 활용하면 다른 사람이 만든 application도 손쉽게 가져다 쓸 수 있다. 이게 가장큰 장점이지 않나 싶다.
2. helm 설치
- helm을 설치하는 방법은 매우 간단하다. 다음 명령어를 활용하여 helm을 설치한다.
아래의 링크를 참조하여 helm을 설치한다. (나는 여기서 aws cloud9에서 인스턴스를 생성하여 진행 하였다.)
2021.10.24 - [Helm (헬름)/Helm] - Helm이란? helm 설치 및 기본 명령어 정리
3. helm chart를 생성
helm create <CHART_NAME>
- mychart 라는 helm chart를 생성한다.
helm create mychart
- chart를 생성하면 아래와 같이 해당 경로에 chart 명으로 생성된 폴더가 생성이 되고, 해당 폴더에 들어가보면 아래와 같은 chart 파일 리스트를 확인 할 수 있다.
- 아래의 구성요소를 간단하게 설명하면 아래와 같다.
Chart.yaml : chart 이름, 버전 정보 등 chart의 전반적인 정보를 담고 있다.
charts : chart 속에 또 다른 여러 chart들을 넣을 수 있다. 기본적으로는 비어있다.
templates/ : chart의 뼈대가 되는 쿠버네티스 리소스가 들어있는 폴더이다.
values.yaml : 사용자가 정의하는 설정값을 가진 YAML 파일이다.
/helm-test-seung/mychart $ ls -l
total 16
-rw-r--r-- 1 ubuntu ubuntu 1143 Feb 21 00:24 Chart.yaml
drwxr-xr-x 2 ubuntu ubuntu 4096 Feb 21 00:24 charts
drwxr-xr-x 3 ubuntu ubuntu 4096 Feb 21 00:24 templates
-rw-r--r-- 1 ubuntu ubuntu 1874 Feb 21 00:24 values.yaml
- 주요 파일의 내용을 보면, templates 폴더 아래에 service.yaml 파일을 열어보면, 아래와 같다.
그리고 아래의 내용중에서 placeholder({{ key }})가 있는 것을 볼 수 있는데 아래의 주석 내용과 같이 서비스 타입 및 서비스 포트등을 지정 할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }} # 서비스 타입 지정
ports:
- port: {{ .Values.service.port }} # 서비스 포트 지정
targetPort: http
protocol: TCP
name: http
selector:
{{- include "mychart.selectorLabels" . | nindent 4 }}
- 이번에는 values.yaml 파일을 살펴볼건데 위에 기본 설명에서 언급 했듯이 values.yaml 파일을 실제 리소스의 값이 매핑되어 들어간다. 아래의 내용을 살펴보자.
- 전체 내용은 접근글로 확인을 하고, 수정해야할 부분만 추려내면 아래와 같다.
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP # 값을 변경 → LoadBalancer
port: 80 # 값을 변경 → 8080
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
- 수정해야할 부분은 service: 부분만 확인 후 수정하자.
- service.type과 service.port를 각각 로드밸런서와 8888로 수정한다.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverried: ""
...
service:
type: LoadBalancer
port: 8888
...
- values.yaml 수정이 완료되면 helm chart를 설치한다.
4. chart 설치
- 설치 명령어는 아래와 같다.
helm install <CHART_NAME> <CHART_PATH>
- 만약 설치 시 아래와 같은 에러메세지가 발생하면 eks 및 k8s와 연결을 해줘야 한다.
Error: INSTALLATION FAILED: Kubernetes cluster unreachable: the server has asked for the client to provide credentials
- 연결은 여러가지 방법이 있겠지만, 각자 찾아서 알맞는 방법으로 연결? 로링을 해주면 된다.
- 생성을 합면 아래와 같은 메세지가 뜬다. 명령어 : helm install seung ./mychart
/helm-test-seung $ helm install seung ./mychart
NAME: seung
LAST DEPLOYED: Tue Feb 21 01:00:27 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace default svc -w seung-mychart'
export SERVICE_IP=$(kubectl get svc --namespace default seung-mychart --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo http://$SERVICE_IP:8080
- service 리소스를 조회해보면 values.yaml 파일에서 정의한 것과 같이 service는 로드밸런서 타입에 8080 포트를 사용하는 것을 확인 할 수 있다.
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 74d
seung-mychart LoadBalancer 172.20.6.61 aaaaaaaaabbbbbbbbbbccc.ap-northeast-2.elb.amazonaws.com 8080:30769/TCP 26s
- 해당 LoadBalancer의 EXTERNAL - IP:8080 으로 접근해보면 아래와 같이 Nginx의 사이트가 활성화 되어 있는 것을 확인 할 수 있다.
5. chart 리스트 조회
- chart를 조회하는 명령어는 매우 간단하다. helm list 로 조회가 가능하고, helm list -n {namespace} 를 활용하여 namespace별 리소스 조회도 가능하다.
- 실제로 리소스를 조회하면 2개의 리스트 항목이 나오는데, 첫번째 리스트는 helm 으로 설치한 efs 볼륨 리소스이고, 두번째는 위에서 생성한 seung 라는 nginx 리소스 이다.
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
efs-provisioner default 1 2023-01-09 00:58:00.174011084 +0000 UTC deployed efs-provisioner-0.13.2 v2.4.0
seung default 1 2023-02-21 01:00:27.939086941 +0000 UTC deployed mychart-0.1.0 1.16.0
- 이렇게 helm chart를 통해 간단한 nginx 웹서버를 배포하는 방법과 helm으로 배포된 리소스의 list를 조회하는 방법에 대해서 알아보았다.
다음에는 chart 리스트 조회 및 추가적인 기능들에 대해서 알아보자.
'Helm (헬름) > Helm chart' 카테고리의 다른 글
Helm Chart Customizing - nginx (0) | 2023.03.09 |
---|---|
Terraform으로 EKS 클러스터 생성 및 HELM Chart로 리소스 구현 (0) | 2023.03.08 |
helm chart 설치 오류 해결하기 (0) | 2023.03.08 |
helm 원격 리포지토리 (Repository) (0) | 2023.02.21 |
helm chart 렌더링, 업그레이드, 삭제 및 상태 확인 (0) | 2023.02.21 |