#kubernetes

쿠버네티스에서 애플리케이션을 배포할 때 pod, service, deployment, persistent volume claim 등 여러 리소스를 사용한다. 그리고 이러한 리소스를 사용하기 위해 yaml을 작성하여 배포한다. 그러나 리소스를 매번 작성하고 수정하는 작업이 반복된다면 꽤나 번거로운 일이 될 것이다. 매번 비슷한 yaml에 설정값만 조금씩만 다르기 때문이다 위와 같은 문제점을 해결해 줄 수 있는 것이 바로 helm이다. helm은 쿠버네티스를 배포하기 위해 사용되는 대표적인 패키지 툴이다. helm chart는 쿠버네티스 리소스를 묶은 패키지에 해당하고 yaml 형식으로 구성돼 있다.

helm은 node의 npm이나 ubuntu의 apt와 같은 패키지 매니지먼트 처럼 쿠버네티스 오브젝트 매니저라고 보면 된다. 그리고 리소스의 yaml들을 묶은 helm chart를 패키지라고 보면된다. helm을 사용하여 helm chart를 설치하고 애플리케이션을 배포할 수 있다.

헬름 기능

헬름에서 pod의 yaml은 다음처럼 작성해 공통화 시킬 수가 있다.

apiVersion: v1
kind: Pod
metadata:
  name: 
spec:
  cotainers:
  - name: 
    image: 
    ports:
    - containerPort: 

이렇게 사용하면 여러 종류의 pod를 하나의 yaml로 관리할 수 있게된다. 위와 같은 방식을 Value Injection이라고 한다. Value Injection은 value.yaml을 만들어서 사용하는 방법이 있고 helm을 실행할 때 —-set flag를 사용할 수 있다.

helm install -f myvalue.yaml -f override.yaml myredis ./redis
helm install --set name=prod myredis ./redis

helm을 이용하면 다음 그림과 같이 환경별로 만들 수 있다. [image:64B8A02E-31F5-4D45-A357-8C50EB3188D7-3257-00000A9F4CB22E49/featured.png]

release management & Tiller

helm2에서는 Tiller라는 release management가 있었다. Tiller는 helm chart들의 통합 관리와 설치를 위해 활용되는 특별한 pod이다. Tiller는 chart 실행과 관련된 history들을 보관하고있다. history를 확인하고 이전 버전으로 rollback이 가능하다. helm upgrade를 통해 helm chart 변경사항을 release할 수 있다.

  • value.yaml 수정
  • helm 차트 내용 수정

하지만 이 Tiller는 쿠버네티스 버전이 달라지면서 기능이 더 많아지자 너무 많은 권한으로 보안문제가 되었다. 버전3 부터는 Tiller가 아닌 API를 통해 생성된 Helm Chart 그 자체를 쿠버네티스에 저장하게 되었다.

Helm 실행과정

설치 과정은 생략

  1. 새로운 헬름 차트 생성
    helm create mychart
    
  2. mychart 디렉토리가 생성된다
    ls mychart
    Chart.yaml charts templates values.yaml
    
    • Chart.yaml: 차트 이름, 버전 등의 정보를 가지고 있다
    • charts: chart 속 여러 chart를 넣을 수가 있다
    • templates: chart의 뼈대가 되는 쿠버네티스 리소스들이 들어있다
    • values.yaml: 사용자가 정의하는 설정값을 가진 yaml이다
  3. 차트 설치
    # helm install CHART_NAME CHART_PATH
    helm install foo ./mychart
    
  4. 차트 리스트 조회
    helm list
    
  5. chart 렌더링, helm install이 되지 않고 결과물을 output으로 출력할 수 있다
    $ helm template foo ./mychart > foo-output.yaml
    

    ```yaml

    foo-output.yaml


    Source: mychart/templates/serviceaccount.yaml

    apiVersion: v1 kind: ServiceAccount metadata: name: foo-mychart labels: helm.sh/chart: mychart-0.1.0 app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo app.kubernetes.io/version: “1.16.0” app.kubernetes.io/managed-by: Helm —

    Source: mychart/templates/service.yaml

    apiVersion: v1 kind: Service metadata: name: foo-mychart labels: helm.sh/chart: mychart-0.1.0 app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo app.kubernetes.io/version: “1.16.0” app.kubernetes.io/managed-by: Helm spec: type: LoadBalancer ports:

    • port: 8888 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo —

      Source: mychart/templates/deployment.yaml

      apiVersion: apps/v1 kind: Deployment metadata: name: foo-mychart labels: helm.sh/chart: mychart-0.1.0 app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo app.kubernetes.io/version: “1.16.0” app.kubernetes.io/managed-by: Helm spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo template: metadata: labels: app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo spec: serviceAccountName: foo-mychart securityContext: {} containers:

      • name: mychart securityContext: {} image: “nginx:1.16.0” imagePullPolicy: IfNotPresent ports:
        • name: http containerPort: 80 protocol: TCP livenessProbe: httpGet: path: / port: http readinessProbe: httpGet: path: / port: http resources: {} —

          Source: mychart/templates/tests/test-connection.yaml

          apiVersion: v1 kind: Pod metadata: name: “foo-mychart-test-connection” labels: helm.sh/chart: mychart-0.1.0 app.kubernetes.io/name: mychart app.kubernetes.io/instance: foo app.kubernetes.io/version: “1.16.0” app.kubernetes.io/managed-by: Helm annotations: “helm.sh/hook”: test spec: containers:

    • name: wget image: busybox command: [‘wget’] args: [‘foo-mychart:8888’] restartPolicy: Never ```
  6. helm chart upgrade
    # helm upgrade chartName chartPath
    $ helm upgrade foo ./mychart
    
  7. chart 상태 확인
    $ helm status foo
    
  8. chart 삭제
    $ helm delete foo
    

출처

쿠버네티스 Helm이란? Helm 차트란? 컨테이너 핵심만 콕! 쿠버네티스(1) - helm 패키지 매니저