Windows Container Support for OpenShift

OpenShift Container Platform 4.6

Red Hat OpenShift for Windows Containers ガイド

概要

Red Hat OpenShift for Windows コンテナーは、OpenShift Container Platform で Microsoft Windows Server コンテナーを実行するための組み込みサポートを提供します。本書では、すべての詳細情報を提供します。

第1章 Windows Container Support for Red Hat OpenShift リリースノート

1.1. Windows Container Support for Red Hat OpenShift について

Windows Container Support for Red Hat OpenShift は、OpenShift Container Platform クラスターで Windows コンピュートノードを実行する機能を提供します。これは、Red Hat Windows Machine Config Operator (WMCO) を使用して Windows ノードをインストールし、管理することで実行できます。Windows ノードが利用可能になると、Windows コンテナーワークロードを OpenShift Container Platform で実行できます。

Red Hat OpenShift for Windows Containers のリースノートでは、OpenShift Container Platform にすべての Windows コンテナーワークロード機能を提供する WMCO の開発の進展を追跡できます。

1.2. サポート

Red Hat WMCO のサポートを受けるには、サブスクリプションが必要です。実稼働クラスターへの Windows コンテナーワークロードのデプロイは、サブスクリプションなしではサポートされません。サブスクリプションをお持ちでない場合は、正式なサポートのないディストリビューションであるコミュニティー版の WMCO 使用できます。Red Hat カスタマーポータルでサポートをリクエストします

1.3. Red Hat Windows Machine Config Operator 1.0.4 リリースノート

発行日: 2021-04-15

WMCO 1.0.4 がバグ修正およびセキュリティー更新と共に利用できるようになりました。WMCO のコンポーネントは RHBA-2021:1061 でリリースされています。

WMCO 1.0.2 リリースについて文書化されたサポートステートメントおよび既知の問題は、本リリースの WMCO にも適用されます。

