Helm : Chart Dependency 관리

    이 글은 책과 문서를 참고해서 실습하며 정리한 글입니다. 사실과는 다른 내용이 있을 수 있습니다. 있는 경우에 댓글로 알려주시면 수정하겠습니다. 감사합니다.

     

    차트 디펜던시 관리

    Chart Dependency는 해당 Helm Chart를 설치할 때 필요로 하는 의존성 차트를 설치할 때 사용된다. Chart Dependency는 Chart.yaml 파일의 dependencies 필드에 설정된다. 

    dependencies:
    - condition: memcached.enabled
      name: memcached
      repository: https://charts.bitnami.com/bitnami
      version: 6.x.x
    - condition: mariadb.enabled
      name: mariadb
      repository: https://charts.bitnami.com/bitnami
      version: 11.x.x

    예를 들어 bitnami/wordpress 차트의 Chart.yaml 파일을 확인하면 위와 같은 녀석이 작성된 것을 볼 수 있다. dependencies의 각 구성 요소는 총 7개다. 

    필드 정의 필수 여부
    name dependency chart 이름 O
    repository dependency chart가 있는 위치 O
    version 포함할 dependency chart 버젼
    version은 11.x.x로 와일드 카드를 지원함.
    O
    alias 디펜던시를 간략히 부르는 이름 X
    condition 디펜더시를 포함해야하는 여부를 결정
    True / False임. 
    X
    import-values dependency chart의 값을 상위 차트로 전파 X
    tags dependency chart를 포함할지 여부를 결정하는 불리언 값 list X

    여기서 무조건 필요한 것은 dependency name / repository / version 정보다. 추가적으로 알아두면 좋은 부분은 다음과 같다.

    • version : Version 정보는 10.x.x와 같이 와일드카드를 지원함.
    • condition / tags : 해당 dependency chart를 활성화 할지를 values.yaml에 있는 값으로 통제할 수 있음. 
    • import-values : dependency chart(child chart)에 있는 값을 parent chart에서 사용할 수 있도록 한다. 

     

     

    Dependency Download : Chart.yaml vs Chart.lock

    Chart를 다운 받고 압축을 풀어보면 폴더에 Chart.yaml / Chart.lock 파일이 있다. 비슷해 보이는 이름인데 둘은 무슨 역할을 할까?

    • Chart.yaml : Desired State를 의미한다.
    • Chart.lock : 적용된 Dependency의 실제 상태를 의미한다. 

    Helm은 Chart.yaml 파일을 보고 Dependency Chart를 구성한다. Chart.yaml에는 Version 정보가 와일드 카드로 들어갈 수도 있고, 조건 제어를 통해 특정 Chart를 생성을 제어할 수 있다. 따라서 Chart.yaml 파일은 완벽히 Helm Chart가 생성되는 것을 의미하지는 않는다. 

    Helm은 Chart.yaml 파일을 보고 Dependency Chart를 생성하는데 이 때, Chart.lock 파일이 생성된다. Chart.lock 파일은 실제로 적용된 Dependency의 상태가 기록된다. 예를 들어 와일드카드로 등록된 Chart Version 정보가 확정될 수도 있고, 조건 제어에 의해서 어떤 차트는 생성되지 않을 수도 있다. Chart.yaml과 Chart.lock은 다음과 같은 차이가 있다! 

    위에서 볼 수 있듯이 Chart.yaml에서 mariadb의 버전은 11.x.x로 표기되어있지만 Chart.lock에서는 11.3.3로 명시되어있다. 이것은 helm이 Chart.yaml을 읽고 11.x.x를 다운받을 것을 지시했고, 다운로드 된 실제 버전이 11.3.3인 것을 의미한다. 

    명령 정의
    helm dependency update Chart.yaml 파일을 바탕으로 charts/ 디렉토리를 업데이트 하고 Chart.lock 파일을 생성한다.
    Chart.lock 파일이 있는 경우 재생성한다.
    helm dependency build Chart.lock 파일을 기반으로 charts/ 디렉토리를 재빌드 한다.
    Chart.lock 파일이 없는 경우 'update' 명령과 동일하다.
    helm dependency list 주어진 차트에 대한 디펜턴시를 나타낸다. 

    위는 helm dependency와 관련된 명령어다 여기서 헷갈리는 부분이 있을 수 있다. update / build는 무슨 차이가 있는지를 살펴볼 수 있다.

    build 명령어는 chart.lock 파일을 바탕으로 다시 chart를 재빌드한다. 쉽게 말해서 chart.lock 파일에 기록된 것과 동일한 차트를 다시 한번 빌드할 수 있다는 것을 의미한다(예를 들면 버전). 반면에 update 명령어는 chart.yaml 파일을 바탕으로 빌드를 하기 때문에 이전에 생성된 chart.lock과 새롭게 빌드된 차트가 다를 수 있다는 것을 의미한다. 

     

    조건부 디펜던시 (condition / tags)

    Chart.yaml 파일에서 Dependency를 입력할 때 어떤 경우에는 특정 dependency Chart를 제외하고 싶은 경우가 있다. 이 때는 condition / tags 필드를 이용해서 처리할 수 있다. condition은 특정 차트 하나만을 관리하는데 사용되고, tags는 여러 차트를 그룹핑해서 관리할 때 사용된다. 

    dependencies:
    - condition: memcached.enabled, memcached.enabled1
      name: memcached
      repository: https://charts.bitnami.com/bitnami
      version: 6.x.x

    condition에 평가 결과가 true, false인 녀석을 넣을 수 있다. 위와 같이 작성을 할 수는 있지만, 가장 앞에 있는 평가 결과에 의해서 Chart Dependency가 결정된다. (실험적으로 해봄). 예를 들어 True / <아무거나>인 경우에는 항상 이 차트는 생성된다. 반면 False / <아무거나>인 경우에 항상 이 차트는 생성되지 않는다. 

    dependencies:
    - condition: memcached.false
      name: memcached
      repository: https://charts.bitnami.com/bitnami
      version: 6.x.x
      tags :
        - hello
        - ballo
        - callo

    tags 필드를 이용하는 경우도 살펴보자. tags는 함께 사용되는 차트가 있을 경우 주로 사용한다. 예를 들어 memcached와 mariaDB가 항상 함께 켜져야 하는 경우 tags 필드를 이용해서 관리할 수 있다. 이 때, tags 필드에 있는 녀석이 true로 평가될 경우 해당 chart는 생성된다. 유의해야할 점은 tags 필드에 넣을 녀석은 반드시 values.yaml의 tags 아래에 선언이 되어있어야 한다. 

    # values.yaml
    tags:
      hello: false
    
    abc:
      qwer: false

    예를 들어 hello는 chart.yaml의 tags에서 인식할 수 있지만, abc.qwer는 인식할 수 없다.

    - name: memcached
      repository: https://charts.bitnami.com/bitnami
      version: 6.x.x
      tags :
        - hello
        - ballo
        - callo

    tags에는 여러 필드가 들어갈 수 있다. 이 때 각 필드의 결과들 중 하나라도 true가 있다면 해당 차트는 생성된다. 

    condition tags 생성
    true true O
    true false O
    false true X
    false false X

    우선순위는 다음과 같다. condition 필드가 설정되어있으면 항상 condition 필드의 결과를 따른다. 

    Condition / Tags를 정리하면 다음과 같다.

    • condition 
      • 하나의 차트를 관리할 때 사용한다. 
      • 여러 개를 나열할 수 있지만, 가장 앞에 있는 condition 필드의 평가 결과에 의해 결정된다. 
      • values.yaml의 임의의 필드에서 선언할 수 있다.
      • 태그가 존재하지 않으면 무시된다. 즉, true로 평가된다.
      • 반드시 최상단 values.yaml에 선언되어야 함.
    • tags
      • 여러 차트를 한번에 관리할 때 사용한다.
      • condition 필드가 설정되어있으면 무시된다
      • 여러 개를 나열할 수 있다. 하나라도 true인 경우에 평가 결과는 true다. 모두 false인 경우 생성되지 않는다.
      • values.yaml의 tags 아래에 필드가 선언되어야 한다. 
      • 태그가 존재하지 않으면 무시된다. 즉, true로 평가된다.
      • 반드시 최상단 values.yaml에 선언되어야 함.

     

     

    부모 차트에서 자식 차트로 값 넘겨주기

    부모 차트에서 자식 차트를 호출할 때, 부모 차트가 원하는대로 자식 차트에게 값을 주고 싶을 때가 있다. 이 경우 이용하는 방법이다. 방법은 다음과 같다.

    1. 부모의 values.yaml에 자식 차트의 이름을 선언하고, 아래에 넘겨주고 싶은 필드과 값을 선언한다.
    2. 1번 작업을 하면 자식 차트의 values.yaml에 1번에서 선언한 필드가 존재하지 않아도 자식 차트의 template에서 사용할 수 있게 된다. 

    순서대로 따라가보면 다음과 같다.

    # values.yaml // parent chart
    child:
      my_value: 100

    parent chart의 values.yaml에서 child 차트명을 표시하고(여기서는 child), 그리고 선언하고 싶은 value의 값을 정한다. 

    # values.yaml // child chart
    my_value: 200

    child 차트의 values.yaml 파일은 다음과 같이 작성한다. 이 때, 자식 chart의 values.yaml에 부모 차트에서 선언한 필드가 존재하지 않아도 사실 아무 상관이 없다. 

    # child → templates/deployment.yaml
    my_value: {{ .Values.my_value }}

    다음과 같이 값을 불러온다. 

    실행 결과는 다음과 같다. 

    정리하면 다음과 같다.

    1. 부모 차트의 values.yaml에서 내려줘야할 자식 차트의 이름을 명시하고, 내려줄 값을 정의한 필드를 작성한다.
    2. 자식 차트에서는 1번에서 선언한 필드의 유무와 상관없이 해당 값을 가져다 쓸 수 잇다. 

     

    import-values를 통한 값 가져오기

    Chart.yaml에 import-values 필드를 이용해서 자식 차트에 정의된 값을 부모 차트에 가져올 수 있다. 여기서 한 가지 유의할 점은 부모 차트에 이미 정의된 필드가 있다면, 자식 차트에서 import-values를 하더라도 적용되지 않는다는 것이다. 가져오는 방법은 두 가지가 있다. 

    exports를 이용해서 가져오기

    1. 자식 차트의 values.yaml에 exports 필드에 노출할 값을 설정한다.
    2. 부모 차트의 Chart.yaml에서 import-values에 설정한다. 
    3. .Values.{필드}로 접근한다. 
    # 자식 차트 / values.yaml
    exports:
      my_data:
        my_int: 100
        my_abc: 200

    자식 차트에서 다음과 같이 선언한다. 

    # 부모 차트 / chart.yaml
    dependencies:
    - condition: mariadb.enabled
      name: mariadb
      repository: https://charts.bitnami.com/bitnami
      version: 11.x.x
      import-values:
        - my_data

    부모 차트의 chart.yaml에 import-values로 넣는다. 이 때 my_data를 넣으면, my_int / my_abc가 부모 차트의 Values.yaml에 선언된 것과 동일하다. 대신에 이미 부모 차트에 선언된 필드가 있다면, 부모 차트의 값은 그대로 유지된다. 

    # 부모 차트 / deployment.yaml
    parent_value1: {{ .Values.my_int}}
    parent_value2: {{ .Values.my_abc}}

    사용할 때는 다음과 같이 사용할 수 있다. 부모 차트의 Values.yaml에 값이 추가된 것과 동일하다고 이해하고 사용하면 된다. 

    child - parent를 이용해서 가져오기

    1. 자식 차트의 values.yaml에 값을 설정한다.
    2. 부모 차트의 Chart.yaml에서 import-values에 설정한다. 이 때, child / parent 필드를 설정하고 각 경로를 설정한다. 
    3. 부모 차트의 values.yaml에 값이 들어간다.

    앞서 했던 것과 동일하게 부모 차트에 이미 선언된 값이 있다면 자식 차트의 값이 들어가지는 않는다. 그리고 child / parent 필드를 설정하게 되면서 child에 지정된 child 차트의 값이 parent에 지정된 parent 차트의 경로에 들어가는 것으로 이해할 수 있다. 

    # 자식 차트 / values.yaml
    default:
      data:
        my_int: 999
        my_bool: true

    자식 차트에 부모 차트에서 사용할 값을 정의한다. 이 떄 exports 필드 밑에 두지 않는다.

    # 부모 차트 / chart.yaml
    dependencies:
    - condition: mariadb.enabled
      name: mariadb
      repository: https://charts.bitnami.com/bitnami
      version: 11.x.x
      import-values:
        - child: default.data
          parent: my_import

    부모 차트에서는 import-values를 사용할 때 child / parent 필드를 사용한다

    • child : 자식 차트에서 값을 읽어올 영역
    • parent : 부모 차트에 값을 넣을 영역 

    이 때 자식 차트에서 불러온 필드 중에서 이미 부모 차트에 있는 필드라면, 부모 차트에 선언된 값이 유지된다. 

    # 부모 차트 / deployment.yaml
    parent_value: {{ .Values.my_import }}

    사용할 때는 부모 차트의 변수를 이용해서 한다. 

     

    'Dev-Ops > helm' 카테고리의 다른 글

    Helm : 지명 template (named template) / helpers.tpl  (0) 2022.11.03

    댓글

    Designed by JB FACTORY