將物件同步至多個命名空間

本頁說明如何使用 Config Sync 管理命名空間,以及選擇要將哪些物件同步至命名空間。

Kubernetes 資源物件可受限於叢集範圍或命名空間範圍,視資源類型而定。您需要設定用戶端,與特定叢集通訊,才能選取叢集。您可以在物件資訊清單中設定 metadata.namespace 欄位,選取命名空間。Config Sync 新增了叢集選取器和命名空間選取器等功能,可進一步精確指定要同步的物件。

閱讀本頁面之前,您應該先熟悉下列 Kubernetes 概念:

使用 Config Sync 設定物件範圍

根據預設,在叢集上或以車隊預設設定安裝 Config Sync 時,Config Sync 會將真實來源中的所有 Kubernetes 物件同步至已安裝 Config Sync 的叢集,或車隊中的所有叢集。不過,只要將物件範圍限定在叢集或命名空間,就能控管要將哪些物件同步至叢集或命名空間。

Config Sync 提供下列方法來設定物件範圍:

使用明確的命名空間

設定 Config Sync 時,建議您使用明確的命名空間宣告,因為這樣一來,您就能管理命名空間中繼資料,並在日後視需要刪除命名空間。

預設設定為 implicit,但您可以在 RootSyncRepoSync 物件中,將 namespaceStrategy 欄位設為 explicit,藉此變更命名空間策略。詳情請參閱命名空間策略

關於命名空間選取器

命名空間選取器是 Config Sync 的一項功能,可讓您將相同的資源物件部署到多個命名空間。

使用命名空間選取器與使用 Kubernetes 標籤選取器將 Service 對應至一組 Pod 類似,但多了一層間接層。由於您無法在現有資源類型中新增自訂欄位,因此請改為在 NamespaceSelector 物件中定義選取器。然後,在要使用該選取器的物件上,透過註解依名稱參照該選取器。

如要使用命名空間選取器,請按照下列步驟操作:

  1. 在要部署的命名空間中新增或選擇現有標籤。
  2. 在單一事實來源中定義 NamespaceSelector 資源物件。Config Sync 不會將 NamespaceSelector 物件同步至叢集。
  3. 如要將每個物件同步至一或多個命名空間,請修改物件的設定,移除 metadata.namespace 欄位,並新增 configmanagement.gke.io/namespace-selector 註解,其值與 NamespaceSelectormetadata.name 相符。

後續章節的範例會進一步說明如何定義 NamespaceSelector 物件,以及如何註解其他物件來使用 NamespaceSelector

事前準備

使用命名空間選取器

命名空間選取器可透過等值條件集合條件定義。您可以合併多項需求。

以等號為基礎的標籤選取器範例

以下範例說明如何使用以等號為準的選取器,選取設定適用的命名空間:

  1. 為一或多個命名空間新增標籤:

    kubectl label namespace NAMESPACE app=gamestore
    

    NAMESPACE 替換成命名空間名稱。

    針對要加上標籤的每個命名空間執行這項指令。

  2. 建立名為 gamestore-selector 的命名空間選取器。

    kind: NamespaceSelector
    apiVersion: configmanagement.gke.io/v1
    metadata:
      name: gamestore-selector
    spec:
      selector:
        matchLabels:
          app: gamestore
    

    如果其他物件的設定參照這個命名空間選取器,該設定就只能套用到內含 app: gamestore 標籤的命名空間中的物件。

  3. 如要讓某個命名空間選取器起作用,您必須先在另一項設定中參照該選取器。建立參照命名空間選取器的範例物件配額:

    kind: ResourceQuota
    apiVersion: v1
    metadata:
      name: quota
      annotations:
        configmanagement.gke.io/namespace-selector: gamestore-selector
    spec:
      hard:
        pods: "1"
        cpu: "200m"
        memory: "200Mi"
    

    資源配額只會在具有 app: gamestore 標籤的命名空間中建立。

以集合為基礎的標籤選取器範例

