네임스페이스 및 네임스페이스 범위 객체 구성

이 페이지에서는 구성 동기화를 사용하여 네임스페이스와 네임스페이스 범위 객체를 관리하는 방법을 설명합니다.

네임스페이스 구성

네임스페이스 구성은 구조화되지 않은 저장소 및 계층적 저장소에 대해 다르게 작동합니다. 다음 예시에서는 이러한 차이점을 강조합니다.

구조화되지 않은 저장소

네임스페이스와 네임스페이스 범위 객체의 구성은 저장소의 디렉터리 또는 하위 디렉터리의 어디에나 있을 수 있습니다.

다음 단계를 완료하여 각 등록된 클러스터에 gamestore라는 네임스페이스를 구성합니다.

  1. 다음 콘텐츠로 namespace-gamestore.yaml라는 파일을 만듭니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    네임스페이스 구성을 포함하는 YAML 파일만 만들면 됩니다.

  2. namespace-gamestore.yaml 구성이 포함된 커밋을 만들고 원격 저장소로 내보냅니다.

    git add multirepo/root/namespace-gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    다음을 바꿉니다.

    • REMOTE_NAME: 원격 저장소의 이름
    • BRANCH_NAME: 커밋할 브랜치

    이 예시에서는 파일을 루트 디렉터리에 추가하지만 이 파일을 저장소의 모든 하위 디렉터리로 이동할 수 있습니다.

계층적 저장소

네임스페이스와 네임스페이스 범위 객체의 구성은 모두 계층적 저장소namespaces/ 디렉터리와 하위 디렉터리에 있습니다.

다음 단계를 수행하여 각 등록된 클러스터에 gamestore라는 네임스페이스를 구성합니다.

  1. 저장소의 로컬 클론에서 네임스페이스 디렉터리를 만드세요. 네임스페이스 디렉터리에는 네임스페이스 구성이 포함됩니다. 네임스페이스 디렉터리 이름은 네임스페이스 이름과 일치해야 합니다. 이 예시에서 디렉터리는 namespaces/gamestore라고 합니다.

    mkdir namespaces/gamestore
    
  2. 네임스페이스 디렉터리에서 다음 콘텐츠가 있는 gamestore.yaml 파일을 만듭니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    metadata.name은 네임스페이스 디렉터리의 이름과 일치해야 합니다.

  3. gamestore.yaml 구성이 포함된 커밋을 만들고 원격 저장소로 내보냅니다.

    git add namespaces/gamestore/gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    다음을 바꿉니다.

    • REMOTE_NAME: 원격 저장소의 이름
    • BRANCH_NAME: 커밋할 브랜치

잠시 후 등록된 각 클러스터에 gamestore 네임스페이스가 생성됩니다. 확인하려면 네임스페이스에 대한 설명을 입력합니다.

kubectl describe namespace gamestore

구성을 삭제하고 등록된 클러스터에서 gamestore 네임스페이스를 삭제하려면 파일을 삭제하는 새 커밋을 만들어 원격 저장소로 내보냅니다. 계층적 저장소에 대해 추상 네임스페이스를 구성하려면 구성을 삭제하지 마세요.

네임스페이스 범위 객체 구성하기

구조화되지 않은 저장소에서 네임스페이스 구성을 사용하지 않고도 모든 디렉터리 또는 하위 디렉터리에 네임스페이스 범위 객체를 저장할 수 있습니다. 네임스페이스 구성이 누락된 경우 구성 동기화는 암시적 네임스페이스 객체를 자동으로 만들고 모든 구성을 해당 네임스페이스에 적용합니다.

이 동작은 namespaceStrategy 필드를 사용하여 수정할 수 있습니다. namespaceStrategyexplicit로 설정된 경우 구성 동기화가 암시적 네임스페이스 객체를 자동으로 만들지 않습니다. 자세한 내용은 네임스페이스 전략을 참조하세요.

계층 구조 리소스에서 namespaces/NAMESPACE 하위 디렉터리에 네임스페이스 구성을 명시적으로 지정해야 합니다. 여기서 NAMESPACE는 네임스페이스 이름과 일치해야 합니다. 다른 모든 네임스페이스 범위 구성도 동일한 하위 디렉터리에 저장해야 합니다. 네임스페이스 구성이 누락된 경우 구성 동기화는 누락된 네임스페이스 구성을 나타내는 KNV1044 오류를 반환합니다.

추상 네임스페이스 구성

추상 네임스페이스는 구조화되지 않은 저장소에서 지원되지 않으므로 계층적 저장소에만 적용됩니다.

