設定叢集和叢集範圍內的物件

本頁說明如何設定叢集和叢集範圍內的物件。您也可以閱讀設定命名空間和命名空間範圍內物件一文。

設定叢集和叢集範圍內的物件

非結構化存放區中,您可以按照最方便的方式整理叢集和叢集範圍物件的設定。以這種方式整理的所有設定,都會套用至已註冊 Config Sync 的每個叢集。

階層式存放區中,叢集和叢集範圍內物件的所有設定都位於 cluster/ 目錄。cluster/ 中的所有設定都會套用至已註冊 Config Sync 的每個叢集。

設定 CustomResourceDefinitions

Config Sync 可讓您同步處理自訂資源定義 (CRD),方式與同步處理其他資源相同。同步處理 CRD 時,請注意下列事項:

  • 階層式存放區中的 CRD (即使是宣告命名空間的自訂資源),也必須放在 cluster/ 目錄中。

  • CRD 和對應 CustomResource 的更新不會以任何可預測的順序進行。如果您在同一次提交中修改 CRD 和對應的 CustomResource,我們不會預期 CRD 更新會在 Custom Resource 更新前發生。這可能會導致 nomos status 在短時間內回報暫時性錯誤,直到 CustomResource 和 CRD 都存在於叢集中為止。

  • 如果存放區中的任何 CustomResource 依附於 CRD,Config Sync 就不允許移除該 CRD。如要移除 CRD,也必須移除其 CustomResource。建議您在同一次提交中,一併從存放區移除這兩項設定。

  • 只要能確保 CRD 已存在於叢集中,您就可以同步處理 CustomResource,而不必同步處理 CRD。

限制特定設定會影響哪些叢集

根據預設,Config Sync 會將設定套用至每個已註冊的叢集。不過,如要只將設定套用至部分叢集,您可以將 cluster-name-selector 註解或 ClusterSelector 設定新增至存放區。

cluster-name-selector 註解可讓您輕鬆指定要套用設定的叢集子集。這個選項僅支援依名稱選取叢集。

ClusterSelector 物件支援依標籤選取叢集,但需要更複雜的設定。

使用 cluster-name-selector 註解設定

您可以使用 configsync.gke.io/cluster-name-selector 註解,將設定套用至叢集子集。您可以使用這個註解,將設定套用至一組叢集 (以叢集名稱表示)。註解值是以半形逗號分隔的目標叢集名稱清單。 您可以將註解套用至叢集範圍內的物件和命名空間範圍內的物件。當註解與叢集名稱相符,且叢集所屬的命名空間也已選取時,系統會選取命名空間物件。

選取單一叢集

以下設定會建立名為 namespace-reader 的 Role,定義一組讀取命名空間的權限。這個角色只會套用至名稱為 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-1cluster-2cluster-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,根據叢集的標籤限制特定設定可套用至哪些叢集。您也可以使用 ClusterSelectors,限制哪些叢集會例項化命名空間範圍的物件。

與其他 labelSelectors 相同,ClusterSelectors 採用 AND 邏輯運作。由於 ClusterSelectors 使用 AND 邏輯,只有在物件符合您定義的所有標籤時,才會選取物件。

ClusterSelector 設定不會保留在叢集中。而是使用註解在其他設定中參照,且該設定只會套用至符合 ClusterSelector 的叢集。

每個叢集必須擁有專屬名稱和一組可選取的標籤,您才能使用 ClusterSelectors。叢集的中繼資料會在可靠來源的叢集設定中指定。

接著,請為叢集新增標籤建立 ClusterSelector,然後在其他設定中參照該標籤

為叢集新增標籤

如要使用 ClusterSelectors,每個叢集都必須有一組可選取的標籤。在非結構化存放區中,Cluster 設定可任意儲存在設定目錄或其子系目錄中。在階層式存放區中,叢集設定會儲存在 clusterregistry/ 目錄中。

如要將設定套用至叢集,叢集設定的 metadata.name 欄位必須與 ConfigManagement 物件的 clusterName 欄位相符。

下列叢集設定範例會宣告 cluster-2 具有 environment: prodlocation: central 標籤。

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central

您也可以使用叢集設定套用註解。

建立 ClusterSelector

ClusterSelector 只會選取含有指定標籤或標籤組合的叢集。在非結構化存放區中,ClusterSelectors 可以任意儲存在同步目錄或其子系目錄中。在階層式存放區中,ClusterSelectors 會儲存在存放區的頂層 clusterregistry/ 目錄中。

以下 ClusterSelector 只會選取含有 environment: prod 標籤的叢集。

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod

以下 ClusterSelector 會選取含有 location: centrallocation: 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

如要在其他設定中參照 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"]

限制命名空間範圍設定會影響的叢集

根據預設,Config Sync 會將命名空間沿用的設定套用至該命名空間所在的每個叢集。您可以使用 ClusterSelector,只將設定套用至這些叢集的子集。

舉例來說,您可以根據叢集的地理位置或用戶端的地理位置,設定不同的叢集。這項設定有助於本地化或遵守法規。本節中的範例只會將特定語言代碼的設定套用至標籤為 location: france 的叢集。

下列 Cluster 設定會將 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,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 標籤的叢集。

後續步驟