本頁說明如何設定叢集和叢集範圍內的物件。您也可以閱讀設定命名空間和命名空間範圍內物件一文。
設定叢集和叢集範圍內的物件
在非結構化存放區中,您可以按照最方便的方式整理叢集和叢集範圍物件的設定。以這種方式整理的所有設定,都會套用至已註冊 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-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,根據叢集的標籤限制特定設定可套用至哪些叢集。您也可以使用 ClusterSelectors,限制哪些叢集會例項化命名空間範圍的物件。
與其他 labelSelectors 相同,ClusterSelectors 採用 AND 邏輯運作。由於 ClusterSelectors 使用 AND 邏輯,只有在物件符合您定義的所有標籤時,才會選取物件。
ClusterSelector 設定不會保留在叢集中。而是使用註解在其他設定中參照,且該設定只會套用至符合 ClusterSelector 的叢集。
每個叢集必須擁有專屬名稱和一組可選取的標籤,您才能使用 ClusterSelectors。叢集的中繼資料會在可靠來源的叢集設定中指定。
接著,請為叢集新增標籤、建立 ClusterSelector,然後在其他設定中參照該標籤。
為叢集新增標籤
如要使用 ClusterSelectors,每個叢集都必須有一組可選取的標籤。在非結構化存放區中,Cluster 設定可任意儲存在設定目錄或其子系目錄中。在階層式存放區中,叢集設定會儲存在 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 只會選取含有指定標籤或標籤組合的叢集。在非結構化存放區中,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: 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
如要在其他設定中參照 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
標籤的叢集。
後續步驟
- 進一步瞭解如何設定命名空間和命名空間範圍內的物件