Namespace オブジェクトと Namespace スコープ オブジェクトの構成

このページでは、Config Sync を使用して Namespace オブジェクトと Namespace スコープ オブジェクトを管理する方法について説明します。クラスタとクラスタ スコープ オブジェクトの構成もご覧ください。

Namespace の構成

非構造化形式

Namespace オブジェクトと Namespace スコープ オブジェクトの構成ファイルは、ディレクトリまたはサブディレクトリの任意の場所に配置できます。

次の手順で、登録された各クラスタに gamestore という Namespace を構成します。必要な作業は、Namespace 構成ファイルを含む YAML ファイルを作成することだけです。この例では、ファイルをルート ディレクトリに追加します。これは、任意のサブディレクトリに移動できます。

  1. 次の内容の namespace-gamestore.yaml ファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  2. namespace-gamestore.yaml 構成ファイルを含む commit を作成して、commit をリモート リポジトリに push します。

    git add multirepo/root/namespace-gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push [NAME-OF-REMOTE] [BRANCH-NAME]
    

階層形式

Namespace オブジェクトと Namespace スコープ オブジェクトの構成ファイルはすべて、階層リポジトリnamespaces/ ディレクトリとその下位ディレクトリに配置されます。

次の手順で、登録された各クラスタに gamestore という Namespace を構成します。

  1. リポジトリのローカル クローンで、名前空間ディレクトリを作成します。1 つの Namespace ディレクトリには Namespace の構成が 1 つ含まれます。Namespace ディレクトリの名前は、Namespace の名前と一致する必要があります。この例では、ディレクトリの名前は namespaces/gamestore です。

    mkdir namespaces/gamestore
    
  2. Namespace ディレクトリに、次の内容のファイル gamestore.yaml を作成します。metadata.name は、Namespace の名前(および Namespace ディレクトリの名前)と一致する必要があります。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  3. gamestore.yaml 構成ファイルを含む commit を作成して、commit をリモート リポジトリに push します。

    git add namespaces/gamestore/gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push [NAME-OF-REMOTE] [BRANCH-NAME]
    

しばらくすると、登録された各クラスタに gamestore Namespace が作成されます。確認するには、Namespace を記述します。

kubectl describe namespace gamestore

構成ファイルを削除して、登録されたクラスタから gamestore Namespace を削除するには、ファイルを削除する新しい commit を作成し、リモート リポジトリに push します。

抽象 Namespace の構成

この例は、gamestore Namespace によって継承された追加の構成ファイルを含む抽象 Namespace に gamestore Namespace ディレクトリを移動して、Namespace の構成を拡張しています。

  1. リポジトリのローカル クローンで、eng という名前の抽象 Namespace ディレクトリを作成します。抽象 Namespace ディレクトリには Namespace の構成は含まれませんが、その下位の Namespace ディレクトリには含まれます。

    mkdir namespaces/eng
    
  2. eng 抽象 Namespace ディレクトリで、eng-viewer という名前のロールの構成を作成します。これにより、最終的にロールを継承する Namespace のすべてのリソースで getlist が付与されます。

    # namespaces/eng/eng-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: eng-viewer
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. eng-viewer Role をグループ eng@example.com にバインドする eng-admin という名前の RoleBinding の構成を作成します。

    # namespaces/eng/eng-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: eng-admin
    subjects:
    - kind: Group
      name: eng@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: eng-viewer
      apiGroup: rbac.authorization.k8s.io
    
  4. gamestore Namespace ディレクトリを namespaces/ ディレクトリから namespaces/eng/ ディレクトリに移動します。

    mv namespaces/gamestore/ namespaces/eng/
    
  5. すべての変更を commit して、リモートのリポジトリに push します。

Config Management Operator が変更を認識し、登録されているすべてのクラスタの gamestore Namespace に新しい Role と RoleBinding を適用します。

構成を削除し、登録されているクラスタから gamestore Namespace を削除するには、eng 抽象 Namespace 全体を削除する新しい commit を作成し、リモート リポジトリに push します。

構成が影響を与えるクラスタの上限

通常、Config Sync は登録済みの各クラスタに構成を適用します。構成ファイルが階層リポジトリnamespaces/ サブディレクトリ内にある場合、Config Sync はまず各クラスタ内に Namespace を作成し、継承したすべての構成ファイルをその Namespace に適用します。

各クラスタのラベルに基づいて特定の構成ファイルが影響を与えるクラスタを制限するには、クラスタのサブセットへの構成ファイルの適用をご覧ください。

構成が影響を与える Namespace の制限

NamespaceSelector は、Kubernetes の labelSelector を使用する特別なタイプの構成です。階層リポジトリまたは階層リポジトリの Namespace スコープ オブジェクトの構成ファイルと組み合わせて NamespaceSelector を宣言すると、その構成ファイルを継承できる Namespace を制限できます。

NamespaceSelector は ClusterSelector と類似していますが、同一ではありません。NamespaceSelector は、構成ファイルが適用される Namespace のプールを絞り込みます。非構造化リポジトリでは、NamespaceSelector アノテーションを宣言するオブジェクトは、NamespaceSelector の条件を満たすすべての Namespace に適用されます。階層リポジトリの場合、NamespaceSelector アノテーションを宣言するオブジェクトは、namespaces/ ディレクトリのディレクトリ構造に関係なく、抽象 Namespace の特定の構成ファイルを継承する Namespace に適用されます。ClusterSelector は、構成のターゲットがクラスタ スコープ オブジェクトまたは Namespace スコープ オブジェクトのいずれであるかにかかわらず、構成ファイルが適用されるクラスタのプールを絞り込みます。

NamespaceSelector の場所

  • 非構造化形式: 非構造化リポジトリでは、NamespaceSelector を任意のディレクトリまたはサブディレクトリに配置できます。
  • 階層形式: 階層リポジトリでは、NamespaceSelector は任意の抽象 Namespace ディレクトリに配置できますが、Namespace ディレクトリに配置することはできません。

    次のリポジトリの例には、NamespaceSelector が有効および無効な場所が示されています。

    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 ディレクトリは抽象 Namespace を表すため、セレクタを配置できます。ただし、gamestore ディレクトリと incubator-1 ディレクトリは実際の Namespace を表しているため、NamespaceSelector を配置できません。

NamespaceSelector の使用

次の構成は、gamestore-selector という名前の NamespaceSelector を作成します。別の構成ファイルでこの NamespaceSelector が参照されている場合、その構成ファイルは app: gamestore ラベルを持つ Namespace のオブジェクトにのみ適用されます。

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

構成ファイルで NamespaceSelector を参照するには、configmanagement.gke.io/namespace-selector アノテーションを NamespaceSelector の名前に設定します。

NamespaceSelector は、別の構成ファイルで参照しなければ効果はありません。gamestore-selector NamespaceSelector が次の ResourceQuota quota と同じ階層にある場合、ResourceQuota は app: gamestore ラベルを持つ Namespace のみに作成されます。

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

まとめると、NamespaceSelector の使用は次の 3 段階からなります。

  1. 名前空間にラベルを追加します。
  2. NamespaceSelector 構成ファイルを作成します。
  3. 別の構成ファイルで NamespaceSelector オブジェクトを参照します。

ある特定のオブジェクト タイプについて継承を無効にする

hierarchyMode フィールドを none に設定すると、任意の構成の継承を選択的に無効にできます。HierarchyConfig はリポジトリの system/ ディレクトリに保存されています。次の例では、RoleBinding の継承を無効にします。

# 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

次のステップ