이 페이지에서는 클러스터와 클러스터 범위 객체를 구성하는 방법을 설명합니다. 네임스페이스 및 네임스페이스 범위 객체 구성도 설명합니다.
클러스터 및 클러스터 범위 객체 구성
구조화되지 않은 저장소에서 가장 편리한 방법으로 클러스터 및 클러스터 범위 객체의 구성을 구조화할 수 있습니다. 이러한 방식으로 구조화된 모든 구성은 구성 동기화에 등록된 모든 클러스터에 적용됩니다.
계층적 저장소에서 클러스터 및 클러스터 범위 객체의 모든 구성은 cluster/ 디렉터리 내에 있습니다. cluster/ 내의 모든 구성은 구성 동기화에 등록된 모든 클러스터에 적용됩니다.
CustomResourceDefinition 구성
구성 동기화를 사용하면 다른 리소스를 동기화하는 것과 동일한 방식으로 CustomResourceDefinitions(CRDs)를 동기화할 수 있습니다. CRD를 동기화할 때는 다음 사항에 유의해야 합니다.
- 네임스페이스화된 커스텀 리소스를 선언하더라도 계층적 저장소의 CRD는 - cluster/디렉터리에 있어야 합니다.
- CRD 및 해당 CustomResources에 대한 업데이트는 예측 가능한 순서로 진행되지 않습니다. 동일한 커밋에서 CRD와 해당 CustomResources를 수정하면 커스텀 리소스가 업데이트되기 전에 CRD 업데이트를 예상하지 않습니다. 이로 인해 CustomResource와 CRD 모두 클러스터에 나타날 때까지 - nomos status에서 잠시 일시적인 오류를 보고할 수 있습니다.
- CRD가 저장소의 CustomResource에 의존하는 경우 Config Sync는 CRD를 삭제할 수 없습니다. CRD를 삭제하려면 해당하는 CustomResource도 삭제해야 합니다. 저장소의 동일한 커밋에서 이 둘을 모두 삭제하는 것이 좋습니다. 
- 클러스터에 CRD가 이미 있으면 CRD를 동기화하지 않고도 CustomResource를 동기화할 수 있습니다. 
구성 영향을 받는 클러스터 제한
기본적으로 구성 동기화는 등록된 모든 클러스터에 구성을 적용합니다. 그러나 클러스터의 하위 집합에만 구성을 적용해야 하는 경우 저장소에 cluster-name-selector 주석 또는 ClusterSelector 구성을 추가할 수 있습니다.
cluster-name-selector 주석은 구성을 적용할 클러스터의 하위 집합을 지정하는 간단한 방법을 제공합니다. 이 옵션을 사용하면 이름을 기준으로만 클러스터를 선택할 수 있습니다.
ClusterSelector 객체를 사용하면 라벨을 기준으로 클러스터를 선택할 수 있지만 더 복잡한 구성이 필요합니다.
cluster-name-selector 주석을 사용하여 구성
configsync.gke.io/cluster-name-selector 주석을 사용하여 클러스터의 하위 집합에 구성을 적용할 수 있습니다. 이 주석을 사용하여 클러스터 이름으로 표시된 클러스터 집합에 구성을 적용할 수 있습니다.
주석 값은 쉼표로 구분된 대상 클러스터 이름 목록입니다.
클러스터 범위 객체와 네임스페이스 범위 객체에 주석을 적용할 수 있습니다. 주석이 클러스터 이름과 일치하고 클러스터가 속한 네임스페이스도 선택된 경우 네임스페이스 객체가 선택됩니다.
단일 클러스터 선택
다음 구성은 네임스페이스 읽기에 대한 권한 집합을 정의하는 namespace-reader라는 역할을 만듭니다. 이 역할은 이름이 cluster-1인 클러스터에서만 적용됩니다.
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
클러스터 목록 선택
다음 구성은 이전 예시와 동일한 역할을 만들지만 이 역할은 cluster-1, cluster-2 또는 cluster-3이라는 이름의 클러스터에서만 적용됩니다.
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1,cluster-2,cluster-3
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
ClusterSelector 객체를 사용하여 구성
ClusterSelector는 Kubernetes labelSelector를 사용하는 특수 유형의 구성입니다. ClusterSelector를 사용하면 클러스터 라벨에 따라 특정 구성을 적용할 클러스터를 제한할 수 있습니다. 또한 ClusterSelector를 사용하여 네임스페이스 범위 객체를 인스턴스화하는 클러스터를 제한할 수 있습니다.
다른 labelSelector와 마찬가지로 ClusterSelector는 AND 로직을 사용하여 작동합니다. ClusterSelector는 AND 로직을 사용하므로 정의한 모든 라벨과 일치하는 경우에만 객체가 선택됩니다.
ClusterSelector 구성은 클러스터에서 지속되지 않습니다. 대신 주석을 사용하여 다른 구성에서 참조하며 이 구성은 ClusterSelector와 일치하는 클러스터에만 적용됩니다.
ClusterSelector를 사용하려면 각 클러스터에 고유한 이름과 선택할 수 있는 라벨 집합이 있어야 합니다. 클러스터 메타데이터는 정보 소스의 클러스터 구성에 지정됩니다.
다음으로 클러스터에 라벨을 추가하고, ClusterSelector를 만든 다음 다른 구성에서 참조합니다.
클러스터에 라벨 추가
ClusterSelector를 사용하려면 각 클러스터에 선택할 수 있는 라벨 집합이 있어야 합니다. 구조화되지 않은 저장소에서 클러스터 구성은 구성 디렉터리 또는 하위 디렉터리에 임의로 저장할 수 있습니다.
계층적 저장소에서 클러스터 구성은 clusterregistry/ 디렉터리에 저장됩니다.
클러스터에 구성을 적용하려면 클러스터 구성의 metadata.name 필드가 ConfigManagement 객체의 clusterName 필드와 일치해야 합니다.
다음 클러스터 구성 예시에서는 cluster-2에 environment: prod 및 location: central 라벨이 포함되도록 선언합니다.
kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central
클러스터 구성을 사용하여 주석을 적용할 수도 있습니다.
ClusterSelector 만들기
ClusterSelector는 지정된 라벨 또는 라벨 조합이 있는 클러스터만 선택합니다. 구조화되지 않은 저장소에서 ClusterSelector는 동기화 디렉터리 또는 하위 디렉터리에 임의로 저장할 수 있습니다. 계층적 저장소에서 ClusterSelector는 저장소에서 최상위 clusterregistry/ 디렉터리에 저장될 수 있습니다.
다음 ClusterSelector는 environment: prod 라벨이 있는 클러스터만 선택합니다.
kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod
다음 ClusterSelector는 location: central 또는 location: west 라벨이 있는 클러스터를 선택합니다.
kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-central-or-west
spec:
  selector:
    matchExpressions:
      - key: location
        operator: In
        values:
        - central
        - west 
