이 페이지에서는 구성 동기화를 사용하여 네임스페이스를 관리하고 구성 동기화가 네임스페이스에 동기화할 객체를 선택하는 방법을 설명합니다.
Kubernetes 리소스 객체는 리소스 유형에 따라 클러스터 범위 또는 네임스페이스 범위가 될 수 있습니다. 특정 클러스터와 통신하도록 클라이언트를 구성하여 클러스터를 선택합니다. 객체 매니페스트에서 metadata.namespace
필드를 구성하여 네임스페이스를 선택합니다. 구성 동기화에는 클러스터 선택기 및 네임스페이스 선택기라는 추가 기능이 있어 동기화되는 객체를 더욱 세부적으로 조정할 수 있습니다.
이 페이지를 읽기 전에 다음 Kubernetes 개념을 숙지해야 합니다.
구성 동기화로 객체 범위 지정에 관한 정보
기본적으로 클러스터에 또는 Fleet 기본값으로 구성 동기화를 설치하면 구성 동기화가 정보 소스의 Kubernetes 객체를 모두 구성 동기화가 설치된 클러스터 또는 Fleet의 모든 클러스터에 동기화합니다. 하지만 객체를 클러스터 또는 네임스페이스로 범위 지정하면 클러스터 또는 네임스페이스에 동기화되는 객체를 제어할 수 있습니다.
구성 동기화는 객체의 범위를 지정하는 다음 메서드를 제공합니다.
- 클러스터 선택기로 클러스터 범위 객체 구성
- Fleet 패키지 라벨로 클러스터 범위 객체 구성(미리보기)
- 네임스페이스 선택기로 네임스페이스 범위 객체 구성하기(이 페이지)
명시적 네임스페이스 사용
구성 동기화를 구성할 때는 명시적 네임스페이스 선언을 사용하는 것이 좋습니다. 이렇게 하면 네임스페이스 메타데이터를 관리하고 나중에 필요한 경우 네임스페이스를 삭제할 수 있기 때문입니다.
기본 설정은 implicit
이지만 namespaceStrategy
필드를 explicit
로 설정하여 RootSync
또는 RepoSync
객체에서 네임스페이스 전략을 변경할 수 있습니다. 자세한 내용은 네임스페이스 전략을 참고하세요.
네임스페이스 선택기 정보
네임스페이스 선택기는 구성 동기화의 기능으로, 동일한 리소스 객체를 여러 네임스페이스에 배포할 수 있습니다.
네임스페이스 선택기를 사용하는 것은 Kubernetes 라벨 선택기를 사용하여 서비스를 포드 집합에 매핑하는 것과 비슷하지만 간접 참조 레이어가 추가됩니다.
기존 리소스 유형에 커스텀 필드를 추가할 수 없으므로 대신 NamespaceSelector
객체에 선택기를 정의합니다. 그런 다음 해당 선택기를 사용하려는 객체의 주석에서 이름으로 선택기를 참조합니다.
네임스페이스 선택기를 사용하려면 다음 단계를 따르세요.
- 배포하려는 네임스페이스에 기존 라벨을 추가하거나 선택합니다.
- 정보 소스에서
NamespaceSelector
리소스 객체를 정의합니다. 구성 동기화는NamespaceSelector
객체를 클러스터에 동기화하지 않습니다. - 하나 이상의 네임스페이스에 동기화하려는 각 객체의 구성을 수정하여
metadata.namespace
필드를 삭제하고NamespaceSelector
의metadata.name
와 일치하는 값이 있는configmanagement.gke.io/namespace-selector
주석을 추가합니다.
다음 섹션의 예에서는 NamespaceSelector
객체를 정의하고 NamespaceSelector
를 사용하도록 다른 객체에 주석을 추가하는 방법을 자세히 설명합니다.
시작하기 전에
- 구성 동기화 설치
- 구성 파일을 저장할 정보 소스를 만들거나 액세스합니다.
- 네임스페이스가 아직 없는 경우 리소스 범위를 지정할 네임스페이스를 만듭니다. 클러스터 또는 정보 소스에서 직접 네임스페이스를 만들 수 있습니다.
네임스페이스 선택기 사용
네임스페이스 선택기는 등호 기반 요구사항 또는 집합 기반 요구사항으로 정의됩니다. 여러 요구사항을 결합할 수 있습니다.
등호 기반 라벨 선택기 예시
다음 예시에서는 등호 기반 선택기를 사용하여 구성이 적용되는 네임스페이스를 선택하는 방법을 보여줍니다.
하나 이상의 네임스페이스에 라벨을 추가합니다.
kubectl label namespace NAMESPACE app=gamestore
NAMESPACE
를 네임스페이스의 이름으로 바꿉니다.라벨을 지정할 각 네임스페이스에 대해 이 명령어를 실행합니다.
gamestore-selector
라는 네임스페이스 선택기를 만듭니다.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestore
다른 객체의 구성이 이 네임스페이스 선택기를 참조하는 경우 해당 구성은
app: gamestore
라벨이 있는 네임스페이스의 객체에만 적용될 수 있습니다.네임스페이스 선택기는 다른 구성에서 참조될 때까지 어떠한 영향도 주지 않습니다. 네임스페이스 선택기를 참조하는 객체 할당량의 예를 만듭니다.
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
리소스 할당량은
app: gamestore
라벨이 있는 네임스페이스에서만 생성됩니다.
집합 기반 라벨 선택기 예시
다음 예에서는 집합 기반 선택기를 사용하여 객체를 상속하지 않도록 네임스페이스를 제외하는 방법을 보여줍니다.
하나 이상의 네임스페이스에 라벨을 추가합니다.
kubectl label namespace NAMESPACE quota-exempt=exempt
NAMESPACE
를 네임스페이스의 이름으로 바꿉니다.라벨을 지정할 각 네임스페이스에 대해 이 명령어를 실행합니다.
exclude-exempt-namespaces
라는 네임스페이스 선택기를 만듭니다.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: excludes-exempt-namespaces spec: selector: matchExpressions: - key: quota-exempt operator: NotIn values: - exempt
다른 객체의 구성이 이 네임스페이스 선택기를 참조하는 경우 해당 구성은
quota-exempt: exempt
키-값 쌍이 있는 네임스페이스를 제외한 모든 네임스페이스에 적용됩니다.네임스페이스 선택기는 다른 구성에서 참조될 때까지 어떠한 영향도 주지 않습니다. 네임스페이스 선택기를 참조하는 객체 할당량의 예를 만듭니다.
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
리소스 할당량은
quota-exempt: exempt
키-값 쌍이 있는 네임스페이스를 제외한 모든 네임스페이스에서 생성됩니다.
팀 범위 및 Fleet 네임스페이스와 통합
Google Cloud 에서 생성된 Fleet 네임스페이스에는 자동으로 fleet.gke.io/fleet-scope: your-scope
라벨이 지정됩니다. 또한 모든 네임스페이스에는 Kubernetes kubernetes.io/metadata.name: your-namespace
라벨이 지정됩니다. 이러한 기본 라벨을 사용하여 Fleet 네임스페이스를 선택하기 위한 네임스페이스 선택기를 설정할 수 있습니다.
Fleet 테넌시 튜토리얼에서는 네임스페이스 선택기를 Fleet 및 팀 범위와 함께 사용하여 여러 팀의 객체를 선택적으로 관리하는 방법을 자세히 설명합니다.
계층 모드를 사용하는 네임스페이스 범위 객체
구조화되지 않은 저장소가 대부분의 사용 사례에 권장되지만 네임스페이스 선택기를 사용하여 계층적 저장소로 객체의 범위를 지정할 수 있습니다. 네임스페이스 선택기 사용은 동일하지만 정보 소스에서 네임스페이스 구성을 정리하는 방법에 관한 추가 제한사항과 요구사항이 있습니다.
제한사항
계층적 저장소와 함께 네임스페이스 선택기 구성을 사용하는 경우 다음 제한사항과 요구사항에 유의하세요.
- 네임스페이스와 네임스페이스 범위 객체의 모든 구성 파일을 계층적 저장소의
namespaces/
디렉터리와 하위 디렉터리에 저장해야 합니다. namespaces/NAMESPACE
하위 디렉터리에 네임스페이스 구성을 명시적으로 지정해야 합니다. 여기서NAMESPACE
는 네임스페이스 이름과 일치해야 합니다. 다른 모든 네임스페이스 범위 객체도 동일한 하위 디렉터리에 저장되어야 합니다. 네임스페이스 구성이 누락된 경우 구성 동기화는 KNV1044 오류를 반환합니다.- 네임스페이스 선택기를 참조하는 리소스는
namespaces/
디렉터리의 디렉터리 구조와 관계없이 추상 네임스페이스에서 주어진 구성을 상속하는 네임스페이스에 적용됩니다.
네임스페이스 선택기 위치
계층적 저장소에서 네임스페이스 선택기 구성을 추상 네임스페이스 디렉터리에 배치할 수 있지만 네임스페이스 디렉터리에는 배치할 수 없습니다.
다음 저장소 아키텍처 예시에서는 네임스페이스 선택기의 유효한 위치와 잘못된 위치를 보여줍니다.
namespace-inheritance
...
├── namespaces
│ ├── eng
│ │ ├── gamestore
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
│ ├── ns_selector.yaml # valid
│ ├── rnd
│ │ ├── incubator-1
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
namespaces
, eng
, rnd
디렉터리는 추상 네임스페이스를 나타내기 때문에 선택기를 배치할 수 있습니다. 그러나 gamestore
및 incubator-1
디렉터리는 실제 네임스페이스를 나타내므로 이 네임스페이스에 네임스페이스 선택기를 배치할 수 없습니다.
추상 네임스페이스 구성
계층적 저장소를 사용하면 선택적으로 추상 네임스페이스를 사용할 수 있습니다.
다음 예에서는 네임스페이스가 상속한 추가 구성이 포함된 추상 네임스페이스로 네임스페이스 디렉터리를 이동하는 방법을 보여줍니다.
저장소에서 추상 네임스페이스 디렉터리를 만듭니다. 추상 네임스페이스 디렉터리에는 네임스페이스 구성이 포함되어 있지 않지만 하위 네임스페이스 디렉터리에는 구성이 포함되어 있습니다.
생성한 추상 네임스페이스 디렉터리에서 결국 이 역할을 상속받는 네임스페이스의 모든 객체에
get
및list
권한을 부여하는 역할의 구성을 만듭니다.apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
ROLE_NAME
을 역할 이름으로 바꿉니다.역할을 이메일 그룹에 바인딩하는 역할 바인딩의 구성을 만듭니다.
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ROLE_NAME subjects: - kind: Group name: group@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: ROLEBINDING_NAME apiGroup: rbac.authorization.k8s.io
ROLEBINDING_NAME
을 역할 이름으로 바꿉니다.이전 섹션에서 만든 네임스페이스 구성을
namespaces/
디렉터리에서 이 섹션에서 만든 추상 네임스페이스 디렉터리로 이동합니다.
객체에 상속 사용 중지
hierarchyMode
필드를 none
으로 설정하면 모든 구성의 상속을 선택적으로 중지할 수 있습니다. HierarchyConfig는 저장소의 system/
디렉터리에 저장됩니다. 이 예시에서는 역할 바인딩의 상속을 중지합니다.
# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
name: rbac
spec:
resources:
# Configure role to only be allowed in leaf namespaces.
- group: rbac.authorization.k8s.io
kinds: [ "RoleBinding" ]
hierarchyMode: none