디자인 결정

이 문서는 이 리포지토리 내의 Helm 차트 디자인에 관한 이유 및 결정 사항을 수집합니다. 제안은 환영합니다. 의사 결정 방법에 대해서는 의사 결정을 참조하세요.

문제가 될 수 있는 구성 사항 파악 시도

이러한 차트의 복잡성과 그들의 유연성 수준으로 인해, 예측할 수 없거나 전혀 기능하지 않는 배포로 이어질 수 있는 구성을 생성할 수 있는 일부 중첩이 있습니다. 알려진 문제 있는 설정 조합을 방지하기 위해 우리는 템플릿 로직을 구현하여 사용자에게 구성이 작동하지 않을 것임을 경고하는 것을 목표로 하고 있습니다.

이러한 템플릿 로직은 폐기 경고의 동작을 복제하지만, 기능적인 구성을 보장하기 위해 고안되었습니다.

!757 checkConfig: add methods to test for known errors에서 도입되었습니다.

폐기를 통한 중단 변경사항

이러한 차트의 개발 과정에서 가끔씩 기존 배포의 속성을 변경해야 할 개선사항이 발생합니다. 예를 들어 MinIO의 구성 사용의 중앙화와 외부 객체 저장 구성의 속성에서 시크릿으로의 이관이 그 중 하나입니다(우리의 선호에 따른 적용).

기능하지 않는 구성에 대해 업데이트된 버전의 차트를 실수로 배포하는 것을 방지하기 위해 우리는 폐기 알림을 구현하기로 선택했습니다. 이 알림은 속성을 검출하고, 재배치되거나 변경되었거나 완전히 제거된 것을 감지하고 구성에 어떤 변경사항이 필요한지 사용자에게 알립니다. 이는 속성을 시크릿으로 대체하는 방법에 대한 문서를 참조할 것을 사용자에게 알릴 수도 있습니다. 이러한 알림으로 Helm install 또는 upgrade 명령이 구문 오류를 내며 대응해야 할 목록을 완전하게 출력합니다. 우리는 사용자가 에러, 수정, 반복하는 루프에 빠지지 않도록 주의를 기울였습니다.

모든 폐기는 성공적인 배포가 일어나기 위해서 주소되어야 합니다. 우리는 사용자가 예상치 못한 동작 또는 디버깅이 필요한 완전한 실패를 경험하는 대신에 중단 변경사항에 대해 알림을 받기를 바랍니다.

!396 Deprecations: implement buffered list of deprecations에서 도입되었습니다.

initContainer에서 시크릿의 환경에 대한 선호도

대부분의 컨테이너 생태계에서는, 환경 변수를 통해 구성될 수 있는 능력이 있거나 기대됩니다. 이러한 구성 방법The Twelve-Factor App의 개념에서 비롯됩니다. 이는 여러 배포 환경에 걸쳐 구성을 대폭으로 단순화하지만, 암호나 개인 키와 같은 연결 시크릿을 컨테이너의 환경을 통해 전달하는 데에는 보안상의 우려가 남아 있습니다.

대부분의 컨테이너 생태계는 실행 중인 컨테이너의 상태를 검사할 수 있는 간단한 방법을 제공하는데, 이는 보통 환경을 포함합니다. 도커를 예로 들면, 데몬과 통신할 수 있는 모든 프로세스가 모든 실행 중인 컨테이너의 상태를 조회할 수 있습니다. 따라서 dind와 같은 특권이 있는 컨테이너가 있을 경우, 해당 컨테이너는 주어진 노드의 모든 컨테이너의 환경을 검사하고 그 안에 포함된 모든 시크릿을 노출시킬 수 있습니다. 완전한 DevOps 생명주기의 일환으로, dind는 이미 레지스트리로 푸시되고 이후 배포될 컨테이너를 빌드하는 데에 정기적으로 사용됩니다.

이러한 우려로 인해 우리는 민감한 정보를 initContainers를 통해 주입하는 것을 선호하기로 결정했습니다.

관련 이슈:

글로벌 차트로부터 배포되는 하위 차트

