このページでは、クラスタとクラスタ スコープ オブジェクトを構成する方法について説明します。Namespace オブジェクトと Namespace スコープ オブジェクトの構成もご覧ください。
クラスタとクラスタ スコープ オブジェクトを構成する
非構造化リポジトリでは、クラスタとクラスタ スコープ オブジェクトの構成ファイルを最も都合の良い方法で整理できます。この方法で整理されたすべての構成ファイルは、Config Sync に登録されたすべてのクラスタに適用されます。
階層型リポジトリでは、クラスタとクラスタ スコープ オブジェクトのすべての構成ファイルは cluster/
ディレクトリにあります。cluster/
内のすべての構成ファイルは、Config Sync に登録されたすべてのクラスタに適用されます。
CustomResourceDefinition を構成する
Config Sync では、他のリソースの同期と同じ方法で CustomResourceDefinitions(CRD) を同期できます。CRD を同期するときに注意する点は、次のとおりです。
階層リポジトリの CRD は、Namespace 付きのカスタム リソースを宣言する場合でも、
cluster/
ディレクトリに配置する必要があります。CRD とそれに対応する CustomResource の更新は、予測可能な順序では行われません。同じ commit で CRD とそれに対応する CustomResource を変更した場合、カスタム リソースが更新される前に CRD が更新されることはありません。これにより、CustomResource と CRD の両方がクラスタに存在するようになるまで、
nomos status
で一時的なエラーが報告されることがあります。リポジトリ内の CustomResource が CRD に依存している場合、Config Sync で CRD を削除することはできません。CRD を削除するには、その CustomResource も削除する必要があります。リポジトリに対する同じ commit で両方を削除することをおすすめします。
CRD がすでにクラスタに存在していることを保証できれば、CRD と同期せずに CustomResource を同期できます。
構成ファイルを適用するクラスタを制限する
デフォルトでは、Config Sync は登録済みのすべてのクラスタに構成ファイルを適用します。ただし、クラスタのサブセットにのみ構成ファイルを適用する必要がある場合は、cluster-name-selector アノテーションまたは ClusterSelector 構成ファイルをリポジトリに追加できます。
cluster-name-selector
アノテーションを使用すると、構成ファイルを適用するクラスタのサブセットを簡単な方法で指定できます。このオプションでは、名前によるクラスタの選択のみがサポートされます。
ClusterSelector
オブジェクトはラベルによるクラスタの選択をサポートしていますが、より複雑な構成が必要です。
cluster-name-selector
アノテーションを使用して構成する
configsync.gke.io/cluster-name-selector
アノテーションを使用して、クラスタのサブセットに構成ファイルを適用できます。このアノテーションを使用すると、クラスタ名を使用して一連のクラスタに構成ファイルを適用できます。アノテーションの値は、ターゲット クラスタ名のカンマ区切りリストです。アノテーションは、クラスタ スコープ オブジェクトと Namespace スコープ オブジェクトに適用できます。アノテーションがクラスタ名と一致し、クラスタが属する Namespace が選択されている場合、Namespace オブジェクトが選択されます。
単一のクラスタを選択する
次の構成ファイルは、Namespace を読み取るための権限セットを定義する namespace-reader
という Role を作成します。この 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"]
クラスタのリストを選択する
次の構成ファイルは前の例と同じ Role を作成しますが、この Role は、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 の labelSelector を使用する特別なタイプの構成ファイルです。ClusterSelector を使用することで、特定の構成を適用する対象のクラスタをクラスタのラベルに基づいて制限できます。ClusterSelector を使用して、Namespace スコープ オブジェクトをインスタンス化するクラスタを制限することもできます。
他の labelSelector と同様に、ClusterSelector は AND ロジックを使用します。ClusterSelector は AND ロジックを使用するため、定義したすべてのラベルと一致する場合にのみ、オブジェクトが選択されます。
ClusterSelector 構成ファイルはクラスタ内で維持されません。代わりに、アノテーションを使用して別の構成で参照します。この構成は ClusterSelector に一致するクラスタにのみ適用されます。
ClusterSelector を使用する前に、各クラスタに一意の名前と、選択可能なラベルのセットが必要です。クラスタ メタデータは、信頼できる情報源のクラスタ構成で指定します。
次に、クラスタにラベルを追加し、ClusterSelector を作成して、別の構成で参照します。
クラスタにラベルを追加する
ClusterSelector を使用するには、各クラスタに選択可能なラベルのセットが必要です。非構造化リポジトリでは、Cluster の構成ファイルは構成ファイル ディレクトリまたはその下位ディレクトリに自由に保存できます。階層型リポジトリでは、Cluster 構成ファイルは clusterregistry/
ディレクトリに保存されます。
構成ファイルをクラスタに適用するには、Cluster 構成ファイルの metadata.name
フィールドが ConfigManagement オブジェクトの clusterName
フィールドと一致する必要があります。
次の Cluster 構成ファイルの例では、cluster-2
に environment: prod
ラベルと location: central
ラベルがあることを宣言しています。
kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
name: cluster-2
labels:
environment: prod
location: central
Cluster 構成ファイルを使用してアノテーションを適用することもできます。
ClusterSelector を作成する
ClusterSelector は、特定のラベルまたはラベルの組み合わせを持つクラスタのみを選択します。非構造化リポジトリでは、ClusterSelector は同期ディレクトリまたはその下位ディレクトリに自由に保存できます。階層型リポジトリでは、ClusterSelector はリポジトリ内の最上位にある 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 を別の構成で参照するには、アノテーション 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"]
Namespace スコープの構成ファイルが影響を与えるクラスタを制限する
デフォルトでは、Config Sync は Namespace が継承した構成ファイルを、Namespace が存在する各クラスタの Namespace に適用します。ClusterSelector を使用して、構成をこのようなクラスタのサブセットにのみ適用できます。
たとえば、クラスタやそのクライアントの地理的位置に応じてクラスタを構成できます。この構成はローカライズやコンプライアンスに役立ちます。このセクションの例では、言語 / 地域に固有の構成ファイルをラベル location: france
を持つクラスタのみに適用しています。
次の Cluster 構成では、cluster-1
という名前のクラスタに location: france
ラベルが追加されます。
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
この構成ファイルを抽象 Namespace や namespaces/eng
などの Namespace ディレクトリに配置すると、それを継承し、location: france
ラベルを持つクラスタの Namespace にのみ適用されます。