Helm-Chart 작성

Moon's DevOps·2023년 6월 21일
0

Devops

목록 보기
1/2

helm-chart 생성


Helm의 장점

  1. 쿠버네티스의 다양한 리소스로 구성된 패키지를 관리하는 쿠버네티스 패키지 매니저이다. ( yum, apt와 같음)

  2. helm 차트를 사용하면 복잡한 쿠버네티스 애플리케이션을 쉽고 간단하게 정의할 수 있고 업그레이드가 가능하다.

  3. 기존 파일과 내용을 유지한 채 업데이트 가능

  4. 원격 repository 등을 통해 애플리케이션을 쉽게 공유할 수 있고 형상관리가 가능하다.

  5. Rollbacks기능을 지원 하므로 간단하게 이전의 버전으로 롤백이 가능하다.

  6. Helm chart 생성 가이드

$ 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
  1. helm-chart 생성
$ helm create [name]

helm 뼈대가 완성되었으므로 작성을 시작하면 된다!

helm-chart 작성 시 imagepullsecrets에서 syntax 오류가 발생하여 기록 중

imagepullsecrets - official docs

차트 개발 팁과 비법

imageCredentials:
  registry: quay.io
  username: someone
  password: sillyness

---
helper template
{{- define "imagePullSecret" }}
{{- with .Values.imageCredentials }}
{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"email\":\"%s\",\"auth\":\"%s\"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }}
{{- end }}
{{- end }}

---

apiVersion: v1
kind: Secret
metadata:
  name: myregistrykey
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: {{ template "imagePullSecret" . }}

이 방법 말고 다른 방법을 사용하여 해결 했습니다.

helm-chart

template/deployment.yaml

spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}

values.yaml

imagePullSecrets:
  - name: ecr-secrets

간단한 방법으로 imagepullsecrets 오류를 해결했습니다. !

추후에 helm syntax에 대해서 자세하게 정리


Helm-chart 작성

  • 기본 helm-chart 생성 시 → Chart.yaml → template → deployment.yaml → hpa.yaml → service.yaml → 등 다양한 resource.yaml 파일 생성 → values.yaml
  • template
    • helm-chart key값들을 정의하는 역할
  • values.yaml
    • 기존 template에 있는 key값들의 values들을 설정하는 역할

비교하기 쉽게 values.yaml과 template에 있는 yaml들을 비교하면서 설명

values.yaml

#replicaCount: 1

image:
  repository: [private-repository] 
  pullPolicy: IfNotPresent
  tag: ["tag-num"]

imagePullSecrets: 
  - name : [private-repository-secret]

containers:
  resources:
    limits:
      cpu: 100m
      memory: 200Mi
    requests:
      cpu: 100m
      memory: 200Mi

service:
  type: LoadBalancer
  ip: "" 
  port: 8080

autoscaling:
  enabled: true
  minReplicas: 1
  maxReplicas: 3
  targetCPUUtilizationPercentage: 50
  targetMemoryUtilizationPercentage: 50

nodeSelector: []

tolerations: []

affinity: {}

template → deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
  labels:
spec:
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Release.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: {{ .Release.Name }}
              containerPort: 8080
          resources:
            limits:
              memory: {{ .Values.containers.resources.limits.memory }}
              cpu: {{ .Values.containers.resources.limits.cpu }}
            requests:
              memory: {{ .Values.containers.resources.requests.memory }}
              cpu: {{ .Values.containers.resources.requests.cpu }}

예를 들어서 설명을 하면

resources:
  limits:
    memory: {{ .Values.containers.resources.limits.memory }}
    cpu: {{ .Values.containers.resources.limits.cpu }}
  requests:
    memory: {{ .Values.containers.resources.requests.memory }}
    cpu: {{ .Values.containers.resources.requests.cpu }}

memory 부분을 보면 “ {{ .Values.containers.resources.limits.memory }} “

  • 노란색 배경의 뜻 : values.yaml에있는
  • 회색 배경의 뜻 : values.yaml에 containers 하위 리소스
  • 파란색 배경의 뜻 : values.yaml에 containers 하위에 있는 resources
  • 빨간색 배경의 뜻 : values.yaml에 containers 하위에 있는 resources의 하위 값

따라서 쉽게 생각하면 ‘ . ‘을 기준으로 values.yaml에 하위리소스 라고 보면 됩니다.

  • 또한 {{ .Release.Name }} 의 뜻은 배포할 때 이름을 value 값으로 가져와서 추가적으로 넣어 준다는 뜻 입니다.

들여쓰기에 항상 주의해 주세요.

helm-chart if문 설정

{{- if .Values.autoscaling.enabled }} #만약 values.yaml에서 autoscaling 기능이 enable되어있으면 true, 아니면 false
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: {{ .Release.Name }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ .Release.Name }}
  minReplicas: {{ .Values.autoscaling.minReplicas }}
  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
  metrics:
    {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
    {{- end }}
    {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
    {{- end }}
{{- end }} # if 문 eof
  • if문을 작성시 {{- end }} 를 사용하여 마무리를 지어 줘야함.
  • {{- if .Values.autoscaling.enabled }} → if문 사용시 values.yaml에서 autoscaling key의 values값이 enabled 시 if문 실행 단, {{- end }} 문까지 ( if 와 end는 helm-chart에서 한쌍으로 이루어짐)

helm-chart with, toYaml, nindent 설정

{{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
  • nindent - 의미하는 바는 들여쓰기를 의미 yaml형식이므로 들여쓰기가 중요한데 helm-chart에서는 nindent로 들여쓰기를 사용함 8은 8칸을 띄어쓰기 하겠다는 의미
  • toYaml - ‘ toYaml . ’ 은 ‘ . ‘ 현재 yaml을 참조하겠다는 뜻 ‘ . ‘ 대신 다른 yaml을 생성하여 넣을 수 있음
  • with도 end와 같이 한쌍

이 외에도 많은 문법이 있지만

  • {{ .Values.autoscaling.minReplicas }}
  • {{ if.~ }} 와 {{- end }} 를 사용하여 간편하고 이해하기 쉽게 생성가능
    • 개인적으로 위에 2개의 문법을 많이 사용함.
profile
Devops, AWS infra

0개의 댓글