본문 바로가기

Helm (헬름)/Helm chart

helm을 활용한 k8s 리소스 매니징 및 nginx 배포

728x90
반응형

# 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 설치 및 기본 명령어 정리

 

Helm이란? 및 기본 명령어 정리

Helm 차트를 활용한 애플리케이션 패키지 배포 쿠버네티스 애플리케이션 관리를 지원하는 도구 Helm 이란? Helm 은 쿠버네티스 package managing tool 이다. node.js 의 npm 과 비슷한 형태로 쿠버네티스 패키

may9noy.tistory.com

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 리스트 조회 및 추가적인 기능들에 대해서 알아보자.

728x90
반응형