이 리포지토리의 모든 하위 차트는 글로벌 차트를 통해 배포될 수 있도록 설계되어 있습니다. 각 구성 요소는 여전히 개별적으로 배포될 수 있지만, 글로벌 차트에서 제공되는 공통 속성을 활용합니다.

이 결정은 리포지토리 전체의 사용 및 유지보수를 간단하게 만듭니다.

관련 이슈:

gitlab/*의 템플릿 파셜은 가능한 경우 전역적으로 설정되어야 합니다

gitlab/*의 모든 템플릿 파셜은 가능한 경우 글로벌 또는 GitLab 하위 차트 templates/_helpers.tpl의 일부여야 합니다. 포크된 차트의 템플릿은 해당 차트의 일부로 남아 있습니다. 이는 이러한 포크의 유지 관리 영향을 줄이는 데 도움이 됩니다.

이로 인해 얻을 수 있는 이점은 명확합니다:

  • DRY 동작의 증가로, 유지보수가 쉬워집니다. 하나의 항목이면 충분한 여러 하위 차트 간에 동일한 기능을 복제할 필요가 없어야 합니다.
  • 템플릿 이름 충돌의 감소. 차트 전체의 부분들은 함께 컴파일되므로, 우리는 그들을 글로벌 동작으로 취급할 수 있습니다.

관련 이슈:

포크된 차트

다음 차트는 포킹 가이드라인을 따라 이 저장소에서 포크되었거나 다시 생성되었습니다.

Redis

GitLab Helm 차트의 3.0 릴리스에서는 더 이상 상위 Redis 차트를 포크하지 않고 종속성으로 포함합니다.

Redis HA

Redis-HA는 3.0 이전에 우리 릴리스에 포함된 차트였습니다. 이제 제거되었으며 추가적인 HA 지원이 가능한 상위 Redis 차트로 대체되었습니다.

MinIO

우리의 MinIO 차트는 상위 MinIO에서 변경되었습니다.

  • 속성으로부터 새로운 것을 생성하는 대신 기존의 Kubernetes 시크릿을 활용합니다.
  • 민감한 키를 환경을 통해 제공하는 것을 제거합니다.
  • defaultBucket.* 속성 대신 defaultBuckets를 통해 여러 버킷을 자동으로 생성합니다.

레지스트리

우리의 레지스트리 차트는 상위 docker-registry에서 변경되었습니다.

  • 차트 내 MinIO 서비스의 사용을 가능하게 합니다.
  • GitLab 서비스에 대한 인증을 자동으로 연동합니다.

NGINX Ingress

우리의 NGINX Ingress 차트는 상위 NGINX Ingress에서 변경되었습니다.

  • TCP ConfigMap을 차트 외부로 허용하는 기능을 추가합니다.
  • 릴리스 이름에 기반하여 Ingress 클래스를 템플릿화할 수 있는 기능을 추가합니다.

차트 전체에서 사용된 Kubernetes 버전

서로 다른 Kubernetes 버전에 대한 지원을 최대화하기 위해, 현재 안정적인 Kubernetes 릴리스보다 하위 버전인 kubectl을 사용합니다. 이렇게 함으로써 적어도 세 가지 이상의 Kubernetes 하위 버전을 지원할 수 있어야 합니다. kubectl 버전에 대한 자세한 토론은 이슈 1509를 참조하십시오.

관련 이슈:

관련 머지 요청:

CNG으로 제공되는 이미지 변형

날짜: 2022-02-10

CNG 프로젝트는 Debian 및 UBI를 기반으로 하는 이미지를 배송합니다. 두 배포 형식의 구성을 유지하기로 한 결정은 다음을 기반으로 합니다:

  • Debian 기반 이미지를 배송하는 이유:
    • 이력, 선례
    • 배포에 대한 이해
    • 커뮤니티 vs. “기업”
    • 지정된 공급업체에 대한 인식 부재
  • UBI 기반 이미지를 배송하는 이유:
    • 일부 고객 환경에서 필요
    • RHEL 인증 및 OpenShift 마켓플레이스 / RedHat 카탈로그 포함을 위해 필요

이 주제에 대한 추가 토론은 이슈 #3095에서 찾을 수 있습니다.