이 예시에서는 gamestore 네임스페이스 디렉터리를 gamestore 네임스페이스에서 상속한 추가 구성이 포함된 추상 네임스페이스로 이동하여 네임스페이스 구성의 예시를 확장합니다.

  1. 저장소의 로컬 클론에서 eng라는 추상 네임스페이스 디렉터리를 만듭니다.

    mkdir namespaces/eng
    

    추상 네임스페이스 디렉터리에는 네임스페이스의 구성이 없지만 하위 네임스페이스 디렉터리에는 구성이 포함되어 있습니다.

  2. eng 추상 네임스페이스 디렉터리에서 eng-viewer라는 Role의 구성을 만들어 이 Role을 상속받는 네임스페이스의 모든 리소스에 getlist 권한을 부여합니다.

    # namespaces/eng/eng-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: eng-viewer
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. eng-viewer Role을 eng@example.com 그룹에 결합하는 eng-admin이라는 RoleBinding의 구성을 만듭니다.

    # namespaces/eng/eng-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: eng-admin
    subjects:
    - kind: Group
      name: eng@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: eng-viewer
      apiGroup: rbac.authorization.k8s.io
    
  4. gamestore 네임스페이스 디렉터리를 namespaces/에서 namespaces/eng/ 디렉터리로 이동합니다.

    mv namespaces/gamestore /namespaces/eng/
    
  5. 모든 변경사항을 커밋하고 저장소의 원격으로 내보냅니다.

구성 동기화는 변경사항을 감지하고 새 Role과 RoleBinding을 등록된 모든 클러스터의 gamestore 네임스페이스에 적용합니다.

구성을 삭제하고 등록된 클러스터에서 gamestore 네임스페이스를 삭제하려면 전체 eng 추상 네임스페이스를 삭제하는 새 커밋을 만들고 원격 저장소로 내보내면 됩니다.

구성 영향을 받는 클러스터 제한

일반적으로 구성 동기화는 등록된 각 클러스터에 구성을 적용합니다. 구성이 계층적 저장소namespaces/ 하위 디렉터리 내에 있는 경우 구성 동기화는 먼저 각 클러스터에 네임스페이스를 만든 다음 상속된 모든 구성을 해당 네임스페이스에 적용합니다. 특정 구성이 각 클러스터의 라벨에 따라 영향을 주는 클러스터를 제한하려면 ClusterSelector를 사용하세요. 자세한 내용은 ClusterSelector 사용을 참조하세요.

구성 영향을 받는 네임스페이스 제한

구성 영향을 받는 네임스페이스를 제한하려면 NamespaceSelector를 사용합니다. NamespaceSelector는 Kubernetes labelSelector를 사용하는 특수 유형의 구성입니다. 구조화되지 않은 저장소 또는 계층적 저장소에서 네임스페이스 범위 객체의 구성과 함께 NamespaceSelector를 선언하여 해당 구성을 상속할 수 있는 네임스페이스를 제한할 수 있습니다. NamespaceSelector는 ClusterSelector와 유사하지만 동일하지는 않습니다. NamespaceSelector는 구성이 적용되는 네임스페이스 풀을 좁힙니다.

NamespaceSelector를 선언하려면 metadata.namespace 또는 NamespaceSelector 주석을 추가합니다. 두 주석을 모두 선언해서는 안 됩니다. 네임스페이스 범위의 리소스가 metadata.namespace 또는 NamespaceSelector 주석을 선언하지 않으면 구성 동기화는 클러스터의 '기본' 네임스페이스를 사용합니다.

구조화되지 않은 저장소의 NamespaceSelector

구조화되지 않은 저장소는 저장소의 네임스페이스 범위 객체에 대한 모든 네임스페이스를 선언할 필요가 없습니다. 객체는 구조화되지 않은 저장소에 일치하는 네임스페이스 객체 없이 metadata.namespace를 정의할 수 있습니다. 클러스터에 네임스페이스가 이미 있는 경우 구성 동기화는 해당 네임스페이스 내에 객체를 만듭니다. 클러스터에 네임스페이스가 아직 없는 경우 구성 동기화는 네임스페이스를 암시적으로 만듭니다.

이전에 계층적 저장소에 사용되었던 객체로 구조화되지 않은 저장소를 만들려면 먼저 NamespaceSelectors가 추가 리소스에 적용되지 않는지 확인하세요.

구조화되지 않은 저장소에서 네임스페이스 범위 객체를 삭제하면 구성 동기화가 이러한 객체를 삭제하지만, 이러한 객체에 대해 암시적으로 생성될 수 있는 네임스페이스는 삭제하지 않습니다. 이 동작은 구성 동기화가 암시적으로 생성된 네임스페이스를 삭제하는 것이 안전한 경우 추론할 수 없으므로 항상 클러스터에 남게 됩니다.

NamespaceSelector 모드

구조화되지 않은 저장소에서 NamespaceSelector 주석을 선언하는 객체는 NamespaceSelector의 조건을 만족하는 모든 네임스페이스에 적용됩니다. 1.17.0 이전의 구성 동기화 버전에서는 NamespaceSelector 주석이 정보 소스에 정적으로 선언된 일치하는 네임스페이스에만 적용됩니다. 버전 1.17.0 이상에서 NamespaceSelector 객체는 spec.modedynamic으로 설정하여 동적 모드를 지원합니다. 동적 모드에서는 정적으로 선언된 네임스페이스와 클러스터에 동적으로 존재하는 네임스페이스 모두로 선택 범위가 확장됩니다. 선택한 네임스페이스는 클러스터에 동적으로 존재하므로 구성 동기화에서 관리되지 않습니다. 기본 모드는 static입니다.

