第6章 プロジェクトの管理
6.1. 概要
OpenShift Container Platform では、プロジェクトは関連オブジェクトを分類し、分離するために使用されます。管理者は、開発者に特定プロジェクトへのアクセスを付与し、開発者の独自プロジェクトの作成を許可したり、個別プロジェクト内の管理者権限を付与したりできます。
6.2. プロジェクトのセルフプロビジョニング
開発者の独自プロジェクトの作成を許可することができます。テンプレートに基づいてプロジェクトをプロビジョニングするエンドポイントがあります。web コンソールおよび oc new-project
コマンドは、開発者による新規プロジェクトの作成時にこのエンドポイントを使用します。
6.2.1. 新規プロジェクトのテンプレートの変更
API サーバーは、master-config.yaml ファイルの projectRequestTemplate
パラメーターで識別されるテンプレートに基づいてプロジェクトを自動的にプロビジョニングします。パラメーターが定義されない場合、API サーバーは要求される名前でプロジェクトを作成するデフォルトテンプレートを作成し、要求するユーザーをプロジェクトの「admin」ロールに割り当てます。
独自のカスタムプロジェクトテンプレートを作成するには、以下を実行します。
現在のデフォルトプロジェクトテンプレートを使って開始します。
$ oc adm create-bootstrap-project-template -o yaml > template.yaml
- オブジェクトを追加するか、または既存オブジェクトを変更することにより、テキストエディターで template.yaml ファイルを変更します。
テンプレートを読み込みます。
$ oc create -f template.yaml -n default
読み込まれたテンプレートを参照するよう master-config.yaml ファイルを変更します。
... projectConfig: projectRequestTemplate: "default/project-request" ...
プロジェクト要求が送信されると、API はテンプレートで以下のパラメーターを置き換えます。
パラメーター | 説明 |
---|---|
PROJECT_NAME |
プロジェクトの名前。必須。 |
PROJECT_DISPLAYNAME |
プロジェクトの表示名。空にできます。 |
PROJECT_DESCRIPTION |
プロジェクトの説明。空にできます。 |
PROJECT_ADMIN_USER |
管理ユーザーのユーザー名。 |
PROJECT_REQUESTING_USER |
要求するユーザーのユーザー名。 |
API へのアクセスは、self-provisioner
ロール と self-provisioners
クラスターロールバインディングを持つ開発者に付与されます。デフォルトで、このロールはすべての認証された開発者が利用できます。
6.2.2. セルフプロビジョニングの無効化
認証されたユーザーグループによる新規プロジェクトのセルフプロビジョニングを禁止することができます。
- cluster-admin 権限を持つユーザーとしてログインします。
self-provisioners
clusterrolebinding usage を確認します。以下のコマンドを実行してから、self-provisioners
セクションの Subjects を確認します。$ oc describe clusterrolebinding.rbac self-provisioners Name: self-provisioners Labels: <none> Annotations: rbac.authorization.kubernetes.io/autoupdate=true Role: Kind: ClusterRole Name: self-provisioner Subjects: Kind Name Namespace ---- ---- --------- Group system:authenticated:oauth
self-provisioner
クラスターロールをグループsystem:authenticated:oauth
から削除します。self-provisioners
クラスターロールバインディングがself-provisioner
ロールのみをsystem:authenticated:oauth
グループにバインドする場合、以下のコマンドを実行します。$ oc patch clusterrolebinding.rbac self-provisioners -p '{"subjects": null}'
self-provisioners
クラスターロールバインディングがself-provisioner
ロールをsystem:authenticated:oauth
グループ以外のユーザー、グループまたはサービスアカウントにバインドする場合、以下のコマンドを実行します。$ oc adm policy remove-cluster-role-from-group self-provisioner system:authenticated:oauth
projectRequestMessage
パラメーター値を master-config.yaml ファイルに設定し、開発者に対して新規プロジェクトの要求方法を指示します。このパラメーター値は、ユーザーのプロジェクトのセルフプロビジョニング試行時に web コンソールやコマンドラインに表示される文字列です。以下のメッセージのいずれかを使用できる可能性があります。-
プロジェクトを要求するには、システム管理者 (
projectname@example.com
) に問い合わせてください。 -
新規プロジェクトを要求するには、
https://internal.example.com/openshift-project-request
にあるプロジェクト要求フォームに記入します。
サンプル YAML ファイル
... projectConfig: ProjectRequestMessage: "message" ...
-
プロジェクトを要求するには、システム管理者 (
ロールへの自動更新を防ぐには、
self-provisioners
クラスターロールバインディングを編集します。自動更新により、クラスターロールがデフォルトの状態にリセットされます。ロールバインディングをコマンドラインで更新するには、以下を実行します。
以下のコマンドを実行します。
$ oc edit clusterrolebinding.rbac self-provisioners
表示されるロールバインディングで、以下の例のように
rbac.authorization.kubernetes.io/autoupdate
パラメーター値をfalse
に設定します。apiVersion: authorization.openshift.io/v1 kind: ClusterRoleBinding metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "false" ...
単一コマンドを使用してロールバインディングを更新するには、以下を実行します。
$ oc patch clusterrolebinding.rbac self-provisioners -p '{ "metadata": { "annotations": { "rbac.authorization.kubernetes.io/autoupdate": "false" } } }'
6.3. ノードセレクターの使用
ノードセレクターは、Pod の配置を制御するためにラベルが付けられたノードと併用されます。
ラベルは、クラスターインストール の実行時に割り当てるか、またはインストール後にノードに追加することができます。
6.3.1. クラスター全体でのデフォルトノードセレクターの設定
クラスター管理者は、クラスター全体でのノードセレクターを使用して Pod の配置を特定ノードに制限することができます。
/etc/origin/master/master-config.yaml でマスター設定ファイルを編集し、デフォルトノードセレクターの値を追加します。これは、指定された nodeSelector
値なしにすべてのプロジェクトで作成された Pod に適用されます。
... projectConfig: defaultNodeSelector: "type=user-node,region=east" ...
変更を有効にするために OpenShift サービスを再起動します。
# master-restart api # master-restart controllers
6.3.2. プロジェクト全体でのノードセレクターの設定
ノードセレクターを使って個々のプロジェクトを作成するには、プロジェクトの作成時に --node-selector
オプションを使用します。たとえば、複数のリージョンを含む OpenShift Container Platform トポロジーがある場合、ノードセレクターを使用して、特定リージョンのノードにのみ Pod をデプロイするよう特定の OpenShift Container Platform プロジェクトを制限することができます。
以下では、myproject
という名前の新規プロジェクトを作成し、Pod を user-node
および east
のラベルが付けられたノードにデプロイするように指定します。
$ oc adm new-project myproject \ --node-selector='type=user-node,region=east'
いったんこのコマンドが実行されると、これが指定プロジェクト内にあるすべての Pod に対して管理者が設定するノードセレクターになります。
new-project
サブコマンドはクラスター管理者および開発者コマンドの oc adm
と oc
の両方で利用できますが、oc adm
コマンドのみがノードセレクターを使った新規プロジェクトの作成に利用できます。new-project
サブコマンドは、プロジェクトのセルフプロビジョニング時にプロジェクト開発者が利用することはできません。
oc adm new-project
コマンドを使用すると、annotation
セクションがプロジェクトに追加されます。プロジェクトを編集し、デフォルトを上書きするように openshift.io/node-selector
値を編集できます。
... metadata: annotations: openshift.io/node-selector: type=user-node,region=east ...
また、以下のコマンドを使用して既存プロジェクトの namespace のデフォルト値を上書きできます。
# oc patch namespace myproject -p \ '{"metadata":{"annotations":{"openshift.io/node-selector":"node-role.kubernetes.io/infra=true"}}}'
openshift.io/node-selector
が空の文字列 (oc adm new-project --node-selector=""
) に設定される場合、プロジェクトには、クラスター全体のデフォルトが設定されている場合でも管理者設定のノードセレクターはありません。これは、クラスター管理者はデフォルトを設定して開発者のプロジェクトをノードのサブセットに制限したり、インフラストラクチャーまたは他のプロジェクトでクラスター全体をスケジュールしたりできることを意味します。
6.3.3. 開発者が指定するノードセレクター
OpenShift Container Platform 開発者は、ノードをさらに制限する必要がある場合に Pod 設定でノードセレクターを設定をすることができます。これはプロジェクトノードセレクターに追加されるものです。つまり、ノードセレクターの値を持つすべてのプロジェクトのノードセレクターの値を依然として指定することができます。
たとえば、プロジェクトが上記のアノテーションで作成 (openshift.io/node-selector: type=user-node,region=east
) されており、開発者が別のノードセレクターをそのプロジェクトの Pod に設定する場合 (例: clearance=classified
)、Pod はこれらの 3 つのラベル (type=user-node
、region=east
、および clearance=classified
) を持つノードにのみスケジュールされます。region=west
が Pod に設定されている場合、Pod はラベル region=east
および region=west
を持つノードを要求しても成功しません。ラベルは 1 つの値にのみ設定できるため、Pod はスケジュールされません。
6.4. ユーザーあたりのセルフプロビジョニングされたプロジェクト数の制限
指定されるユーザーが要求するセルフプロビジョニングされたプロジェクトの数は、ProjectRequestLimit
受付制御プラグインで制限できます。
プロジェクトの要求テンプレートが、「新規プロジェクトのテンプレートの変更」で説明されるプロセスを使用して OpenShift Container Platform 3.1 (またはそれ以前のバージョン) で作成される場合、生成されるテンプレートには、ProjectRequestLimitConfig
に使用されるアノテーション openshift.io/requester: ${PROJECT_REQUESTING_USER}
が含まれません。アノテーションは追加する必要があります。
ユーザーの制限を指定するには、設定をマスター設定ファイル (/etc/origin/master/master-config.yaml) 内のプラグインに指定する必要があります。プラグインの設定は、ユーザーラベルのセレクターの一覧および関連付けられるプロジェクト要求の最大数を取ります。
セレクターは順番に評価されます。現在のユーザーに一致する最初のセレクターは、プロジェクトの最大数を判別するために使用されます。セレクターが指定されていない場合、制限はすべてのユーザーに適用されます。プロジェクトの最大数が指定されていない場合、無制限のプロジェクトが特定のセレクターに対して許可されます。
以下の設定は、ユーザーあたりのグローバル制限を 2 プロジェクトに設定し、ラベル level=advanced
を持つユーザーに対して 10 プロジェクト、ラベル level=admin
を持つユーザーに対して無制限のプロジェクトを許可します。
admissionConfig: pluginConfig: ProjectRequestLimit: configuration: apiVersion: v1 kind: ProjectRequestLimitConfig limits: - selector: level: admin 1 - selector: level: advanced 2 maxProjects: 10 - maxProjects: 2 3
「ユーザーおよびグループラベルの管理」では、ユーザーおよびグループのラベルを追加し、削除し、表示する方法について詳述しています。
変更を加えた後にそれらの変更を有効にするには、OpenShift Container Platform を再起動します。
# master-restart api # master-restart controllers