Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

16.5.4. プロジェクトへの Pod 配置の制御

Pod ノードセレクターの受付コントローラーを使用して、Pod を特定のプロジェクトに関連付けられたノードに対して強制的に適用したり、Pod がそれらのノードでスケジュールされないようにしたりできます。

Pod ノードセレクターの受付コントローラーは、プロジェクトのラベル と Pod で指定されるノードセレクターを使用して Pod を配置する場所を決定します。新規 Pod は、Pod のノードセレクターがプロジェクトのラベルに一致する場合にのみプロジェクトに関連付けられたノードに配置されます。

Pod の作成後に、ノードセレクターは Pod にマージされ、Pod 仕様に元々含まれていたラベルとノードセレクターの新規ラベルが含まれるようにします。以下の例は、マージの結果について示しています。

Pod ノードセレクターの受付コントローラーにより、特定のプロジェクトで許可されるラベルの一覧を作成することもできます。この一覧は開発者がプロジェクトで使用できるラベルを認識するための ホワイトリスト として機能し、管理者がクラスターでのラベル設定の制御を強化するのに役立ちます。

Pod ノードセレクター の受付コントローラーをアクティブにするには、以下を実行します。

  1. 以下の方法のいずれかを使用して Pod ノードセレクター の受付コントローラーとホワイトリストを設定します。

    • 以下をマスター設定ファイル (/etc/origin/master/master-config.yaml) に追加します。

      admissionConfig:
        pluginConfig:
          PodNodeSelector:
            configuration:
              podNodeSelectorPluginConfig: 1
                clusterDefaultNodeSelector: "k3=v3" 2
                ns1: region=west,env=test,infra=fedora,os=fedora 3
      1
      Pod ノードセレクター の受付コントローラープラグインを追加します。
      2
      すべてのノードのデフォルトラベルを作成します。
      3
      指定されたプロジェクトで許可されるラベルのホワイトリストを作成します。ここで、プロジェクトは ns1 で、ラベルはそれに続く key=value ペアになります。
    • 受付コントローラーの情報を含むファイルを作成します。

      podNodeSelectorPluginConfig:
          clusterDefaultNodeSelector: "k3=v3"
           ns1: region=west,env=test,infra=fedora,os=fedora

      次に、マスター設定でファイルを参照します。

      admissionConfig:
        pluginConfig:
          PodNodeSelector:
            location: <path-to-file>
      注記

      プロジェクトにノードセレクターが指定されていない場合、そのプロジェクトに関連付けられた Pod はデフォルトのノードセレクター (clusterDefaultNodeSelector) を使用してマージされます。

  2. 変更を有効にするために OpenShift Container Platform を再起動します。

    # master-restart api
    # master-restart controllers
  3. scheduler.alpha.kubernetes.io/node-selector アノテーションおよびラベルを含むプロジェクトオブジェクトを作成します。

    apiVersion: v1
    kind: Namespace
    metadata
      name: ns1
      annotations:
        scheduler.alpha.kubernetes.io/node-selector: env=test,infra=fedora 1
    spec: {},
    status: {}
    1
    プロジェクトのラベルセレクターに一致するラベルを作成するためのアノテーションです。ここで、キー/値のラベルは env=test および infra=fedora になります。
    注記

    Pod Node Selector 受付コントローラーを使用している場合、プロジェクトノードセレクターを設定するるために oc adm new-project <project-name> を設定することはできません。oc adm new-project myproject --node-selector='type=user-node,region=<region> コマンドを使用してプロジェクトノードセレクターを設定する場合、OpenShift Container Platform は openshift.io/node-selector アノテーションを設定します。 これは NodeEnv 受付プラグインで処理されます。

  4. ノードセレクターにラベルを含む Pod 仕様を作成します。以下は例になります。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: hello-pod
      name: hello-pod
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod:latest"
          imagePullPolicy: IfNotPresent
          name: hello-pod
          ports:
            - containerPort: 8080
              protocol: TCP
          resources: {}
          securityContext:
            capabilities: {}
            privileged: false
          terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      nodeSelector: 1
        env: test
        os: fedora
      serviceAccount: ""
    status: {}
    1
    プロジェクトラベルに一致するノードセレクター。
  5. プロジェクトに Pod を作成します。

    # oc create -f pod.yaml --namespace=ns1
  6. ノードセレクターのラベルが Pod 設定に追加されていることを確認します。

    get pod pod1 --namespace=ns1 -o json
    
    nodeSelector": {
     "env": "test",
     "infra": "fedora",
     "os": "fedora"
    }

    ノードセレクターは Pod にマージされ、Pod は適切なプロジェクトでスケジュールされます。

プロジェクト仕様で指定されていないラベルを使って Pod を作成する場合、Pod はノードでスケジュールされません。

たとえば、ここでラベル env: production は、いずれのプロジェクト仕様にも含まれていません。

nodeSelector:
 "env: production"
 "infra": "fedora",
 "os": "fedora"

ノードセレクターのアノテーションのないノードがある場合は、Pod はそこにスケジュールされます。