第1章 GitOps でのマルチテナントサポート
マルチテナンシーとは、1 つのソフトウェアインスタンスを使用して複数の異なるユーザーグループまたはテナントにサービスを提供するソフトウェアアーキテクチャーです。マルチテナンシーを使用すると、1 つの Argo CD インスタンスを共有して、ユーザー間の分離を確保しながらリソースをデプロイできます。このセクションは、クラスター管理者が Argo CD インスタンスのスコープを理解し、特定のモードを選択するタイミングを理解するのに役立ちます。
クラスター管理者は、OpenShift Container Platform の Red Hat OpenShift GitOps Operator を使用すると、アプリケーションデリバリーチーム (テナント) にクラスターへのマルチテナントアクセスを提供できます。管理者権限がなくても、テナントがユーザー定義の namespace で専用の Argo CD インスタンスを作成および管理できます。テナントは完全に自律し、他のテナントに干渉することなく、このインスタンスをカスタマイズして、テナントのニーズや要件に対応できます。
マルチテナントクラスターの場合は、Argo CD インスタンスの管理者と、クラスターとそのユーザーの管理者が異なる場合があります。したがって、クラスター内で Argo CD Application Controller (argocd-application-controller
コンポーネント) をスーパーユーザーとして使用できません。
Argo CD Application Controller は、マネージドクラスター内のリソースを調整します。したがって、GitOps Operator でマルチテナンシーを使用するには、ユースケース、テナント、および要件に応じて特定の操作を実行するために、Argo CD インスタンス、アプリケーション、およびリモートクラスターに対して特定の権限を明示的に設定、付与、拡張、または制限する必要があります。
1.1. Argo CD インスタンススコープ
Red Hat OpenShift GitOps Operator は、マルチテナントをサポートする以下のモードに分類できるインスタンスを作成します。
- namespace スコープインスタンス (アプリケーション配信インスタンス)
- クラスタースコープインスタンス
- デフォルトのクラスタースコープインスタンス
1.1.1. namespace スコープインスタンス (アプリケーション配信インスタンス)
namespace の 1 つに Argo CD カスタムリソース (CR) を作成すると、GitOps Operator はこの namespace で Argo CD を起動し、アプリケーション配信に使用できるようになります。初期状態では、インストールされているのと同じ namespace にのみリソースをデプロイする権限がこのインスタンスにあります。ただし、特定の要件を満たすようにインスタンスを設定する必要がある場合があります。
GitOps Operator を使用すると、Argo CD インスタンスの権限を拡張して、Argo CD Application Controller がインストールされている場所とは別の namespace にリソースをデプロイできるようになります。
namespace 内の GitOps Operator が作成するロールのスコープは namespace で、namespace リソースにのみアクセスできます。Operator は、管理する namespace 外ではアクションを実行できません。
この方法はどのように機能しますか。
GitOps Operator を使用すると、OpenShift ユーザーは、自分の namespace で argoproj.io/v1alpha1
または argoproj.io/v1beta1
API に Argo CD リソースを作成する権限を持っている限り、自分の namespace で Argo CD インスタンスをインスタンス化できます。現在、namespace スコープのインスタンスは、管理する 1 つまたは複数の namespace に対して完全な管理権限があります。つまり、その namespace 内のすべてのリソースに対してすべての動詞を使用できるのと同じです。
Argo CD アプリケーションコントローラーがリソースを他の namespace にデプロイするには、namespace スコープのインスタンスで管理するこれらの namespace にラベルを付けて示すための Kubernetes ロールとロールバインディングが必要です。GitOps Operator は、argocd.argoproj.io/managed-by
ラベルを使用して、これらのロールとロールバインディングを自動的に作成します。このラベルを使用して値を設定し、管理対象の namespace を指定します。次に、argocd.argoproj.io/managed-by
ラベルを使用して、namespace スコープのインスタンスモードで GitOps Operator をデプロイすると、インスタンスが管理するすべての namespace にロールとロールバインディングのセットが作成されます。
argocd.argoproj.io/managed-by
ラベルは、GitOps Operator と同じクラスター内の namespace に対してのみ機能します。リモートクラスターの場合は、権限を手動で定義する必要があります。
デフォルトでは、managed-by
ラベルを使用して namespace にラベルを付けると、GitOps Operator は、ラベル付けされた namespace の Kubernetes デフォルトの admin
クラスターロールと同等の権限を Argo CD Application Controller に付与します。ただし、Operator の Subscription
リソースでそれぞれ CONTROLLER_CLUSTER_ROLE
および CONTROLLER_SERVER_ROLE
環境変数を使用して、コントローラーおよびサーバーコンポーネントに使用される代替クラスターロールを定義することもできます。これらの変数を指定すると、Operator は namespace にデフォルトのロールを作成せず、対応するクラスターロールの namespace にロールバインディングのみを作成します。管理者が責任を持って、クラスターロールを作成し、権限を完全に制御するようにしてください。
-
ロールを定義すると、Argo CD はすべてのリソースと対話しようとします。したがって、カスタムクラスターロール内のすべてのリソースに
view
、get
およびwatch
権限を付与するか、ロールで定義されたresourceInclusions
またはresourceExclusions
フィールドを通じて特定のリソースを含めたり除外したりするように Argo CD CR を設定する必要があります。 - namespace スコープのインスタンスでは、namespace、カスタムリソース定義 (CRD)、クラスターロールなどのクラスタースコープのリソースを管理できません。
1.1.2. クラスタースコープインスタンス
クラスタースコープインスタンスは、クラスター全体にリソースをデプロイおよび管理することを目的としています。
任意の namespace のアプリケーション 機能を使用する場合は、Argo CD インスタンススコープのモードをクラスタースコープインスタンスとして選択します。
クラスタースコープのインスタンスはクラスターレベルのリソースにアクセスできるため、通常はクラスター設定に使用されますが、常に使用されるわけではありません。特定の namespace スコープの Argo CD インスタンスをクラスタースコープに昇格させることができます。インスタンスを昇格するには、GitOps Operator の Subscription
リソースを変更する必要があります。
- インスタンスを昇格する場合には、慎重に検討してください。
- アプリケーションデリバリーチームが自己管理しているインスタンスを昇格しないでください。このようなインスタンスを昇格すると、自己管理インスタンスのユーザーがクラスター管理者になり、権限を完全に制御できるようになるため、クラスターにとって重大なセキュリティーリスクとなります。
Argo CD 内でマルチテナント設定を指定する場合は、細心の注意を払う必要があります。たとえば、クラスター管理者が複数のアプリケーションデリバリーチーム間で共有され、クラスター管理者が管理する Argo CD インスタンスを設定するユースケースでは、カスタムのクラスタースコープインスタンスが必要になる場合があります。
この方法はどのように機能しますか。
ユーザーが cluster-admin
権限で Argo CD インスタンスをデプロイできないようにするには、Subscription
リソースの ARGOCD_CLUSTER_CONFIG_NAMESPACES
環境変数を使用して、クラスター権限を持つ namespace を識別する必要があります。
クラスター管理者以外のユーザーは Subscription
リソースにアクセスできないため、インスタンスの権限を昇格してクラスターセキュリティーを回避できません。
インスタンスをクラスタースコープとして指定すると、Operator は、その namespace 内の Argo CD Application Controller とサーバーサービスアカウントに対して、一連のクラスターロールとクラスターロールバインディングを自動的に作成します。このデフォルトのロールは、標準の cluster-admin
ロールと同等のものではありません。割り当てられる権限のセットがはるかに少なくなります。これらの権限は、必要に応じて追加のクラスターロールまたはクラスターロールバインディングを作成することで拡張できます。
1.1.3. デフォルトのクラスタースコープインスタンス
GitOps Operator をインストールすると、デフォルトでは、openshift-gitops
namespace にクラスタースコープのインスタンスが作成されます。このインスタンスは、独自性の高い方法で設定されています。その主な目的は、クラスター管理者が特定のクラスター設定リソースを効率的に管理できるようにすることです。
- デフォルトのクラスタースコープインスタンスを、アプリケーション配信などの他の用途には使用しないでください。
-
cluster-admin
ロールが割り当てられていないユーザーには、デフォルトのクラスタースコープインスタンスにアクセスする権限を付与しないでください。
デフォルトのインスタンスには完全な cluster-admin
権限がありません。クラスター内のすべてのリソースに対する読み取りアクセス権がありますが、デプロイできるのは限られたリソースセットのみです。
クラスター設定には openshift-gitops
namespace のデフォルトの Argo CD インスタンスを使用し、他の namespace の 1 つまたは複数の個別のインスタンスには委譲テナントユースケースを使用します。