본문 바로가기
IT/Kubernetes

Helm으로 2 tier webapp 배포 (변수)

by rapker 2023. 4. 17.
반응형
Helm으로 2 tier webapp 배포 (종속성)에 이어지는 내용입니다.
 
지금까지 진행했던 결과인 현재 chart 구조
 
참고
 
목표
 
front_dep, front_svc에 정의된 이름들을 sample-vote/values.yaml에 정의하고,
helm 설치 시 인자로 받을 수 있는 부분까지 해보겠습니다.
 

 
 
values.yaml
 
templetes의 여러 yaml 파일들에서 values.yaml에 정의된 변수들을 참조하게 할 수 있습니다.
 
 
환경에 따른 values 선택
 
helm install을 통해 배포하는 행위를 release라고 하며 release할 때 아래와 같이 values.yaml을 참조하게 할 수 있습니다.
  • helm install <chart-name> . -f values.yaml
 
위 명령줄은 아래 명령줄과 정확히 동일하게 동작합니다.
  • helm install <chart-name> .
 
values.yaml을 명시하지 않더라도 기본 네이밍인 values.yaml을 참조하게 됩니다.
 
만약 환경이 다른 values.yaml들이 필요하다면 아래와 같이 사용할 수 도 있습니다.
  • helm install <chart-name> . -f values-prod.yaml
  • helm install <chart-name> . -f values-qa.yaml
  • helm install <chart-name> . -f values-dev.yaml
 
또, 하위 chart가 존재하는 경우 기본으로는 최상위 chart를 참조하지만 각 하위 chart에 존재하는 values.yaml로 재정의 할 수 있는 것 같은데 이것도 확인 해봐야겠습니다.
(확인해봐야 할게 계속 나오네요.... ㅎㄷㄷ)
 
 
 
value 친구 _helpers
 
잠깐 _helpers가 무엇인지만  찾아보고 지나가겠습니다.
 
values.yaml과 더불어 templates/_helpers.tpl도 유동적인 값을 사용할 수 있는데요
 
values가 단순히 값만 처리하는 반면 _helpers는 문장을 반환 할 수 있다는 차이가 있습니다.
 
이는 일반적인 코딩언어에서 사용되는 define 과 동일한 방식으로,
helm에서는 약간의 함수처럼 사용되는 것 같습니다.
 
templetes의 yaml파일들에서 _helpers.tpl의 값을 사용할 때는 include 형식으로 가져다 쓰입니다.
 
 
yaml에서 사용된 _helpers.tpl의 값은 요렇게 동작 합니다.
selector:
    {{- include "temp.selectorLabels" . | nindent 4 }}    <-- <요 부분이>
 
<렌더링을 거치면 아래와 같은 형식으로 치환 됩니다.>
 
selector:
    app.kubernetes.io/name: temp
    app.kubernetes.io/instance: myAppName-temp
 
그 밖에도 _helpers에서는 if 문 사용이 가능하여 조건에 따라 다른 문장을 사용하도록 할 수 도 있습니다.
 
언능 value파일 사용해보고 _helpers 파일도 사용해봐야겠습니다.
 
 
 
values.yaml 작성 및 svc,pod yaml 파일에 적용
 
 
values.yaml 작성
 
front-end에서 사용 될 service와 pod 의 변수 값을 작성 합니다.
frontInfo:
  app: vote-front
  service:
    type: LoadBalancer
    port: 80
  pod:
    replicaCount: 1
    image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
    resources:
      request:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 250m
        memory: 256Mi
    containerPort: 80
 
 
azure-vote-front_svc.yaml 작성
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.frontInfo.app }}-svc
spec:
  type: {{ .Values.frontInfo.service.type }}
  ports:
  - port: {{ .Values.frontInfo.service.port }}
  selector:
    app: {{ .Values.frontInfo.app }}
 
azure-vote-front_pod.yaml 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.frontInfo.app }}-pod
spec:
  replicas: {{ .Values.frontInfo.pod.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.frontInfo.app }}
  template:
    metadata:
      labels:
        app: {{ .Values.frontInfo.app }}
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: {{ .Values.frontInfo.app }}-con
        image: {{ .Values.frontInfo.pod.image }}
        resources:
          requests:
            cpu: {{ .Values.frontInfo.pod.resources.request.cpu }}
            memory: {{ .Values.frontInfo.pod.resources.request.memory }}
          limits:
            cpu: {{ .Values.frontInfo.pod.resources.limits.cpu }}
            memory: {{ .Values.frontInfo.pod.resources.limits.memory }}
        ports:
        - containerPort: {{ .Values.frontInfo.pod.containerPort }}
        env:
        - name: REDIS
          value: "azure-vote-back"
 
 
dry-run으로 렌더링 검사
helm install sample-vote . --dry-run --debug
 
내용이 길어 중간을 자르긴 했지만 정상적으로 렌더링 되었다는 결과도 받았고,
 
value를 적용 했던 svc, pod도 자세히 살펴보면 변수를 사용한 부분들에 값들로 바뀌어 있습니다.
 
vote-front-service
vote-front-pod
 
 
 

 

Helm Install
 
이제 AKS cluster에 배포 후 샘플앱 확인을 해보겠습니다.
helm install sample-vote .
 
pod
service
 
변수를 참조한 pod, service 네이밍 확인이 가능 하였고 앱도 정상 실행 되었습니다.
 
 
 
이쁘게도 잘 배포 되었네요
 
설치 했던 sample-vote release는 삭제하고 다음으로는 하위차트에서 변수 사용을 해보겠습니다.
 
helm uninstall sample-vote
 
 
 
 
반응형
LIST