클러스터 및 클러스터 범위 객체 구성

이 페이지에서는 클러스터와 클러스터 범위 객체를 구성하는 방법을 설명합니다. 네임스페이스 및 네임스페이스 범위 객체 구성도 설명합니다.

클러스터 및 클러스터 범위 객체 구성

구조화되지 않은 저장소에서 가장 편리한 방법으로 클러스터 및 클러스터 범위 객체의 구성을 구조화할 수 있습니다. 이러한 방식으로 구조화된 모든 구성은 구성 동기화에 등록된 모든 클러스터에 적용됩니다.

계층적 저장소에서 클러스터 및 클러스터 범위 객체의 모든 구성은 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 labelSelectors를 사용하는 특수 유형의 구성입니다. ClusterSelector를 사용하면 클러스터 라벨에 따라 특정 구성을 적용할 클러스터를 제한할 수 있습니다. 또한 ClusterSelector를 사용하여 네임스페이스 범위 객체를 인스턴스화하는 클러스터를 제한할 수 있습니다.

다른 labelSelector와 마찬가지로 ClusterSelector는 AND 로직을 사용하여 작동합니다. ClusterSelector는 AND 로직을 사용하므로 정의한 모든 라벨과 일치하는 경우에만 객체가 선택됩니다.

ClusterSelector 구성은 클러스터에서 지속되지 않습니다. 대신 주석을 사용하여 다른 구성에서 참조하며 이 구성은 ClusterSelector와 일치하는 클러스터에만 적용됩니다.

ClusterSelector를 사용하려면 각 클러스터에 고유한 이름과 선택할 수 있는 라벨 집합이 있어야 합니다. 클러스터 메타데이터는 정보 소스의 클러스터 구성에 지정됩니다.

다음으로 클러스터에 라벨을 추가하고, ClusterSelector를 만든 다음 다른 구성에서 참조합니다.

클러스터에 라벨 추가

ClusterSelector를 사용하려면 각 클러스터에 선택할 수 있는 라벨 집합이 있어야 합니다. 구조화되지 않은 저장소에서 클러스터 구성은 구성 디렉터리 또는 하위 디렉터리에 임의로 저장할 수 있습니다. 계층적 저장소에서 클러스터 구성은 clusterregistry/ 디렉터리에 저장됩니다.

클러스터에 구성을 적용하려면 클러스터 구성의 metadata.name 필드가 ConfigManagement 객체의 clusterName 필드와 일치해야 합니다.

다음 클러스터 구성 예시에서는 cluster-2environment: prodlocation: 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 라벨이 지정된 클러스터에만 해당됩니다.

다음 단계