Config Sync 可讓您從中央可靠資料來源,以宣告方式管理 Kubernetes 叢集中的叢集範圍物件,例如 Namespace、ClusterRole 和 CustomResourceDefinition 資源。同步處理叢集範圍設定,有助於在整個機群中強制執行一致的叢集範圍政策、角色式存取控管 (RBAC) 和自訂 API。您也可以使用選取器指定特定叢集。如要改為管理個別命名空間中的資源,請參閱「將物件同步至多個命名空間」。
設定叢集和叢集範圍內的物件
在「非結構化」存放區中,您可以按照最方便的方式,整理叢集和叢集範圍物件的設定。所有以這種方式整理的設定,都會套用至 Config Sync 中註冊的每個叢集。
設定 CustomResourceDefinition
Config Sync 可讓您同步自訂資源定義 (CRD),就像同步任何其他資源一樣。同步處理 CRD 時,請注意下列事項:
CRD 及其對應 CustomResource 的更新順序無法預測。如果您在同一個修訂版本中修改 CRD 和對應的 CustomResources,則不預期 CRD 更新會在自訂資源更新之前發生。這可能會導致
nomos status在短時間內回報暫時性錯誤,直到 CustomResource 和 CRD 都出現在叢集中為止。如果存放區中的任何 CustomResource 依賴某個 CRD,Config Sync 就不允許移除該 CRD。如要移除 CRD,您也必須移除其 CustomResource。建議您在同一個修訂版本中,將這兩者從存放區中移除。
只要能確保叢集中已有 CRD,您就可以同步處理 CustomResource,而不必同步處理其 CRD。
限制特定設定會影響哪些叢集
根據預設,Config Sync 會將設定套用至每個註冊的叢集。不過,如果您只需要將設定套用至部分叢集,可以在存放區中新增 cluster-name-selector 註解或 ClusterSelector 設定。
cluster-name-selector 註解可讓您輕鬆指定要套用設定的叢集子集。這個選項僅支援依名稱選取叢集。
ClusterSelector 物件支援依標籤選取叢集,但需要更複雜的設定。
無論選擇哪種選項,都必須在叢集的 Config Sync 中指定 clusterName。視您安裝 Config Sync 的方式而定,您可以透過下列方式提供叢集名稱:
如果您使用 Google Cloud CLI 或 Cloud de Confiance 控制台安裝 Config Sync:
clusterName會自動設為機群成員資格名稱。如果您是使用
kubectl手動安裝 Config Sync,則必須在reconciler-manager部署作業上設定CLUSTER_NAME環境變數。詳情請參閱「為叢集選取器提供叢集名稱」。
使用 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。
為叢集加上標籤
如要使用 ClusterSelector,每個叢集都必須有一組可選取的標籤。在非結構化存放區中,叢集設定可以任意儲存在設定目錄或其子目錄中。
如要將設定套用至叢集,叢集設定的 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 只會選取具有 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"]
限制命名空間範圍設定影響的叢集
根據預設,Config Sync 會將命名空間繼承的設定,套用至每個叢集中的該命名空間。您可以使用 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 標籤的叢集。
後續步驟
- 進一步瞭解如何設定命名空間和命名空間範圍物件