以下範例說明如何使用以集合為基礎的選取器,豁免命名空間繼承物件:

  1. 為一或多個命名空間新增標籤:

    kubectl label namespace NAMESPACE quota-exempt=exempt
    

    NAMESPACE 替換成命名空間名稱。

    針對要加上標籤的每個命名空間執行這項指令。

  2. 建立名為 exclude-exempt-namespaces 的命名空間選取器:

    kind: NamespaceSelector
    apiVersion: configmanagement.gke.io/v1
    metadata:
      name: excludes-exempt-namespaces
    spec:
      selector:
        matchExpressions:
          - key: quota-exempt
            operator: NotIn
              values:
                - exempt
    

    如果其他物件的設定參照這個命名空間選取器,該設定會套用到「不含」quota-exempt: exempt 鍵值配對的所有命名空間

  3. 如要讓某個命名空間選取器起作用,您必須先在另一項設定中參照該選取器。建立參照命名空間選取器的範例物件配額:

    kind: ResourceQuota
    apiVersion: v1
    metadata:
      name: quota
      annotations:
        configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces
    spec:
      hard:
        pods: "1"
        cpu: "200m"
        memory: "200Mi"
    

    系統會在所有命名空間中建立資源配額,但具有 quota-exempt: exempt 鍵/值組合的命名空間除外。

與團隊範圍和機群命名空間整合

在 Google Cloud 中建立的機群命名空間會自動加上 fleet.gke.io/fleet-scope: your-scope 標籤。所有命名空間也都有 Kubernetes kubernetes.io/metadata.name: your-namespace 標籤。您可以使用這些預設標籤,設定命名空間選取器來選取機群命名空間。

機群租戶教學課程會更詳細地說明如何搭配使用命名空間選取器與機群和團隊範圍,有選擇性地管理不同團隊的物件。

階層模式的命名空間範圍物件

雖然建議在大多數情況下使用非結構化存放區,但您可以使用命名空間選取器,透過階層式存放區設定物件範圍。命名空間選取器的使用方式相同,但您在真理來源中整理命名空間設定時,會受到額外的限制和規定。

限制

將命名空間選取器設定與階層式存放區搭配使用時,請注意下列限制和規定:

  • 您必須將命名空間和命名空間範圍內物件的所有設定檔,儲存在階層式存放區namespaces/ 目錄及其子系目錄中。
  • 您必須在 namespaces/NAMESPACE 子目錄中明確指定命名空間設定,其中 NAMESPACE 符合命名空間的名稱。所有其他命名空間範圍的物件都必須儲存在相同的子目錄中。如果缺少命名空間設定,Config Sync 會傳回 KNV1044 錯誤。
  • 參照命名空間選取器的資源會套用至從抽象命名空間繼承特定設定的命名空間,無論 namespaces/ 目錄的目錄結構為何。

命名空間選取器位置

在階層式存放區中,您可以將命名空間選取器設定放在任何抽象命名空間目錄中,但不能放在命名空間目錄中。

以下範例存放區架構顯示命名空間選取器的有效和無效位置:

namespace-inheritance
...
├── namespaces
│   ├── eng
│   │   ├── gamestore
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid
│   ├── ns_selector.yaml  # valid
│   ├── rnd
│   │   ├── incubator-1
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid

由於 namespacesengrnd 目錄代表抽象命名空間,因此您可以在其中放置選取器。不過,由於 gamestoreincubator-1 目錄代表實際的命名空間,因此您無法在其中放置命名空間選取器。

設定抽象命名空間

使用階層式存放區時,您可以選擇使用抽象命名空間。

以下範例說明如何將命名空間目錄移至抽象命名空間,其中包含命名空間沿用的其他設定:

  1. 在存放區中建立抽象命名空間目錄。抽象命名空間目錄不含任何命名空間的設定,但子系命名空間目錄包含設定。

  2. 在您建立的抽象命名空間目錄中,為 Role 建立設定,授予最終會沿用該 Role 的任何命名空間中所有物件的 getlist 權限:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: ROLE_NAME
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    

    ROLE_NAME 替換為角色名稱。

  3. 建立角色繫結的設定,將角色繫結至電子郵件群組:

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ROLE_NAME
    subjects:
    - kind: Group
      name: group@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name:  ROLEBINDING_NAME
      apiGroup: rbac.authorization.k8s.io
    

    ROLEBINDING_NAME 替換為角色名稱。

  4. 將您在前一節建立的命名空間設定,從 namespaces/ 目錄移至本節建立的抽象命名空間目錄。

停用物件的沿用機制

您可以選擇性停用任何設定的沿用機制,方法是將 hierarchyMode 欄位設定成 none。HierarchyConfigs 會儲存在存放區的 system/ 目錄中。以下範例會停用角色繫結的沿用機制:

# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
  name: rbac
spec:
  resources:
  # Configure role to only be allowed in leaf namespaces.
  - group: rbac.authorization.k8s.io
    kinds: [ "RoleBinding" ]
    hierarchyMode: none