계층적 저장소의 NamespaceSelector

계층적 저장소에서 NamespaceSelector 주석을 선언하는 객체는 namespaces/ 디렉터리의 디렉터리 구조와 관계없이 추상 네임스페이스에서 주어진 구성을 상속하는 네임스페이스에 적용됩니다. ClusterSelector는 구성이 클러스터 범위 또는 네임스페이스 범위 객체를 타겟팅하는지 여부에 관계없이 구성이 적용되는 클러스터 풀의 범위를 좁힙니다.

NamespaceSelector 위치

구조화되지 않은 저장소에서 NamespaceSelector를 모든 디렉터리 또는 하위 디렉터리에 배치할 수 있습니다.

계층적 저장소에서 NamespaceSelector를 추상 네임스페이스 디렉터리에 배치할 수 있지만 네임스페이스 디렉터리에는 배치할 수 없습니다.

다음 저장소 아키텍처 예시에서는 계층적 저장소를 사용하는 경우 NamespaceSelector의 유효한 위치와 잘못된 위치를 보여줍니다.

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 디렉터리는 추상 네임스페이스를 나타내기 때문에 선택기를 배치할 수 있습니다. 그러나 gamestoreincubator-1 디렉터리는 실제 네임스페이스를 나타내므로 이 네임스페이스에 NamespaceSelector를 배치할 수 없습니다.

NamespaceSelector 예시

라벨 선택기와 함께 NamespaceSelector를 사용하여 네임스페이스를 포함하거나 제외할 수 있습니다. Kubernetes는 등호 기반 및 집합 기반 선택기를 지원합니다. 두 가지 유형의 선택기를 조합하여 선택되는 네임스페이스를 더욱 세분화할 수 있습니다.

등호 기반 라벨 선택기

다음 구성은 gamestore-selector라는 NamespaceSelector를 만듭니다. 다른 구성이 이 NamespaceSelector를 참조하면 구성은 app: gamestore 라벨이 있는 네임스페이스의 객체에만 적용될 수 있습니다.

kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: gamestore-selector
spec:
  selector:
    matchLabels:
      app: gamestore

구성에서 NamespaceSelector를 참조하려면 NamespaceSelector 이름에 configmanagement.gke.io/namespace-selector 주석을 설정합니다.

NamespaceSelector는 다른 구성에서 참조될 때까지 어떠한 영향도 주지 않습니다. gamestore-selector NamespaceSelector가 다음 ResourceQuota quota와 동일한 계층 구조에 있으면 ResourceQuota는 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"

요약하면 다음과 같은 3단계로 NamespaceSelector를 사용할 수 있습니다.

  1. 네임스페이스에 라벨을 추가합니다.
  2. NamespaceSelector 구성을 만듭니다.
  3. 다른 구성에서 NamespaceSelector 객체를 참조합니다.

집합 기반 라벨 선택기

네임스페이스 선택기를 사용해 집합 기반 라벨 선택기를 사용하여 특정 네임스페이스가 트리의 리소스를 상속하지 않도록 제외할 수 있습니다.

이 예시에서 configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces 주석을 설정하여 ResourceQuotaNamespaceSelector 주석이 추가되면 quota-exempt: exempt 라벨이 지정된 네임스페이스를 제외한 모든 네임스페이스에 ResourceQuota가 생성됩니다.

kind: NamespaceSelector
 apiVersion: configmanagement.gke.io/v1
 metadata:
   name: excludes-exempt-namespaces
 spec:
   selector:
     matchExpressions:
       - key: quota-exempt
         operator: NotIn
          values:
            - exempt

팀 범위 및 Fleet 네임스페이스와 통합

Google Cloud에서 생성된 Fleet 네임스페이스에는 자동으로 fleet.gke.io/fleet-scope: your-scope 라벨이 포함됩니다. 또한 모든 네임스페이스에는 Kubernetes kubernetes.io/metadata.name: your-namespace 라벨이 지정됩니다. Fleet 네임스페이스를 선택하기 위해 이러한 기본 라벨을 사용하여 NamespaceSelector를 설정할 수 있습니다.

객체 유형에 상속 사용 중지

HierarchyConfig Kubernetes 객체는 구조화되지 않은 저장소에서 지원되지 않습니다. 다음 예시는 계층적 저장소에만 적용됩니다.

hierarchyMode 필드를 none으로 설정하면 모든 구성의 상속을 선택적으로 중지할 수 있습니다. HierarchyConfig는 저장소의 system/ 디렉터리에 저장됩니다. 이 예시에서는 RoleBinding의 상속을 중지합니다.

# 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

다음 단계