1.3.1. バグ修正

  • 以前のバージョンでは、2 つの Windows ノードを持つクラスターがあり、2 つのレプリカを持つ Web サーバーデプロイメントを作成している場合、Pod はそれぞれ Windows コンピュートノードに到達しました。このシナリオでは、タイプが LoadBalancerService オブジェクトを作成する場合、ロードバランサーのエンドポイントとの通信は不安定になりました。この問題を軽減するには、バージョン 10.0.17763.1457 以前で Windows Server 2019 を使用する必要があります。この問題は修正され、Windows Server 2019 イメージバージョンのサブセットに制限されなくなりました。(BZ#1942630)

1.4. Red Hat Windows Machine Config Operator 1.0.3 リリースノート

発行日: 2021-02-15

WMCO 1.0.3 がバグ修正およびセキュリティー更新と共に利用できるようになりました。WMCO のコンポーネントは RHBA-2021:0410 でリリースされました

重要

WMCO 2.x にアップグレードする前に、WMCO 1.0.3+ にアップグレードする必要があります。

WMCO 1.0.2 リリースについて文書化されたサポートステートメントおよび既知の問題は、本リリースの WMCO にも適用されます。

1.5. Red Hat Windows Machine Config Operator 1.0.2 リリースノート

発行日: 2020-12-18

本 WMCO リリースノートは、Windows コンピュートノードを OpenShift Container Platform クラスターで実行するための初期サポートを提供します。WMCO のコンポーネントは RHBA-2020:5596 でリリースされています。

WMCO は、以下のクラウドプロバイダーで実行されるインストーラーでプロビジョニングされるインフラストラクチャーを使用してビルドされた自己管理型クラスターをサポートします。

  • Amazon Web Services (AWS)
  • Microsoft Azure

以下の Windows Server オペレーティングシステムは、WMCO の初回リリースでサポートされます。

  • Windows Server 長期サービスチャネル (Long-Term Servicing Channel、LTSC): Windows Server 2019
重要

Windows コンテナーワークロードの実行は、ネットワークが制限された環境または非接続環境のクラスターではサポートされません。

第2章 Windows コンテナーワークロードについて

Windows Container Support for Red Hat OpenShift は Microsoft Windows Server コンテナーを OpenShift Container Platform で実行するための組み込みサポートを提供します。Linux と Windows ワークロードの組み合わせを使用して異種環境を管理する場合、OpenShift Container Platform では、Windows Server コンテナーで実行されている Windows ワークロードをデプロイできますが、Red Hat Enterprise Linux CoreOS (RHCOS) または Red Hat Enterprise Linux (RHEL) でホストされる従来の Linux ワークロードも提供できます。

Windows コンテナーワークロードは、以下のクラウドプロバイダーで実行されるクラスターでサポートされます。

  • Amazon Web Services (AWS)
  • Microsoft Azure

以下の Windows Server オペレーティングシステムは OpenShift Container Platform 4.6 でサポートされます。

  • Windows Server 長期サービスチャネル (Long-Term Servicing Channel、LTSC): Windows Server 2019

詳細は、Windows Server チャネルについての Microsoft のドキュメントを参照してください。

注記

Windows ノードを持つクラスターのマルチテナンシーはサポートされません。マルチテナントの悪意のある使用により、すべての Kubernetes 環境でのセキュリティー上のリスクが導入されます。Pod セキュリティーポリシー、またはノードのより詳細なロールベースアクセス制御(RBAC)などの追加のセキュリティー機能により、悪用がより困難になります。ただし、悪意のあるマルチテナントワークロードの実行を選択する場合、ハイパーバイザーは使用する必要のある唯一のセキュリティーオプションになります。Kubernetes のセキュリティードメインは、個別のノードではなく、クラスター全体に対応します。これらのタイプの悪意のあるマルチテナントワークロードには、物理的に分離されたクラスターを使用する必要があります。

Windows Server コンテナーは共有カーネルを使用してリソース分離を行いますが、悪意のあるマルチテナンシーのシナリオで使用することは意図されていません。悪意のあるマルチテナンシーを使用するシナリオの場合、テナントを確実に分離するために Hyper-V 分離コンテナーを使用する必要があります。

2.1. Windows ワークロード管理

クラスターで Windows ワークロードを実行するには、まず Windows Machine Config Operator (WMCO) をインストールする必要があります。WMCO は Linux ベースのコントロールプレーンおよびコンピュートノードで実行される Linux ベースの Operator です。WMCO は、クラスター上で Windows ワークロードをデプロイし、管理するプロセスをオーケストレーションします。

図2.1 WMCO の設計

WMCO workflow

Windows ワークロードをデプロイする前に、Windows コンピュートノードを作成し、これをクラスターに参加させる必要があります。Windows ノードは、クラスター内の Windows ワークロードをホストし、他の Linux ベースのコンピュートノードと共に実行できます。Windows Server コンピュートマシンをホストする Windows マシンセットを作成して、Windows コンピュートノードを作成することができます。Docker 形式のコンテナーランタイムアドオンが有効にされた Windows OS イメージを指定する Windows 固有のラベルをマシンセットに適用する必要があります。

重要

現時点で、Docker 形式のコンテナーランタイムは Windows ノードで使用されます。Kubernetes では、コンテナーランタイムとしての Docker を非推奨としています。詳細は、Kubernetes ドキュメントの Docker の非推奨について参照してください。Containerd は、今後の Kubernetes リリースで Windows ノードについてサポートされる新しいコンテナーランタイムになります。

WMCO は Windows ラベルの付いたマシンを監視します。Windows マシンセットを検出し、そのそれぞれのマシンがプロビジョニングされると、WMCO は基礎となる Windows 仮想マシン (VM) を設定し、それがコンピュートノードとしてクラスターに参加できるようにします。

図2.2 Windows および Linux ワークロードの組み合わせ

Mixed Windows and Linux workloads

WMCO は、Windows インスタンスとの対話に使用されるプライベートキーが含まれる namespace に事前に決定されたシークレットがあることを想定します。WMCO は起動時にこのシークレットの有無を確認し、作成した Windows MachineSet オブジェクトで参照する必要のあるユーザーデータのシークレットを作成します。次に WMCO は、プライベートキーに対応するパブリックキーでユーザーデータのシークレットを設定します。このデータが適用されると、クラスターは SSH 接続を使用して Windows 仮想マシンに接続できます。

クラスターが Windows 仮想マシンとの接続を確立した後に、Linux ベースのノードの場合と同様の手法を使用して Windows ノードを管理できます。

注記

OpenShift Container Platform Web コンソールでは、Windows ノードのノードグラフおよびワークロードグラフを提供しません。現時点で Windows ノードにメトリクスは利用できません。

Windows ワークロードの Windows ノードへのスケジュールは、テイント、容認、ノードセレクターなどの一般的な Pod スケジュールの手法を使用して実行できますが、RuntimeClass オブジェクトを使用して Windows ワークロードを Linux ワークロードおよび他の Windows 版のワークロードから区別できます。

2.2. Windows ノードサービス

以下の Windows 固有のサービスは、各 Windows ノードにインストールされます。

サービス説明

kubelet

Windows ノードを登録し、そのステータスを管理します。

Container Network Interface (CNI) プラグイン

Windows ノードのネットワークを公開します

Windows Machine Config Bootstrapper (WMCB)

kubelet および CNI プラグインを設定します。

hybrid-overlay

OpenShift Container Platform Host Network Service(HNS)を作成します

kube-proxy

外部との通信を許可するノードでネットワークルールを維持します。

第3章 Windows コンテナーワークロードの有効化

Windows ワークロードをクラスターに追加する前に、OpenShift Container Platform OperatorHub で利用可能な Windows Machine Config Operator (WMCO) をインストールする必要があります。WMCO は、クラスター上で Windows ワークロードをデプロイし、管理するプロセスをオーケストレーションします。

前提条件

  • cluster-admin パーミッションを持つアカウントを使用して OpenShift Container Platform クラスターにアクセスできること。
  • OpenShift CLI (oc) がインストールされている。
  • インストーラーでプロビジョニングされるインフラストラクチャーを使用した vSphere にクラスターをインストールしている。ユーザーによってプロビジョニングされるインフラストラクチャーでインストールされるクラスターは、Windows コンテナーのワークロードではサポートされません。
  • クラスターに OVN-Kubernetes を使用してハイブリッドネットワークを設定している。これは、クラスターのインストール時に完了する必要があります。詳細は、「ハイブリッドネットワークの設定」を参照してください
  • OpenShift Container Platform クラスター (バージョン 4.6.8 以降) を実行している。

3.1. Windows Machine Config Operator のインストール

Web コンソールまたは OpenShift CLI (oc) のいずれかを使用して Windows Machine Config Operator をインストールできます。

3.1.1. Web コンソールを使用した Windows Machine Config Operator のインストール

OpenShift Container Platform Web コンソールを使って Windows Machine Config Operator (WMCO) をインストールすることができます。

手順

  1. OpenShift Container Platform Web コンソールの Administrator パースペクティブから、 Operators → OperatorHub ページに移動します。
  2. Filter by keyword ボックスを使用して、カタログで Windows Machine Config Operator を検索します。Windows Machine Config Operator タイルをクリックします。
  3. Operator についての情報を確認してから、Install をクリックします。
  4. Install Operator ページで以下を行います。

    1. Update Channel として stable チャネルを選択します。stable チャネルを使用すると、WMCO の最新の安定したリリースをインストールできます。
    2. WMCO は単一の namespace でのみ利用できるようにする必要があるため、インストールモード は事前に設定されます。
    3. WMCO の Installed Namespace を選択します。デフォルトの Operator の推奨される namespace は openshift-windows-machine-config-operator です。
    4. Approval Strategy を選択します。

      • Automatic ストラテジーにより、Operator Lifecycle Manager (OLM) は新規バージョンが利用可能になると Operator を自動的に更新できます。
      • Manual ストラテジーには、Operator の更新を承認するための適切な認証情報を持つユーザーが必要です。
  1. Install をクリックします。WMCO が Installed Operators ページに一覧表示されます。

    注記

    WMCO は、openshift-windows-machine-config-operator などのように、定義した namespace に自動的にインストールされます。

  2. StatusSucceeded が表示されていることを検証し、WMCO のインストールが正常に行われたことを確認します。

3.1.2. CLI を使用した Windows Machine Config Operator のインストール

OpenShift CLI (oc) を使用して、Windows Machine Config Operator (WMCO) をインストールできます。

手順

  1. WMCO の namespace を作成します。

    1. WMCO の Namespace オブジェクト YAML ファイルを作成します。例: wmco-namespace.yaml

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-windows-machine-config-operator 1
      1
      WMCO を openshift-windows-machine-config-operator namespace にデプロイすることが推奨されます。
    2. namespace を作成します。

      $ oc create -f <file-name>.yaml

      以下は例になります。

      $ oc create -f wmco-namespace.yaml
  2. WMCO の Operator グループを作成します。

    1. OperatorGroup オブジェクト YAML ファイルを作成します。例: wmco-og.yaml

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: windows-machine-config-operator
        namespace: openshift-windows-machine-config-operator
      spec:
        targetNamespaces:
        - openshift-windows-machine-config-operator
    2. Operator グループを作成します。

      $ oc create -f <file-name>.yaml

      以下は例になります。

      $ oc create -f wmco-og.yaml
  3. namespace を WMCO にサブスクライブします。

    1. Subscription オブジェクト YAML ファイルを作成します。例: wmco-sub.yaml

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: windows-machine-config-operator
        namespace: openshift-windows-machine-config-operator
      spec:
        channel: "stable" 1
        installPlanApproval: "Automatic" 2
        name: "windows-machine-config-operator"
        source: "redhat-operators" 3
        sourceNamespace: "openshift-marketplace" 4
      1
      stable をチャネルとして指定します。
      2
      承認ストラテジーを設定します。Automatic または Manual を設定できます。
      3
      windows-machine-config-operator パッケージマニフェストが含まれる、redhat-operators カタログソースを指定します。OpenShift Container Platform が、非接続クラスターとも呼ばれる制限されたネットワークにインストールされている場合、Operator LifeCycle Manager (OLM) の設定時に作成した CatalogSource オブジェクトの名前を指定します。
      4
      カタログソースの namespace。デフォルトの OperatorHub カタログソースには openshift-marketplace を使用します。
    2. サブスクリプションを作成します。

      $ oc create -f <file-name>.yaml

      以下は例になります。

      $ oc create -f wmco-sub.yaml

      WMCO が openshift-windows-machine-config-operator にインストールされるようになりました。

  4. WMCO インストールを確認します。

    $ oc get csv -n openshift-windows-machine-config-operator

    出力例

    NAME                                    DISPLAY                           VERSION   REPLACES   PHASE
    windows-machine-config-operator.1.0.0   Windows Machine Config Operator   1.0.0                Succeeded

3.2. Windows Machine Config Operator のシークレットの設定

Windows Machine Config Operator (WMCO) を実行するには、プライベートキーを含む WMCO namespace でシークレットを作成する必要があります。これは、WMCO が Windows 仮想マシン (VM) と通信できるようにするために必要です。

前提条件

  • Operator Lifecycle Manager (OLM) を使用して Windows Machine Config Operator (WMCO) をインストールしている。
  • RSA キーが含まれる PEM でエンコードされたファイルを作成します。

手順

  • Windows 仮想マシンへのアクセスに必要なシークレットを定義します。

    $ oc create secret generic cloud-private-key --from-file=private-key.pem=${HOME}/.ssh/<key> \
        -n openshift-windows-machine-config-operator 1
1
openshift-windows-machine-config-operator などの、WMCO namespace のプライベートキーを作成する必要があります。

クラスターのインストール時に使用されるものとは異なるプライベートキーを使用することが推奨されます。

追加リソース

第4章 Windows MachineSet オブジェクトの作成

4.1. AWS での Windows MachineSet オブジェクトの作成

Amazon Web Services (AWS) で OpenShift Container Platform クラスターの特定の機能を果たすように MachineSet オブジェクトを作成することができます。たとえば、インフラストラクチャー Windows マシンセットおよび関連マシンを作成して、サポートする Windows ワークロードを新規の Windows マシンに移動できます。

前提条件

  • Operator Lifecycle Manager (OLM) を使用して Windows Machine Config Operator (WMCO) をインストールしている。
  • Docker フォーマットのコンテナーランタイムアドオンアドオンが有効な状態で、サポートされている Windows Server をオペレーティングシステムのイメージとして使用している。
重要

現時点で、Docker 形式のコンテナーランタイムは Windows ノードで使用されます。Kubernetes では、コンテナーランタイムとしての Docker を非推奨としています。詳細は、Kubernetes ドキュメントの Docker の非推奨について参照してください。Containerd は、今後の Kubernetes リリースで Windows ノードについてサポートされる新しいコンテナーランタイムになります。

4.1.1. マシン API の概要

マシン API は、アップストリームのクラスター API プロジェクトおよびカスタム OpenShift Container Platform リソースに基づく重要なリソースの組み合わせです。

OpenShift Container Platform 4.6 クラスターの場合、マシン API はクラスターインストールの終了後にすべてのノードホストのプロビジョニングの管理アクションを実行します。このシステムにより、OpenShift Container Platform 4.6 はパブリックまたはプライベートのクラウドインフラストラクチャーに加えて弾力性があり、動的なプロビジョニング方法を提供します。

以下の 2 つのリソースは重要なリソースになります。

マシン
ノードのホストを記述する基本的なユニットです。マシンには、複数の異なるクラウドプラットフォーム用に提供されるコンピュートノードのタイプを記述する providerSpec 仕様があります。たとえば、Amazon Web Services (AWS) 上のワーカーノードのマシンタイプは特定のマシンタイプおよび必要なメタデータを定義する場合があります。
マシンセット
MachineSet リソースはマシンのグループです。マシンセットとマシンの関係は、レプリカセットと Pod の関係と同様です。マシンを追加する必要がある場合や、マシンの数を縮小したりする必要がある場合、コンピューティングのニーズに応じてマシンセットの replicas フィールドを変更します。

以下のカスタムリソースは、クラスターに機能を追加します。

Machine Autoscaler
MachineAutoscaler リソースはマシンをクラウドで自動的にスケーリングします。ノードに対する最小および最大のスケーリングの境界を、指定されるマシンセットに設定でき、Machine Autoscaler はノードの該当範囲を維持します。MachineAutoscaler オブジェクトは ClusterAutoscaler オブジェクトの設定後に有効になります。ClusterAutoscaler および MachineAutoscaler リソースは、どちらも ClusterAutoscalerOperator オブジェクトによって利用可能にされます。
Cluster Autoscaler
このリソースはアップストリームの Cluster Autoscalerプロジェクトに基づいています。OpenShift Container Platform の実装では、これはマシンセット API を拡張することによってクラスター API に統合されます。コア、ノード、メモリー、および GPU などのリソースのクラスター全体でのスケーリング制限を設定できます。優先順位を設定することにより、重要度の低い Pod のために新規ノードがオンラインにならないようにクラスターで Pod の優先順位付けを実行できます。また、スケーリングポリシーを設定してノードをスケールダウンせずにスケールアップできるようにすることもできます。
マシンのヘルスチェック
MachineHealthCheck リソースはマシンの正常でない状態を検知し、マシンを削除し、サポートされているプラットフォームでは新規マシンを作成します。

OpenShift Container Platform バージョン 3.11 では、クラスターでマシンのプロビジョニングが管理されないためにマルチゾーンアーキテクチャーを容易に展開することができませんでした。しかし、OpenShift Container Platform バージョン 4.1 以降、このプロセスはより簡単になりました。それぞれのマシンセットのスコープが単一ゾーンに設定されるため、インストールプログラムはユーザーに代わって、アベイラビリティーゾーン全体にマシンセットを送信します。さらに、コンピューティングは動的に展開されるため、ゾーンに障害が発生した場合の、マシンのリバランスが必要な場合に使用するゾーンを常に確保できます。Autoscaler はクラスターの有効期間中にベストエフォートでバランシングを提供します。

4.1.2. AWS の Windows MachineSet オブジェクトのサンプル YAML

このサンプル YAML は、Windows Machine Config Operator (WMCO) が応答する Amazon Web Services (AWS) で実行される Windows MachineSet オブジェクトを定義します。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
  name: <infrastructure_id>-windows-worker-<zone> 2
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <infrastructure_id> 3
      machine.openshift.io/cluster-api-machineset: <infrastructure_id>-windows-worker-<zone> 4
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 5
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker
        machine.openshift.io/cluster-api-machineset: <infrastructure_id>-windows-worker-<zone> 6
        machine.openshift.io/os-id: Windows 7
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/worker: "" 8
      providerSpec:
        value:
          ami:
            id: <windows_container_ami> 9
          apiVersion: awsproviderconfig.openshift.io/v1beta1
          blockDevices:
            - ebs:
                iops: 0
                volumeSize: 120
                volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: <infrastructure_id>-worker-profile 10
          instanceType: m5a.large
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: <zone> 11
            region: <region> 12
          securityGroups:
            - filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-worker-sg 13
          subnet:
            filters:
              - name: tag:Name
                values:
                  - <infrastructure_id>-private-<zone> 14
          tags:
            - name: kubernetes.io/cluster/<infrastructure_id> 15
              value: owned
          userDataSecret:
            name: windows-user-data 16
            namespace: openshift-machine-api
1 3 5 10 13 14 15
クラスターのプロビジョニング時に設定したクラスター ID を基にするインフラストラクチャー ID を指定します。以下のコマンドを実行してインフラストラクチャー ID を取得できます。
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 4 6
インフラストラクチャー ID、ワーカーラベル、およびゾーンを指定します。
7
Windows マシンとしてマシンセットを設定します。
8
Windows ノードをコンピュートマシンとして設定します。
9
コンテナーランタイムがインストールされている Windows イメージの AMI ID を指定します。バージョン 10.0.17763.1457 以前で Windows Server 2019 を使用する必要があります。
11
us-east-1a などの AWS ゾーンを指定します。
12
us-east-1 などの AWS リージョンを指定します。
16
最初の Windows マシンの設定時に WMCO によって作成されます。その後、後続のすべてのマシンセットで windows-user-data を消費できるようになります。

4.1.3. マシンセットの作成

インストールプログラムによって作成されるものに加え、独自のマシンセットを作成して、選択する特定のワークロードに対するマシンのコンピュートリソースを動的に管理することができます。

前提条件

  • OpenShift Container Platform クラスターをデプロイすること。
  • OpenShift CLI (oc) をインストールすること。
  • cluster-admin パーミッションを持つユーザーとして、oc にログインすること。

Procedure

  1. 説明されているようにマシンセット カスタムリソース (CR) サンプルを含む新規 YAML ファイルを作成し、そのファイルに <file_name>.yaml という名前を付けます。

    <clusterID> および <role> パラメーターの値を設定していることを確認します。

    1. 特定のフィールドに設定する値が不明な場合は、クラスターから既存のマシンセットを確認できます。

      $ oc get machinesets -n openshift-machine-api

      出力例

      NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
      agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1c   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1d   0         0                             55m
      agl030519-vplxk-worker-us-east-1e   0         0                             55m
      agl030519-vplxk-worker-us-east-1f   0         0                             55m

    2. 特定のマシンセットの値を確認します。

      $ oc get machineset <machineset_name> -n \
           openshift-machine-api -o yaml

      出力例

      ...
      template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: agl030519-vplxk 1
              machine.openshift.io/cluster-api-machine-role: worker 2
              machine.openshift.io/cluster-api-machine-type: worker
              machine.openshift.io/cluster-api-machineset: agl030519-vplxk-worker-us-east-1a

      1
      クラスター ID。
      2
      デフォルトのノードラベル。
  2. 新規 MachineSet CR を作成します。

    $ oc create -f <file_name>.yaml
  3. マシンセットの一覧を表示します。

    $ oc get machineset -n openshift-machine-api

    出力例

    NAME                                      DESIRED   CURRENT   READY   AVAILABLE   AGE
    agl030519-vplxk-windows-worker-us-east-1a    1         1         1       1        11m
    agl030519-vplxk-worker-us-east-1a            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1b            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1c            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1d            0         0                          55m
    agl030519-vplxk-worker-us-east-1e            0         0                          55m
    agl030519-vplxk-worker-us-east-1f            0         0                          55m

    新規のマシンセットが利用可能な場合、 DESIRED および CURRENT の値は一致します。マシンセットが利用可能でない場合、数分待機してからコマンドを再度実行します。

4.1.4. 関連情報

  • マシンセットの管理に関する詳細は、「マシン管理」セクションを参照してください。

4.2. Azure での Windows MachineSet オブジェクトの作成

Microsoft Azure 上の OpenShift Container Platform クラスターで特定の機能を果たすように Windows MachineSet オブジェクトを作成できます。たとえば、インフラストラクチャー Windows マシンセットおよび関連マシンを作成して、サポートする Windows ワークロードを新規の Windows マシンに移動できます。

前提条件

  • Operator Lifecycle Manager (OLM) を使用して Windows Machine Config Operator (WMCO) をインストールしている。
  • Docker フォーマットのコンテナーランタイムアドオンアドオンが有効な状態で、サポートされている Windows Server をオペレーティングシステムのイメージとして使用している。
重要

現時点で、Docker 形式のコンテナーランタイムは Windows ノードで使用されます。Kubernetes では、コンテナーランタイムとしての Docker を非推奨としています。詳細は、Kubernetes ドキュメントの Docker の非推奨について参照してください。Containerd は、今後の Kubernetes リリースで Windows ノードについてサポートされる新しいコンテナーランタイムになります。

4.2.1. マシン API の概要

マシン API は、アップストリームのクラスター API プロジェクトおよびカスタム OpenShift Container Platform リソースに基づく重要なリソースの組み合わせです。

OpenShift Container Platform 4.6 クラスターの場合、マシン API はクラスターインストールの終了後にすべてのノードホストのプロビジョニングの管理アクションを実行します。このシステムにより、OpenShift Container Platform 4.6 はパブリックまたはプライベートのクラウドインフラストラクチャーに加えて弾力性があり、動的なプロビジョニング方法を提供します。

以下の 2 つのリソースは重要なリソースになります。

マシン
ノードのホストを記述する基本的なユニットです。マシンには、複数の異なるクラウドプラットフォーム用に提供されるコンピュートノードのタイプを記述する providerSpec 仕様があります。たとえば、Amazon Web Services (AWS) 上のワーカーノードのマシンタイプは特定のマシンタイプおよび必要なメタデータを定義する場合があります。
マシンセット
MachineSet リソースはマシンのグループです。マシンセットとマシンの関係は、レプリカセットと Pod の関係と同様です。マシンを追加する必要がある場合や、マシンの数を縮小したりする必要がある場合、コンピューティングのニーズに応じてマシンセットの replicas フィールドを変更します。

以下のカスタムリソースは、クラスターに機能を追加します。

Machine Autoscaler
MachineAutoscaler リソースはマシンをクラウドで自動的にスケーリングします。ノードに対する最小および最大のスケーリングの境界を、指定されるマシンセットに設定でき、Machine Autoscaler はノードの該当範囲を維持します。MachineAutoscaler オブジェクトは ClusterAutoscaler オブジェクトの設定後に有効になります。ClusterAutoscaler および MachineAutoscaler リソースは、どちらも ClusterAutoscalerOperator オブジェクトによって利用可能にされます。
Cluster Autoscaler
このリソースはアップストリームの Cluster Autoscalerプロジェクトに基づいています。OpenShift Container Platform の実装では、これはマシンセット API を拡張することによってクラスター API に統合されます。コア、ノード、メモリー、および GPU などのリソースのクラスター全体でのスケーリング制限を設定できます。優先順位を設定することにより、重要度の低い Pod のために新規ノードがオンラインにならないようにクラスターで Pod の優先順位付けを実行できます。また、スケーリングポリシーを設定してノードをスケールダウンせずにスケールアップできるようにすることもできます。
マシンのヘルスチェック
MachineHealthCheck リソースはマシンの正常でない状態を検知し、マシンを削除し、サポートされているプラットフォームでは新規マシンを作成します。

OpenShift Container Platform バージョン 3.11 では、クラスターでマシンのプロビジョニングが管理されないためにマルチゾーンアーキテクチャーを容易に展開することができませんでした。しかし、OpenShift Container Platform バージョン 4.1 以降、このプロセスはより簡単になりました。それぞれのマシンセットのスコープが単一ゾーンに設定されるため、インストールプログラムはユーザーに代わって、アベイラビリティーゾーン全体にマシンセットを送信します。さらに、コンピューティングは動的に展開されるため、ゾーンに障害が発生した場合の、マシンのリバランスが必要な場合に使用するゾーンを常に確保できます。Autoscaler はクラスターの有効期間中にベストエフォートでバランシングを提供します。

4.2.2. Azure の Windows MachineSet オブジェクトのサンプル YAML

このサンプル YAML は、Windows Machine Config Operator (WMCO) が応答する Microsoft Azure で実行される Windows MachineSet オブジェクトを定義します。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
  name: <windows_machine_set_name> 2
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <infrastructure_id> 3
      machine.openshift.io/cluster-api-machineset: <windows_machine_set_name> 4
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 5
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker
        machine.openshift.io/cluster-api-machineset: <windows_machine_set_name> 6
        machine.openshift.io/os-id: Windows 7
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/worker: "" 8
      providerSpec:
        value:
          apiVersion: azureproviderconfig.openshift.io/v1beta1
          credentialsSecret:
            name: azure-cloud-credentials
            namespace: openshift-machine-api
          image: 9
            offer: WindowsServer
            publisher: MicrosoftWindowsServer
            resourceID: ""
            sku: 2019-Datacenter-with-Containers
            version: latest
          kind: AzureMachineProviderSpec
          location: <location> 10
          managedIdentity: <infrastructure_id>-identity 11
          networkResourceGroup: <infrastructure_id>-rg 12
          osDisk:
            diskSizeGB: 128
            managedDisk:
              storageAccountType: Premium_LRS
            osType: Windows
          publicIP: false
          resourceGroup: <infrastructure_id>-rg 13
          subnet: <infrastructure_id>-worker-subnet
          userDataSecret:
            name: windows-user-data 14
            namespace: openshift-machine-api
          vmSize: Standard_D2s_v3
          vnet: <infrastructure_id>-vnet 15
          zone: "<zone>" 16
1 3 5 11 12 13 15
クラスターのプロビジョニング時に設定したクラスター ID を基にするインフラストラクチャー ID を指定します。以下のコマンドを実行してインフラストラクチャー ID を取得できます。
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
2 4 6
Windows マシンセット名を指定します。Azure の Windows マシン名は 15 文字を超えることができません。そのため、マシン名の生成方法により、マシンセット名は 9 文字を超えることができません。
7
Windows マシンとしてマシンセットを設定します。
8
Windows ノードをコンピュートマシンとして設定します。
9
バージョン 17763.1457.2009030514 以前で 2019-Datacenter-with-Containers SKU を定義する WindowsServer イメージのオファリングを指定します。
10
centralus などの Azure リージョンを指定します。
14
最初の Windows マシンの設定時に WMCO によって作成されます。その後、後続のすべてのマシンセットで windows-user-data を消費できるようになります。
16
マシンを配置するリージョン内のゾーンを指定します。リージョンがゾーンをサポートすることを確認してください。

4.2.3. マシンセットの作成

インストールプログラムによって作成されるものに加え、独自のマシンセットを作成して、選択する特定のワークロードに対するマシンのコンピュートリソースを動的に管理することができます。

前提条件

  • OpenShift Container Platform クラスターをデプロイすること。
  • OpenShift CLI (oc) をインストールすること。
  • cluster-admin パーミッションを持つユーザーとして、oc にログインすること。

Procedure

  1. 説明されているようにマシンセット カスタムリソース (CR) サンプルを含む新規 YAML ファイルを作成し、そのファイルに <file_name>.yaml という名前を付けます。

    <clusterID> および <role> パラメーターの値を設定していることを確認します。

    1. 特定のフィールドに設定する値が不明な場合は、クラスターから既存のマシンセットを確認できます。

      $ oc get machinesets -n openshift-machine-api

      出力例

      NAME                                DESIRED   CURRENT   READY   AVAILABLE   AGE
      agl030519-vplxk-worker-us-east-1a   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1b   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1c   1         1         1       1           55m
      agl030519-vplxk-worker-us-east-1d   0         0                             55m
      agl030519-vplxk-worker-us-east-1e   0         0                             55m
      agl030519-vplxk-worker-us-east-1f   0         0                             55m

    2. 特定のマシンセットの値を確認します。

      $ oc get machineset <machineset_name> -n \
           openshift-machine-api -o yaml

      出力例

      ...
      template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: agl030519-vplxk 1
              machine.openshift.io/cluster-api-machine-role: worker 2
              machine.openshift.io/cluster-api-machine-type: worker
              machine.openshift.io/cluster-api-machineset: agl030519-vplxk-worker-us-east-1a

      1
      クラスター ID。
      2
      デフォルトのノードラベル。
  2. 新規 MachineSet CR を作成します。

    $ oc create -f <file_name>.yaml
  3. マシンセットの一覧を表示します。

    $ oc get machineset -n openshift-machine-api

    出力例

    NAME                                      DESIRED   CURRENT   READY   AVAILABLE   AGE
    agl030519-vplxk-windows-worker-us-east-1a    1         1         1       1        11m
    agl030519-vplxk-worker-us-east-1a            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1b            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1c            1         1         1       1        55m
    agl030519-vplxk-worker-us-east-1d            0         0                          55m
    agl030519-vplxk-worker-us-east-1e            0         0                          55m
    agl030519-vplxk-worker-us-east-1f            0         0                          55m

    新規のマシンセットが利用可能な場合、 DESIRED および CURRENT の値は一致します。マシンセットが利用可能でない場合、数分待機してからコマンドを再度実行します。

4.2.4. 関連情報

  • マシンセットの管理に関する詳細は、「マシン管理」セクションを参照してください。

第5章 Windows コンテナーワークロードのスケジューリング

Windows ワークロードを Windows コンピュートノードにスケジュールすることができます。

前提条件

  • Operator Lifecycle Manager (OLM) を使用して Windows Machine Config Operator (WMCO) をインストールしている。
  • Docker 形式のコンテナーランタイムびアドオンが有効な状態で Windows コンテナーを OS イメージとして使用している。
  • Windows マシンセットを作成している。
重要

現時点で、Docker 形式のコンテナーランタイムは Windows ノードで使用されます。Kubernetes では、コンテナーランタイムとしての Docker を非推奨としています。詳細は、Kubernetes ドキュメントの Docker の非推奨について参照してください。Containerd は、今後の Kubernetes リリースで Windows ノードについてサポートされる新しいコンテナーランタイムになります。

5.1. Windows Pod の配置

Windows ワークロードをクラスターにデプロイする前に、Pod が適切に割り当てられるように Windows ノードのスケジューリングを設定する必要があります。Windows ノードをホストするマシンがあるので、これは Linux ベースのノードと同じように管理できます。同様に、テイント、容認およびノードセレクターなどのメカニズムを使用して、Windows Pod の適切な Windows ノードへのスケジュールも同様に実行されます。

複数のオペレーティングシステム、および同じクラスターで複数の Windows OS バリアントを実行する機能で、RuntimeClass を使用して Windows Pod をベース Windows OS バリアントにマップする必要があります。たとえば、複数の Windows ノードが複数の Windows Server コンテナーのバージョンで実行されている場合、クラスターは Windows Pod を互換性のない Windows OS バリアントにスケジュールする可能性があります。クラスター上の Windows OS バリアントごとに RuntimeClass オブジェクトを設定する必要があります。クラスターで 1 つの Windows OS バリアントのみが利用可能である場合、RuntimeClass オブジェクトを使用することも推奨されます。

詳細は、ホストとコンテナーのバージョンの互換性について参照してください

追加リソース

5.2. スケジューリングメカニズムをカプセル化するための RuntimeClass オブジェクトの作成

RuntimeClass オブジェクトを使用することにより、テイントおよび容認などのスケジュールの仕組みの使用を単純化できます。テイントおよび容認をカプセル化するランタイムクラスをデプロイしてから、これを Pod に適用して Pod を適切なノードにスケジュールできるようにします。ランタイムクラスの作成は、複数のオペレーティングシステムのバリアントをサポートするクラスターでも必要になります。

手順

  1. RuntimeClass オブジェクト YAML ファイルを作成します。例: runtime-class.yaml

    apiVersion: node.k8s.io/v1beta1
    kind: RuntimeClass
    metadata:
      name: <runtime_class_name> 1
    handler: 'docker'
    scheduling:
      nodeSelector: 2
        kubernetes.io/os: 'windows'
        kubernetes.io/arch: 'amd64'
        node.kubernetes.io/windows-build: '10.0.17763'
      tolerations: 3
      - effect: NoSchedule
        key: os
        operator: Equal
        value: "Windows"
    1
    このランタイムクラスで管理する必要のある Pod で定義される RuntimeClass オブジェクト名を指定します。
    2
    このランタイムクラスをサポートするノードに存在する必要があるラベルを指定します。このランタイムクラスを使用する Pod は、このセレクターに一致するノードにのみスケジュールできます。ランタイムクラスのノードセレクターは Pod の既存のノードセレクターとマージされます。競合が発生した場合は、Pod をノードにスケジュールできなくなります。
    3
    Pod に追加する容認を指定します。ただし、受付時にこのランタイムクラスで実行される重複を除きます。これによって、Pod によって許容されるノードのセットとランタイムクラスが組み合わされます。
  2. RuntimeClass オブジェクトを作成します。

    $ oc create -f <file-name>.yaml

    以下は例になります。

    $ oc create -f runtime-class.yaml
  3. RuntimeClass オブジェクトを Pod に適用し、これが適切なオペレーティングシステムバリアントにスケジュールされていることを確認します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-windows-pod
    spec:
      runtimeClassName: <runtime_class_name> 1
    ...
    1
    Pod のスケジュールを管理するためにランタイムクラスを指定します。

5.3. Windows コンテナーワークロードのデプロイメント例

Windows コンピュートノードが利用可能になる時点で、Windows コンテナーワークロードをクラスターにデプロイできます。

注記

このサンプルデプロイメントは参照用にのみ提供されます。

Service オブジェクトの例

apiVersion: v1
kind: Service
metadata:
  name: win-webserver
  labels:
    app: win-webserver
spec:
  ports:
    # the port that this service should serve on
  - port: 80
    targetPort: 80
  selector:
    app: win-webserver
  type: LoadBalancer

Deployment オブジェクトの例

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: win-webserver
  name: win-webserver
spec:
  selector:
    matchLabels:
      app: win-webserver
  replicas: 1
  template:
    metadata:
      labels:
        app: win-webserver
      name: win-webserver
    spec:
      tolerations:
      - key: "os"
        value: "Windows"
        Effect: "NoSchedule"
      containers:
      - name: windowswebserver
        image: mcr.microsoft.com/windows/servercore:ltsc2019
        imagePullPolicy: IfNotPresent
        command:
        - powershell.exe
        - -command
        - $listener = New-Object System.Net.HttpListener; $listener.Prefixes.Add('http://*:80/'); $listener.Start();Write-Host('Listening at http://*:80/'); while ($listener.IsListening) { $context = $listener.GetContext(); $response = $context.Response; $content='<html><body><H1>Red Hat OpenShift + Windows Container Workloads</H1></body></html>'; $buffer = [System.Text.Encoding]::UTF8.GetBytes($content); $response.ContentLength64 = $buffer.Length; $response.OutputStream.Write($buffer, 0, $buffer.Length); $response.Close(); };
        securityContext:
          windowsOptions:
            runAsUserName: "ContainerAdministrator"
      nodeSelector:
        beta.kubernetes.io/os: windows

注記

mcr.microsoft.com/powershell:<tag> コンテナーイメージを使用する場合、コマンドを pwsh.exe として定義する必要があります。mcr.microsoft.com/windows/servercore:<tag> コンテナーイメージを使用している場合、コマンドを powershell.exe として定義する必要があります。詳細は、Microsoft のドキュメントを参照してください。

5.4. マシンセットの手動によるスケーリング

マシンセットのマシンのインスタンスを追加したり、削除したりする必要がある場合、マシンセットを手動でスケーリングできます。

本書のガイダンスは、完全に自動化されたインストーラーでプロビジョニングされるインフラストラクチャーのインストールに関連します。ユーザーによってプロビジョニングされるインフラストラクチャーのカスタマイズされたインストールにはマシンセットがありません。

前提条件

  • OpenShift Container Platform クラスターおよび oc コマンドラインをインストールすること。
  • cluster-admin パーミッションを持つユーザーとして、oc にログインすること。

手順

  1. クラスターにあるマシンセットを表示します。

    $ oc get machinesets -n openshift-machine-api

    マシンセットは <clusterid>-worker-<aws-region-az> の形式で一覧表示されます。

  2. マシンセットをスケーリングします。

    $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

    または、以下を実行します。

    $ oc edit machineset <machineset> -n openshift-machine-api

    マシンセットをスケールアップまたはスケールダウンできます。新規マシンが利用可能になるまで数分の時間がかかります。

第6章 Windows ノードのアップグレード

Windows Machine Config Operator (WMCO) をアップグレードすることで、Windows ノードに最新の更新が含まれることを確認できます。

6.1. Windows Machine Config Operator のアップグレード

現在のクラスターバージョンと互換性のある Windows Machine Config Operator (WMCO) の新規バージョンがリリースされると、Operator はアップグレードチャネル、および Operator Lifecycle Manager (OLM) を使用する際にインストールに使用されたサブスクリプションの承認ストラテジーに基づいてアップグレードされます。WMCO のアップグレードにより、Windows マシンの Kubernetes コンポーネントがアップグレードされます。

中断なしのアップグレードの場合、WMCO は以前のバージョンの WMCO で設定された Windows マシンを中止し、現行バージョンを使用してそれらを再作成します。これは、Machine オブジェクトを削除して実行されます。これにより、Windows ノードのドレイン(解放)および削除が実行されます。アップグレードを容易にするために、WMCO は設定されたすべてのノードにバージョンのアノテーションを追加します。アップグレード時に、バージョンのアノテーションで不一致があると、Windows マシンが削除され、再作成されます。アップグレード時のサービスの中断を最小限にするために、WMCO は一度に 1 つの Windows マシンのみを更新します。

重要

WMCO は Kubernetes コンポーネントの更新のみを行い、Windows オペレーティングシステムの更新は行いません。仮想マシンの作成時に Windows イメージを指定できるため、更新されたイメージを指定できます。MachineSet 仕様でイメージ設定を変更して、更新された Windows イメージを指定できます。

Operator Lifecycle Manager(OLM)を使用した Operator のアップグレードについての詳細は、「インストールされた Operator のアップグレード 」を参照してください。

第7章 Windows ノードの削除

ホスト Windows マシンを削除して、Windows ノードを削除できます。

7.1. 特定マシンの削除

特定のマシンを削除できます。

前提条件

  • OpenShift Container Platform クラスターをインストールします。
  • OpenShift CLI (oc) をインストールします。
  • cluster-admin パーミッションを持つユーザーとして、oc にログインします。

手順

  1. クラスターにあるマシンを表示し、削除するマシンを特定します。

    $ oc get machine -n openshift-machine-api

    コマンド出力には、<clusterid>-worker-<cloud_region> 形式のマシンの一覧が含まれます。

  2. マシンを削除します。

    $ oc delete machine <machine> -n openshift-machine-api
    重要

    デフォルトでは、マシンコントローラーは、成功するまでマシンによってサポートされるノードをドレイン (解放) しようとします。Pod の Disruption Budget(停止状態の予算)が正しく設定されていない場合などには、ドレイン (解放) の操作を実行してもマシンの削除を防ぐことができない場合があります。特定のマシンの "machine.openshift.io/exclude-node-draining" にアノテーションを付けると、ノードのドレイン(解放)を省略できます。削除中のマシンがマシンセットに属する場合、指定されたレプリカ数に対応するために新規マシンが即時に作成されます。

第8章 Windows コンテナーワークロードの無効化

Windows コンテナーワークロードを実行する機能を無効にするには、Windows Machine Config Operator (WMCO) をアンインストールし、WMCO のインストール時にデフォルトで追加された namespace を削除します。

8.1. Windows Machine Config Operator のアンインストール

クラスターから Windows Machine Config Operator (WMCO) をアンインストールできます。

前提条件

  • Windows ワークロードをホストする Windows Machine オブジェクトを削除します。

手順

  1. Operators → OperatorHub ページから、Filter by keyword ボックスを使用して、Red Hat Windows Machine Config Operator を検索します。
  2. Red Hat Windows Machine Config Operator タイルをクリックします。Operator タイルはこれがインストールされていることを示します。
  3. Windows Machine Config Operator 記述子ページで、Uninstall をクリックします。

8.2. Windows Machine Config Operator namespace の削除

デフォルトで Windows Machine Config Operator (WMCO) 用に生成された namespace を削除できます。

前提条件

  • WMCO がクラスターから削除されます。

手順

  1. openshift-windows-machine-config-operator namespace で作成されたすべての Windows ワークロードを削除します。

    $ oc delete --all pods --namespace=openshift-windows-machine-config-operator
  2. openshift-windows-machine-config-operator namespace のすべての Pod が削除されているか、または終了状態を報告していることを確認します。

    $ oc get pods --namespace openshift-windows-machine-config-operator
  3. openshift-windows-machine-config-operator namespace を削除します。

    $ oc delete namespace openshift-windows-machine-config-operator

追加リソース