S-테라폼으로 헬름 설치할 때 네임스페이스 이슈

개요

이전부터 kube ops view를 설치할 때마다 이상한 현상이 발견돼 조금 더 관찰을 해봤다.

이슈

#################################################### 
##### kube ops view
#################################################### 
resource "helm_release" "kube_ops_view" {
  name      = "kube-ops-view"
  repository = "https://geek-cookbook.github.io/charts"
  chart      = "kube-ops-view"
  version = "1.2.2"

  namespace = "kube-system"
  create_namespace = true
  values = [
    <<-EOF
    env:
      TZ: Asia/Seoul
    service:
      main:
        type: NodePort
        ports:
          http:
            nodePort: 30005
    EOF
  ]
}

테라폼으로 헬름을 설치할 때, 네임스페이스 설정을 했다.
그런데 이 kube ops view의 경우 클러스터롤은 분명 kube-system에 배치가 되는데 핵심 워크로드는 default 네임스페이스에 배치되는 현상이 있다.
image.png
이런 식으로 말이다..

헬름 차트 분석

image.png
해당 차트 템플릿을 봤는데, 이렇게 common이란 곳에서 모든 include를 하는 것이 보인다.
image.png
이게 뭔가 했는데, 라이브러리 차트를 등록하여 사용하는 방식이란 것을 알게 됐다.
image.png
처음 이런 방식이란 것을 알게 된 것은 values 파일에 달린 주석덕분이었다.
image.png
아무튼 해당 파일을 찾아가 들어가보면..[1]
이런 식으로 네임스페이스에 대한 정보는 없이 템플릿이 설정돼있다.
그러나 기본적으로 서브 차트나 라이브러리 차트는 네임스페이스에 대한 명시적인 설정이 없다면 메인 차트가 배포되는 네임스페이스를 따라가는 것으로 알고 있는데 왜 이런 문제가 발생하는 것일까?

헬름 프로바이더의 문제

다음의 테스트를 해보고 나는 이것이 테라폼의 헬름 프로바이더에 문제가 있을 것이라고 추측했다.

helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30005 --set env.TZ="Asia/Seoul" --namespace kube-system

테라폼을 설정한 코드를 그냥 명령줄에 입력해보면..
image.png
아주 문제없이 제대로 내가 원하는 네임스페이스에 모든 게 배포된다.
즉, 헬름 자체는 위에서 말한 대로 그냥 다른 차트들이 메인 차트를 따라가도록 설정이 돼있다는 말이다.

그런데 테라폼을 이용해서 설치할 때만 유독 이런 문제가 발생한다?
그렇다면 프로바이더의 버그일 확률이 매우 높다는 것이 내 생각이다.
잠시 찾아보니 금새 나와 비슷한 이슈를 겪는 이슈를 찾을 수 있었다.[2]

코드 짧게 분석

image.png
안 그래도 커스텀 컨트롤러 만드려고 계속 고언어 코드에 익숙해져야 하는 차이니, 살짝 코드도 까보도록 한다.[3]
create 함수를 보면 client.Run을 통해 본격적인 헬름 차트 설치가 이뤄지는 것을 알 수 있다.
image.png
그리고 client 변수는 action.NewInstall을 통해 생긴다.
image.png
action은 패키지 이름으로, 헬름 패키지를 들어가면 찾아볼 수 있다. [4]
이 함수는 install 객체를 반환하는 역할을 하며 위에서 봤던 Run이 실제 배포를 담당하는 메서드임을 알 수 있다.
image.png
run은 이런 식으로 된다.
여기까지 보는 것도 좋지만, 기본 명령툴로는 괜찮은 것을 생각해보면 프로바이더 코드쪽에서 문제를 찾는 것이 맞지 않나 싶다.
테라폼 코드 상에서 run이 되기 직전에 install 오브젝트의 cfg을 제외한 다른 필드들이 세팅된다.
그리고 실제 run을 할 때 c, values를 인자로 전달한다.
image.png
이때 c는 차트의 정보를 담고 있는 것으로 생각된다.

시도

당장 기여를 할 생각까진 없고 단순히 코드를 해석하는 연습을 하기 위해 소스를 까본 거라 여기까지만 분석을 진행했다.
어떤 식으로 이 문제를 대응할 수 있을까 생각해보며 한 가지 테스트를 해봤다.

로컬에 저장된 레포지토리 때문이라면

헬름 프로바이더는 레포지토리에 url을 입력할 경우 로컬에 레포를 추가하지 않고 설치를 진행한다.
근데 로컬에 이미 레포가 있는 상태라면?
image.png
현재는 geek-cookbook이 로컬에 존재한다.
image.png
이걸 지우고 진행해봤는데, 문제는 동일했다.

버전 낮추기

당장 내가 사용하고 있는 프로바이더 버전은 3.0.0-pre2이다.
그렇다면 이전 버전에는 문제가 없었을까?
가장 최신 이전 버전이었던 2.17.0를 사용해본다.
image.png
메이저 버전이 바뀐 만큼 프로바이더 블록 설정이 달라진 부분이 있어서 조금 유의할 필요가 있다.
image.png
오옹.. 이번에는 문제 없이 잘 된다.
아무래도 최근 배포된 3.0.0 버전에서 어떤 코드의 변화가 발생했고, 이로부터 설정이 제대로 되지 않는다고 또 하나의 추측을 할 수 있겠다.

결론

명쾌한 원인을 규명해낸 것은 아니다.
여기에서 이전 릴리즈와 현재 릴리즈 간의 코드를 교차 분석하면서 명확하게 이유를 밝혀낼 수 있을 것이라 생각이 들긴 하지만, 당장 다른 할 일이 많은 관계로 추가적으로 진행하진 않았다.
그래도 당장 내가 활용하는데 있어서 버전을 다운그레이드하는 해결책을 찾을 수 있었다는 것으로 만족하려고 한다.
이제 다음 실습을 문제 없이 진행할 수 있게 됐으니까!

관련 문서

이름 noteType created
클라우드 엔지니어 인턴 과제 - 2024-08-05
Helm knowledge 2024-10-17
Terraform knowledge 2025-02-05
1주차 - 테라폼으로 프로비저닝, 다양한 노드 활용해보기 project 2025-02-05
2주차 - 테라폼 세팅 project 2025-02-09
2주차 - 네트워크 project 2025-02-25
2W - 테라폼으로 환경 구성 및 VPC 연결 published 2025-02-11
4W - 번외 AL2023 노드 초기화 커스텀 published 2025-02-25
8W - 가상머신 통합하기 published 2025-06-01
E-NFS 볼륨, 스토리지 클래스 설정 topic/explain 2024-10-17
E-이스티오 가상머신 통합 topic/explain 2025-06-01
E-앰비언트 모드 헬름 세팅 topic/explain 2025-06-03
S-vpc 설정이 eks 액세스 엔드포인트에 미치는 영향 topic/shooting 2025-02-07
S-테라폼으로 헬름 설치할 때 네임스페이스 이슈 topic/shooting 2025-04-07

참고


  1. https://github.com/k8s-at-home/library-charts/blob/main/charts/stable/common/templates/_deployment.tpl ↩︎

  2. https://github.com/hashicorp/terraform-provider-helm/issues/1591 ↩︎

  3. https://github.com/hashicorp/terraform-provider-helm/blob/main/helm/resource_helm_release.go#L679 ↩︎

  4. https://github.com/helm/helm/blob/main/pkg/action/install.go ↩︎