ClusterSelector는 다른 구성에서 참조하기 전까지 어떠한 영향도 주지 않습니다.
ClusterSelector 참조
다른 구성에서 ClusterSelector를 참조하려면 configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME 주석을 설정합니다.
다음 구성은 네임스페이스 읽기에 대한 권한 집합을 정의하는 namespace-reader라는 ClusterRole을 만듭니다. 이 ClusterRole은 selector-env-prod ClusterSelector와 일치하는 클러스터에서만 인스턴스화됩니다.
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader
  annotations:
    configmanagement.gke.io/cluster-selector: selector-env-prod
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
네임스페이스 범위 구성 영향을 받는 클러스터 제한
기본적으로 구성 동기화는 네임스페이스에서 상속하는 구성을 각 클러스터의 네임스페이스에 적용합니다. ClusterSelector를 사용하면 클러스터의 하위 집합에만 구성을 적용할 수 있습니다.
예를 들어 클러스터의 지리적 위치 또는 클라이언트의 지리적 위치에 따라 클러스터를 다르게 구성할 수 있습니다. 이 구성은 현지화 또는 법률 준수에 유용할 수 있습니다. 이 섹션의 예시는 location: france 라벨이 지정된 클러스터에만 언어별 구성을 적용합니다.
다음 클러스터 구성은 location: france 라벨을 cluster-1이라는 클러스터에 추가합니다.
kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-1
  labels:
    location: france
선택하려는 라벨을 참조하는 ClusterSelector 구성을 만듭니다. 다음 ClusterConfig는 location: france 라벨을 선택합니다.
kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-location-france
spec:
  selector:
    matchLabels:
      location: france
ClusterSelector는 다른 구성에서 참조하기 전까지 어떠한 영향도 주지 않습니다.
다음 RoleBinding 구성은 selector-location-france ClusterSelector와 일치하는 클러스터만 선택합니다. 예를 들어 규정 준수 가이드라인이 특정 서비스 계정이 지정된 지리적 리전에 있는 클러스터의 정보만 볼 수 있도록 허용한 경우 이 구성이 유용할 수 있습니다.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: viewers
  annotations:
    configmanagement.gke.io/cluster-selector: selector-location-france
subjects:
- kind: Group
  name: system:serviceaccounts:foo
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io
이 구성을 추상 네임스페이스 또는 네임스페이스 디렉터리(예: namespaces/eng)에 배치하면 클러스터를 상속하는 네임스페이스에 적용되지만 location: france 라벨이 지정된 클러스터에만 해당됩니다.
다음 단계
- 네임스페이스 및 네임스페이스 범위 객체 구성에 대해 자세히 알아보기