계층 구조 컨트롤러는 계층적 기능을 Kubernetes 네임스페이스에 추가하여 더 많은 정교한 정책을 작성하고 관측 가능성을 개선하며 클러스터 관리를 위임할 수 있습니다.
계층 구조 컨트롤러는 오픈소스 프로젝트인 계층적 네임스페이스 컨트롤러(HNC)를 기반으로 합니다. 클러스터에서 실행되는 Kubernetes 컨트롤러 및 동적 승인 컨트롤러를 사용하여 구현됩니다.
계층적 네임스페이스
Kubernetes에서 네임스페이스는 대부분의 객체 조직의 기본 단위입니다. 또한 Kubernetes에서 격리 및 보안의 기본 단위를 형성합니다. 대부분의 정책 및 격리 객체는 RBAC 역할, 보안 비밀, 서비스 계정, 리소스 할당량, 네트워크 정책과 같은 네임스페이스 수준에서 운영됩니다.
일반적으로 단일 마이크로서비스와 같은 최소 리소스 수와 리소스 및 정책을 포함하도록 각 네임스페이스를 범위 지정하여 클러스터 보안과 격리를 개선할 수 있습니다. 그러나 이렇게 하면 클러스터에 네임스페이스가 다량으로 구성되어 관리하기 어려울 수 있습니다.
이를 해결하기 위해 계층 구조 컨트롤러는 소유자에 따라 Kubernetes 네임스페이스를 그룹화하고 해당 그룹을 통합 단위로 조작할 수 있도록 하는 계층적 네임스페이스 개념을 도입합니다. 여러 팀에서 공유하는 클러스터에서 특히 유용하나 소유자가 사람일 필요는 없습니다. 예를 들어 자동화된 도구를 네임스페이스 집합의 소유자로 지정하는 것이 좋을 수 있습니다. 특히 매우 광범위한 권한이 필요하지만 작은 관련 네임스페이스 집합에만 액세스해야 하는 경우에 더욱 그렇습니다.
멀티 테넌트 사용 사례를 지원하기 위해 계층적 네임스페이스는 일반 Kubernetes 네임스페이스의 기능 외에도 여러 기능을 지원합니다.
- 정책 시행. 계층적 네임스페이스는 전파를 사용하여 상위에서 특정 정책을 상속할 수 있습니다. 예를 들어 이를 통해 '루트' 네임스페이스에 RBAC 권한을 부여할 수 있으며 계층 구조 컨트롤러는 RBAC 객체를 해당 하위 요소에 복사(전파)하여 이러한 권한이 모든 하위 네임스페이스에도 있도록 합니다. 또한 예외를 사용하여 세분화된 수준으로 전파를 제어할 수 있습니다.
- 정책 애플리케이션. 모든 계층적 네임스페이스에는 상위 항목을 반영하는 신뢰할 수 있는 잘 알려진 라벨이 포함됩니다. 이러한 라벨은 웹훅 구성 또는 네트워크 정책 유효성 검사와 같은 정책에 대한 라벨 선택기에서 사용할 수 있습니다.
- 계층적 할당량. 상위 네임스페이스에서 단일 계층적 할당량을 정의할 수 있으며 한도는 해당 네임스페이스와 모든 하위 요소의 총 사용량에 자동으로 적용됩니다.
- 계층적 관측 가능성. 정책 애플리케이션에 사용되는 신뢰할 수 있는 라벨은 로그 또는 사용량을 필터링하는 등 계층적 워크로드를 관찰하는 데에도 사용할 수 있습니다.
- 위임된 네임스페이스 생성. 계층 구조 컨트롤러는 사용자에게 클러스터 수준 네임스페이스 권한이 없더라도 사용자가 기존 네임스페이스에서 만들 수 있는 하위 네임스페이스 개념을 도입합니다.
계층적 네임스페이스는 위임을 비롯한 광범위한 관리 기능도 지원합니다.
계층적 네임스페이스와 추상 네임스페이스 비교
계층 구조 컨트롤러에서 제공하는 계층적 네임스페이스는 구성 동기화 계층적 저장소를 사용하는 경우 사용할 수 있는 추상 네임스페이스와 유사합니다. 하지만 몇 가지 개념적인 차이가 있습니다.
- 추상 네임스페이스는 구성에 특정 구조를 적용하는 계층적 저장소에서만 정의될 수 있습니다. 계층적 네임스페이스는 구조화되지 않은 저장소에서 사용할 수 있으므로 원하는 대로 구성 파일을 정렬할 수 있습니다.
- 추상 네임스페이스는 Git 저장소에만 존재하는 반면에 계층적 네임스페이스는 일반 Kubernetes 네임스페이스이기도 하며 클러스터에 있습니다. 따라서 계층적 네임스페이스는 저장소 또는 클러스터에서 직접 정의할 수 있습니다.
- 계층적 네임스페이스를 만들려면 클러스터 수준 권한이 필요하지 않습니다. 대신 위임된 네임스페이스를 만드는 데 하위 네임스페이스를 사용할 수 있습니다.
- 계층적 리소스 할당량은 추상 네임스페이스가 아닌 계층적 네임스페이스에서만 지원됩니다.
- 추상 네임스페이스는 구성 동기화에만 사용될 수 있는 반면 계층적 네임스페이스는 오픈소스 개념을 기반으로 합니다.
추상 및 계층적 네임스페이스는 또한 일부 다른 기본 동작을 가집니다. 기본적으로 추상 네임스페이스에서 생성되는 모든 객체는 하위 요소에 전파됩니다. 반대로 계층적 네임스페이스의 객체는 계층 구조 컨트롤러가 해당 객체 유형을 전파하도록 구성된 경우에만 전파됩니다.
기본적으로 RBAC 역할과 역할 결합만 전파되지만 네임스페이스화된 객체는 전파될 수 있습니다. 정책 객체(예: 역할)와 리소스 객체(예: 구성 맵)만 전파하는 것이 좋습니다. 계층 구조 컨트롤러는 포드, 배포, 작업과 같은 워크로드 객체를 전파하도록 설계되지 않았으며 이러한 방식으로 사용될 경우 의도하지 않은 결과를 초래할 수 있습니다. 워크로드를 리프 네임스페이스에 배치하는 것이 좋습니다.
구성 동기화에서 계층 구조 컨트롤러 사용
계층 구조 컨트롤러를 사용하면 여러 팀에서 사용되는 클러스터를 비롯한 여러 애플리케이션에 적합한 계층적 개념을 사용하여 정책을 정의하고 적용할 수 있습니다. 구성 동기화를 사용하면 Git 저장소에 이러한 정책을 저장하고 클러스터 그룹에 적용할 수 있습니다. 이 두 기능은 다르지만 무료이며 여러 팀, 멀티 클러스터 환경에서 GitOps를 적용할 수 있는 강력한 방법을 제공합니다.
구성 동기화에서 계층 구조 컨트롤러를 사용하는 경우 구조화되지 않은 저장소를 사용하여 구성 동기화 추상 네임스페이스를 사용 중지하고 계층 구조 컨트롤러를 사용하여 계층 구조를 정의하고 정책을 전파하는 것이 좋습니다. 저장소에 체크인하려는 네임스페이스의 경우, 하위 네임스페이스가 아닌 전체 네임스페이스에 대한 구성만 체크인하세요. HierarchicalConfiguration
객체를 수정하여 하위 네임스페이스의 계층적 관계를 업데이트할 수 있기 때문입니다.
계층적 저장소에서 구성 동기화 추상 네임스페이스와 함께 계층 구조 컨트롤러를 사용할 수 있지만 제한된 방식으로만 사용할 수 있습니다. 예를 들어 계층 구조 컨트롤러를 사용하면 계층적 저장소에 정의된 두 네임스페이스 간에 계층적 관계를 만들 수 없습니다. 해당 저장소의 추상 네임스페이스와 충돌할 수 있기 때문입니다. 그러나 다음과 같은 방법으로 계층적 저장소에 계층적 네임스페이스를 사용할 수 있습니다.
- 클러스터에서 계층적 저장소에서 생성된 네임스페이스 아래에 셀프서비스 하위 네임스페이스를 만들 수 있습니다. 하지만 해당 하위 네임스페이스의 구성은 확인하지 않는 것이 좋습니다.
- 여러 저장소를 사용 중인 경우 네임스페이스 저장소에 하위 네임스페이스 앵커를 만들 수 있습니다. 이는 계층 구조 컨트롤러가 지정된 네임스페이스 아래에 하위 네임스페이스를 만들도록 지시합니다. 이러한 하위 네임스페이스는 상위에서 구성된 모든 리소스를 상속하며 계층적 리소스 할당량에 의해 제한됩니다. 그러나 이러한 하위 네임스페이스에만 있어야 하는 리소스를 정의할 수는 없습니다. 구성 동기화는 네임스페이스 저장소의 모든 객체를 지정된 네임스페이스에 동기화합니다.