And Brain said,

Helm, 컨테이너 오케스트레이션을 위한 타륜 본문

IT/DevOps \ Architecture

Helm, 컨테이너 오케스트레이션을 위한 타륜

The Man 2023. 9. 8. 09:27
반응형

 
Kubernetes는 yaml 파일들을 사용하여 간단하고 편리하게 컨테이너 오케스트레이션을 가능하게 합니다. 하지만 이를 위해 우리는 복잡한 yaml 파일들을 관리해야 합니다. 우리는 이마저도 불편합니다.(불편하시길 바랍니다. -개발자들은 불편해야 더 간편한 도구를 만들기에-)
 
Helm은 Kubernetes의 패키지 관리자로 간주됩니다. 여기서 '패키지'는 Helm에서 '차트'라고 부릅니다. Helm을 사용하면 Kubernetes 애플리케이션을 정의, 설치 및 업그레이드하는 것이 더 쉬워집니다.
 
 
Helm의 설치는 매우 간단합니다.

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

 
Helm의 설치가 끝났다면,

helm create msa-chart

helm create 명령어로 여러분의 chart 를 만들어 줍니다. 저는 MSA 를 쿠버네티스로 배포할 것이기 때문에, msa-chart 로 만들겠습니다.
 
Helm chart의 디렉토리는 대략적으로 이렇게 될 것입니다.

msa-chart/
│
├── charts/
│
├── templates/
│   ├── discovery-deployment.yaml
│   ├── discovery-service.yaml
│   ├── apigateway-deployment.yaml
│   └── ... (다른 서비스들)
│
├── values.yaml
└── Chart.yaml

 
간단하게 디렉토리 내 파일들을 요약하자면,

Chart.yaml # 차트에 대한 정보를 가진 YAML 파일
values.yaml # 차트에 대한 기본 환경설정 값들
charts/ # 이 차트에 종속된 차트들을 포함하는 디렉터리
templates/ # values와 결합될 때, 유효한 쿠버네티스 manifest 파일들이 생성될 템플릿들의 디렉터리

이와 같습니다.
 
이제 각각의 YAML 파일들에 대해 알아보겠습니다. Helm 차트 공식 문서에 더 상세한 설명들이 있으니, 참고바랍니다. 여기서는 처음 Helm 차트를 만들었을 때 기본적으로 제공되는 YAML 파일에 대한 설명만 하겠습니다.
 
먼저, Chart.yaml 파일.

apiVersion: v2

name: msa-chart

description: A Helm chart for Kubernetes

type: application

version: 0.1.0

appVersion: "1.16.0"

 
apiVersion 은 Helm 차트 API 버전입니다. 현재 v2는  Helm 3에 해당하며, v1은 Helm2에 해당합니다. name은 차트의 이름입니다. type은 차트의 유형으로, application은 배포 가능한 일반적인 차트를 의미하며, library는 다른 차트에서 재사용할 수 있는 템플릿 또는 함수를 제공하는 차트를 의미합니다.
 
 
다음은, values.yaml 파일.

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

  port: 80


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: {}

 

replicaCount: 배포할 파드의 리플리카 수를 정의합니다.
image: 사용할 도커 이미지의 정보를 정의합니다.
imagePullSecrets: private 도커 레지스트리에서 이미지를 pull 할 때 필요한 시크릿을 명시합니다.
serviceAccount: 서비스 어카운트 관련 설정을 정의합니다.
podAnnotations: 파드에 추가할 주석을 정의합니다.
podSecurityContext 및 securityContext: 파드 및 컨테이너의 보안 설정을 정의합니다.
service: 서비스의 유형 및 포트를 정의합니다.
ingress: 인그레스 리소스 관련 설정을 정의합니다.
resources: 파드에 할당될 리소스의 제한 및 요청을 정의합니다.
autoscaling: 자동 스케일링 관련 설정을 정의합니다.
nodeSelector, tolerations, affinity: 파드의 스케줄링과 관련된 설정을 정의합니다.

  
이 values,yaml 파일에 서비스별로 다른 값들만 설정하고 그 값을 파라미터로 사용한다면, 하나의 템플릿만으로 여러 서비스의 배포를 관리할 수 있습니다.
 
Helm 차트 내 MSA 쿠버네티스 리소스 관련 yaml 파일 작성은 제 블로그 CI/CD Argonautica 시리즈에서 다시 찾아뵙도록 하겠습니다.
 
마지막으로, 기본적인 helm 명령어들을 알아보고 마치겠습니다.

helm install [RELEASE_NAME] [CHART_PATH]

이 명령어를 사용하여 쿠버네티스 클러스터에 애플리케이션을 배포할 수 있습니다.
 

helm upgrade [RELEASE_NAME] [CHART_PATH]

이미 설치된 helm 릴리스를 업데이트하려면 helm upgrade 명령어를 사용하시면 됩니다.
 
 

Thanks for watching, Have a nice day.

반응형
Comments