第4章 Hosted Control Plane のデプロイ


4.1. AWS への Hosted Control Plane のデプロイ

インフラストラクチャーのコストを削減し、クラスター管理の効率を向上させるために、AWS 上に Hosted Control Plane をデプロイできます。この設定では、制御プレーンとデータプレーンが分離されるため、中央管理サービスから複数のクラスターを管理できます。

ホステッドクラスター は、API エンドポイントとコントロールプレーンが管理クラスターでホストされている OpenShift Container Platform クラスターです。ホステッドクラスターには、コントロールプレーンとそれに対応するデータプレーンが含まれます。オンプレミスで Hosted Control Plane を設定するには、管理クラスターに multicluster engine for Kubernetes Operator をインストールする必要があります。hypershift-addon マネージドクラスターアドオンを使用して既存のマネージドクラスターに HyperShift Operator をデプロイすると、そのクラスターを管理クラスターとして有効にして、ホステッドクラスターの作成を開始できます。hypershift-addon マネージドクラスターアドオンは、local-cluster マネージドクラスターでデフォルトで有効になっています。

ホステッドクラスターは、multicluster engine Operator のコンソールか、Hosted Control Plane のコマンドラインインターフェイス (CLI) である hcp を使用して作成できます。ホステッドクラスターは、マネージドクラスターとして自動的にインポートされます。ただし、この multicluster engine Operator への自動インポート機能を無効にする こともできます。

4.1.1. AWS への Hosted Control Plane のデプロイの準備

Amazon Web Services (AWS) 上で Hosted Control Plane をデプロイする準備には、いくつかの前提条件を満たし、S3 バケット、OIDC シークレット、ルーティング可能なパブリックゾーン、IAM ロール、STS 認証情報などのリソースを作成する必要があります。

4.1.1.1. AWS 上で Hosted Control Plane をデプロイするための前提条件

Amazon Web Services (AWS) 上でホストされているコントロールプレーンのデプロイメントを正常に実行するには、環境が以下の要件を満たしている必要があります。

  • OpenShift Container Platform クラスターに、multicluster engine for Kubernetes Operator をインストールしました。multicluster engine Operator は、Red Hat Advanced Cluster Management (RHACM) をインストールすると、自動的にインストールされます。multicluster engine Operator は、OpenShift Container Platform ソフトウェアカタログから Operator として RHACM なしでインストールすることもできます。
  • multicluster engine Operator のマネージド OpenShift Container Platform クラスターが少なくとも 1 つある。multicluster engine Operator バージョン 2.5 以降では、local-cluster が自動的にインポートされます。次のコマンドを実行して、ハブクラスターの状態を確認できます。

    $ oc get managedclusters local-cluster
  • aws コマンドラインインターフェイス (CLI) をインストールしました。
  • Hosted Control Plane CLI、hcp をインストールしました。
重要
  • 管理クラスターとコンピュートノードを同一プラットフォーム上で実行します。
  • 各ホステッドクラスターに対して、クラスター全体で一意な名前を指定してください。multicluster engine Operator によってホステッドクラスターを管理するには、ホステッドクラスター名を既存のマネージドクラスターと同じにすることはできません。
  • ホステッドクラスター名として clusters を使用しないでください。
  • multicluster engine Operator 管理クラスターの名前空間にホステッドクラスターを作成しないでください。

4.1.1.2. Amazon Web Services S3 バケットと S3 OIDC シークレットの作成

Amazon Web Services (AWS) 上でホステッドクラスターを作成および管理するには、まず S3 バケットと S3 OIDC シークレットを作成する必要があります。これらのリソースは、クラスターが自身に関する情報を保存する場所と、クラスターが AWS に対して自身のアイデンティティーを証明する手段を提供する。

手順

  1. クラスターの OIDC 検出ドキュメントをホストするためのパブリックアクセスを持つ S3 バケットを作成します。

    1. 以下のコマンドを入力します。

      $ aws s3api create-bucket --bucket <bucket_name> \
        --create-bucket-configuration LocationConstraint=<region> \
        --region <region> 
      1

      ここでは、以下のようになります。

      <bucket_name>
      作成する S3 バケットの名前を指定します。
      < 領域 >
      バケットを us-east-1 リージョン以外のリージョンに作成することを指定します。この行を追加し、<region> を使用したいリージョンに置き換えてください。us-east-1 リージョンにバケットを作成するには、この行を省略します。
    2. 以下のコマンドを入力します。

      $ aws s3api delete-public-access-block --bucket <bucket_name>

      <bucket_name> は、作成する S3 バケットの名前に置き換えます。

    3. 以下のコマンドを入力します。

      $ echo '{
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::<bucket_name>/*"
              }
          ]
      }' | envsubst > policy.json

      <bucket_name> は、作成する S3 バケットの名前に置き換えます。

    4. 以下のコマンドを入力します。

      $ aws s3api put-bucket-policy --bucket <bucket_name> \
        --policy file://policy.json

      <bucket_name> は、作成する S3 バケットの名前に置き換えます。

      注記

      Mac コンピューターを使用している場合は、ポリシーを機能させるためにバケット名をエクスポートする必要があります。

  2. HyperShift Operator 用に hypershift-operator-oidc-provider-s3-credentials という名前の OIDC S3 シークレットを作成します。
  3. シークレットを local-cluster namespace に保存します。
  4. 次の表を参照して、シークレットに次のフィールドが含まれていることを確認します。

    Expand
    表4.1 AWS シークレットの必須フィールド
    フィールド名説明

    bucket

    ホステッドクラスターの OIDC 検出ドキュメントをホストするためのパブリックアクセスを備えた S3 バケットが含まれています。

    credentials

    バケットにアクセスできる default プロファイルの認証情報を含むファイルへの参照。デフォルトでは、HyperShift は default プロファイルのみを使用して bucket を操作します。

    region

    S3 バケットのリージョンを指定します。

  5. AWS シークレットを作成するには、次のコマンドを実行します。

    $ oc create secret generic <secret_name> \
      --from-file=credentials=<path>/.aws/credentials \
      --from-literal=bucket=<s3_bucket> \
      --from-literal=region=<region> \
      -n local-cluster
    注記

    シークレットの障害復旧バックアップは自動的に有効になりません。障害復旧用に hypershift-operator-oidc-provider-s3-credentials シークレットのバックアップを有効にするラベルを追加するには、次のコマンドを実行します。

    $ oc label secret hypershift-operator-oidc-provider-s3-credentials \
      -n local-cluster cluster.open-cluster-management.io/backup=true

4.1.1.3. ホステッドクラスター用のルーティング可能なパブリックゾーンの作成

ホステッドクラスター内のアプリケーションにアクセスするには、ルーティング可能なパブリックゾーンを設定する必要があります。

パブリックゾーンが存在する場合は、この手順を省略します。省略しないと、パブリックゾーンによって既存の機能に影響が生じます。

手順

  • DNS レコードのルーティング可能なパブリックゾーンを作成するには、次のコマンドを入力します。

    $ aws route53 create-hosted-zone \
      --name <basedomain> \
      --caller-reference $(whoami)-$(date --rfc-3339=date)

    <basedomain> は、ベースドメイン (例: www.example.com) に置き換えます。

4.1.1.4. AWS IAM ロールと STS 認証情報の作成

Amazon Web Services (AWS) 上にホステッドクラスターを作成する前に、AWS IAM ロールと STS 認証情報を作成する必要があります。

手順

  1. 次のコマンドを実行して、ユーザーの Amazon Resource Name (ARN) を取得します。

    $ aws sts get-caller-identity --query "Arn" --output text

    出力例

    arn:aws:iam::1234567890:user/<aws_username>

    次のステップで、この出力を <arn> の値として使用してください。

  2. ロールの信頼関係設定を含む JSON ファイルを作成します。以下の例を参照してください。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "<arn>"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

    <arn> は、前のステップでメモしたユーザーの ARN に置き換えます。

  3. 次のコマンドを実行して、Identity and Access Management (IAM) ロールを作成します。

    $ aws iam create-role \
      --role-name <name> \
      --assume-role-policy-document file://<file_name>.json \
      --query "Role.Arn"

    ここでは、以下のようになります。

    <name>
    ロール名を指定します。たとえば、hcp-cli-role など です。
    <file_name>
    前の手順で作成した JSON ファイルの名前を指定します。

    出力例

    arn:aws:iam::820196288204:role/myrole

  4. ロールの次の権限ポリシーを含む policy.json という名前の JSON ファイルを作成します。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "EC2",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateDhcpOptions",
                    "ec2:DeleteSubnet",
                    "ec2:ReplaceRouteTableAssociation",
                    "ec2:DescribeAddresses",
                    "ec2:DescribeInstances",
                    "ec2:DeleteVpcEndpoints",
                    "ec2:CreateNatGateway",
                    "ec2:CreateVpc",
                    "ec2:DescribeDhcpOptions",
                    "ec2:AttachInternetGateway",
                    "ec2:DeleteVpcEndpointServiceConfigurations",
                    "ec2:DeleteRouteTable",
                    "ec2:AssociateRouteTable",
                    "ec2:DescribeInternetGateways",
                    "ec2:DescribeAvailabilityZones",
                    "ec2:CreateRoute",
                    "ec2:CreateInternetGateway",
                    "ec2:RevokeSecurityGroupEgress",
                    "ec2:ModifyVpcAttribute",
                    "ec2:DeleteInternetGateway",
                    "ec2:DescribeVpcEndpointConnections",
                    "ec2:RejectVpcEndpointConnections",
                    "ec2:DescribeRouteTables",
                    "ec2:ReleaseAddress",
                    "ec2:AssociateDhcpOptions",
                    "ec2:TerminateInstances",
                    "ec2:CreateTags",
                    "ec2:DeleteRoute",
                    "ec2:CreateRouteTable",
                    "ec2:DetachInternetGateway",
                    "ec2:DescribeVpcEndpointServiceConfigurations",
                    "ec2:DescribeNatGateways",
                    "ec2:DisassociateRouteTable",
                    "ec2:AllocateAddress",
                    "ec2:DescribeSecurityGroups",
                    "ec2:RevokeSecurityGroupIngress",
                    "ec2:CreateVpcEndpoint",
                    "ec2:DescribeVpcs",
                    "ec2:DeleteSecurityGroup",
                    "ec2:DeleteDhcpOptions",
                    "ec2:DeleteNatGateway",
                    "ec2:DescribeVpcEndpoints",
                    "ec2:DeleteVpc",
                    "ec2:CreateSubnet",
                    "ec2:DescribeSubnets"
                ],
                "Resource": "*"
            },
            {
                "Sid": "ELB",
                "Effect": "Allow",
                "Action": [
                    "elasticloadbalancing:DeleteLoadBalancer",
                    "elasticloadbalancing:DescribeLoadBalancers",
                    "elasticloadbalancing:DescribeTargetGroups",
                    "elasticloadbalancing:DeleteTargetGroup"
                ],
                "Resource": "*"
            },
            {
                "Sid": "IAMPassRole",
                "Effect": "Allow",
                "Action": "iam:PassRole",
                "Resource": "arn:*:iam::*:role/*-worker-role",
                "Condition": {
                    "ForAnyValue:StringEqualsIfExists": {
                        "iam:PassedToService": "ec2.amazonaws.com"
                    }
                }
            },
            {
                "Sid": "IAM",
                "Effect": "Allow",
                "Action": [
                    "iam:CreateInstanceProfile",
                    "iam:DeleteInstanceProfile",
                    "iam:GetRole",
                    "iam:UpdateAssumeRolePolicy",
                    "iam:GetInstanceProfile",
                    "iam:TagRole",
                    "iam:RemoveRoleFromInstanceProfile",
                    "iam:CreateRole",
                    "iam:DeleteRole",
                    "iam:PutRolePolicy",
                    "iam:AddRoleToInstanceProfile",
                    "iam:CreateOpenIDConnectProvider",
                    "iam:ListOpenIDConnectProviders",
                    "iam:DeleteRolePolicy",
                    "iam:UpdateRole",
                    "iam:DeleteOpenIDConnectProvider",
                    "iam:GetRolePolicy"
                ],
                "Resource": "*"
            },
            {
                "Sid": "Route53",
                "Effect": "Allow",
                "Action": [
                    "route53:ListHostedZonesByVPC",
                    "route53:CreateHostedZone",
                    "route53:ListHostedZones",
                    "route53:ChangeResourceRecordSets",
                    "route53:ListResourceRecordSets",
                    "route53:DeleteHostedZone",
                    "route53:AssociateVPCWithHostedZone",
                    "route53:ListHostedZonesByName"
                ],
                "Resource": "*"
            },
            {
                "Sid": "S3",
                "Effect": "Allow",
                "Action": [
                    "s3:ListAllMyBuckets",
                    "s3:ListBucket",
                    "s3:DeleteObject",
                    "s3:DeleteBucket"
                ],
                "Resource": "*"
            }
        ]
    }
  5. 以下のコマンドを実行して、ロールのアクセス許可ポリシーを含む policy.json ファイルを添付してください。

    $ aws iam put-role-policy \
      --role-name <role_name> \
      --policy-name <policy_name> \
      --policy-document file://policy.json

    ここでは、以下のようになります。

    < ロール名 >
    ロールの名前を指定します。
    <policy_name>
    保険契約名を指定します。
  6. 次のコマンドを実行して、sts-creds.json という名前の JSON ファイル内の STS 認証情報を取得します。

    $ aws sts get-session-token --output json > sts-creds.json

    sts-creds.json ファイルの例

    {
        "Credentials": {
            "AccessKeyId": "<access_key_id",
            "SecretAccessKey": "<secret_access_key>”,
            "SessionToken": "<session_token>",
            "Expiration": "<time_stamp>"
        }
    }

4.1.2. AWS 上の Hosted Control Plane 用の外部 DNS を有効にする

DNS レコードの管理を自動化するには、外部 DNS を有効にすることができます。この機能を設定することで、サービスや Ingress を作成または削除したときに、クラスターが AWS Route 53 のパブリックホストゾーンを自動的に更新する方法を提供できます。

Hosted Control Plane では、コントロールプレーンとデータプレーンが分離されています。DNS は、次の 2 つの独立した領域で設定できます。

  • ホステッドクラスター (*.apps.service-consumer-domain.com などのドメイン) 内のワークロードの Ingress。
  • サービスプロバイダーのドメイン *.service-provider-domain.com を介した API または OAuth エンドポイントなど、管理クラスター内のサービスエンドポイントの Ingress。

hostedCluster.spec.dns の入力は、ホステッドクラスター内のワークロードの Ingress を管理します。hostedCluster.spec.services.servicePublishingStrategy.route.hostname の入力は、管理クラスター内のサービスエンドポイントの Ingress を決定します。

外部 DNS は、発行タイプが LoadBalancer または Route であるホステッドクラスターサービスの名前レコードを作成し、その発行タイプに対応するホスト名を提供します。Private または PublicAndPrivate エンドポイントアクセスタイプを持つホステッドクラスターの場合、APIServer サービスと OAuth サービスのみがホスト名をサポートします。Private ホステッドクラスターの場合、DNS レコードが VPC 内の Virtual Private Cloud (VPC) エンドポイントのプライベート IP アドレスに解決されます。

Hosted Control Plane は、次のサービスを公開します。

  • APIServer
  • OIDC

これらのサービスは、HostedCluster 仕様の servicePublishingStrategy フィールドを使用して公開できます。デフォルトでは、servicePublishingStrategyLoadBalancer および Route タイプの場合、次のいずれかの方法でサービスを公開できます。

  • LoadBalancer タイプの Service のステータスにあるロードバランサーのホスト名を使用する方法
  • Route リソースの status.host フィールドを使用する方法

ただし、マネージドサービスのコンテキストで Hosted Control Plane をデプロイすると、これらの方法によって、基盤となる管理クラスターの Ingress サブドメインが公開され、管理クラスターのライフサイクルと障害復旧のオプションが制限される可能性があります。

DNS 間接化が LoadBalancer および Route 公開タイプに階層化されている場合、マネージドサービスオペレーターは、サービスレベルドメインを使用してすべてのパブリックホステッドクラスターサービスを公開できます。このアーキテクチャーでは、DNS 名を新しい LoadBalancer または Route に再マッピングできますが、管理クラスターの Ingress ドメインは公開されません。Hosted Control Plane は、外部 DNS を使用して間接層を実現します。

管理クラスターの hypershift namespace に HyperShift Operator と一緒に external-dns をデプロイできます。外部 DNS は、external-dns.alpha.kubernetes.io/hostname アノテーションを持つ Services または Routes を監視します。このアノテーションは、A レコードなどの Service、または CNAME レコードなどの Route を参照する DNS レコードを作成するために使用されます。

外部 DNS はクラウド環境でのみ使用できます。その他の環境では、DNS とサービスを手動で設定する必要があります。

外部 DNS の詳細は、外部 DNS を参照してください。

4.1.2.1. Hosted Control Plane の外部 DNS の設定

DNS レコードの管理を自動化するには、AWS 上で Hosted Control Plane 用の外部 DNS を設定できます。この設定を行うことで、サービスを作成または変更した際に、AWS Route 53 のパブリックホストゾーン内の対応する DNS レコードが自動的に更新されるようになります。

Hosted Control Plane は、外部 DNS またはサービスレベル DNS を使用してプロビジョニングできます。

前提条件

  • 外部パブリックドメインを作成した。
  • AWS Route53 管理コンソールにアクセスできる。
  • Hosted Control Plane 用に AWS PrivateLink を有効にした。

手順

  1. HyperShift Operator 用の Amazon Web Services (AWS) 認証情報シークレットを作成し、local-cluster namespace で hypershift-operator-external-dns-credentials という名前を付けます。
  2. シークレットに必要なフィールドが含まれていることを確認してください。ご参考までに、必須項目を以下の表に詳しく記載します。

    Expand
    表4.3 AWS シークレットの必須フィールド
    フィールド名説明任意または必須

    provider

    サービスレベル DNS ゾーンを管理する DNS プロバイダー。

    必須

    domain-filter

    サービスレベルドメイン。

    必須

    credentials

    すべての外部 DNS タイプをサポートする認証情報ファイル。

    AWS キーを使用する場合はオプション

    aws-access-key-id

    認証情報アクセスキー ID。

    AWS DNS サービスを使用する場合はオプション

    aws-secret-access-key

    認証情報アクセスキーのシークレット。

    AWS DNS サービスを使用する場合はオプション

  3. 以下のコマンドを実行して、AWS シークレットを作成します。

    $ oc create secret generic <secret_name> \
      --from-literal=provider=aws \
      --from-literal=domain-filter=<domain_name> \
      --from-file=credentials=<path_to_aws_credentials_file> -n local-cluster
    注記

    シークレットの障害復旧バックアップは自動的に有効になりません。障害復旧のためにシークレットをバックアップするには、次のコマンドを入力して hypershift-operator-external-dns-credentials を追加します。

    $ oc label secret hypershift-operator-external-dns-credentials \
      -n local-cluster \
      cluster.open-cluster-management.io/backup=""

4.1.2.2. パブリック DNS ホストゾーンの作成

外部 DNS ドメインフィルターとして使用するパブリック DNS ホストゾーンを作成できます。パブリック DNS ホストゾーンは、パブリックホステッドクラスターを作成するために、External DNS Operator によって使用されます。

手順

  1. AWS Route 53 管理コンソールで、[ホストゾーンの作成] を クリックします。
  2. Hosted zone configuration ページでドメイン名を入力し、タイプとして Public hosted zone が選択されていることを確認し、Create hosted zone をクリックします。
  3. ゾーンが作成されたら、Records タブの Value/Route traffic to 列の値をメモします。
  4. メインドメインで、DNS 要求を委任ゾーンにリダイレクトするための NS レコードを作成します。Value フィールドに、前の手順でメモした値を入力します。
  5. Create records をクリックします。
  6. 次の例のように、新しいサブゾーンにテストエントリーを作成し、dig コマンドでテストして、DNS ホストゾーンが機能していることを確認します。

    $ dig +short test.user-dest-public.aws.kerberos.com

    出力例

    192.168.1.1

  7. LoadBalancer および Route サービスのホスト名を設定するホステッドクラスターを作成するには、次のコマンドを入力します。

    $ hcp create cluster aws --name=<hosted_cluster_name> \
      --endpoint-access=PublicAndPrivate \
      --external-dns-domain=<public_hosted_zone> ...

    <public_hosted_zone> は、作成したパブリックホストゾーンに置き換えます。

    ホステッドクラスターの services ブロックの例

      platform:
        aws:
          endpointAccess: PublicAndPrivate
    ...
      services:
      - service: APIServer
        servicePublishingStrategy:
          route:
            hostname: api-example.service-provider-domain.com
          type: Route
      - service: OAuthServer
        servicePublishingStrategy:
          route:
            hostname: oauth-example.service-provider-domain.com
          type: Route
      - service: Konnectivity
        servicePublishingStrategy:
          type: Route
      - service: Ignition
        servicePublishingStrategy:
          type: Route

    Control Plane Operator は、ServicesRoutes リソースを作成し、external-dns.alpha.kubernetes.io/hostname のアノテーションを付けます。ServicesRoutes の場合、Control Plane Operator は、サービスエンドポイントの servicePublishingStrategy フィールドの hostname パラメーターの値を使用します。DNS レコードを作成するには、external-dns デプロイメントなどのメカニズムを使用できます。

    サービスレベルの DNS 間接化をパブリックサービスにのみ設定できます。プライベートサービスは hypershift.local プライベートゾーンを使用するため、hostname を設定できません。

    次の表は、サービスとエンドポイントの組み合わせに対して hostname を設定することが有効な場合を示しています。

    Expand
    表4.4 hostname を設定するためのサービスとエンドポイントの組み合わせ
    サービスPublicPublicAndPrivatePrivate

    APIServer

    Y

    Y

    N

    OAuthServer

    Y

    Y

    N

    Konnectivity

    Y

    N

    N

    Ignition

    Y

    N

    N

4.1.2.3. AWS 上で外部 DNS を使用してホステッドクラスターを作成する

AWS 上でホステッドクラスターを作成する場合、外部 DNS を使用すると、標準的なインストール方法よりも多くの利点があります。外部 DNS を使用すると、クラスターのサービスエンドポイントを AWS Route 53 と自動的に同期できます。

外部 DNS がない場合、新しいサービスや Ingress ごとに DNS レコードを手動で管理する必要があり、設定エラーやダウンタイムのリスクが高まります。

前提条件

  • 管理クラスターに以下のアーティファクトを設定しました。

    • パブリック DNS ホストゾーン
    • External DNS Operator
    • HyperShift Operator

手順

  1. hcp コマンドラインインターフェイス (CLI) で、以下のコマンドを入力して管理クラスターにアクセスします。

    $ export KUBECONFIG=<path_to_management_cluster_kubeconfig>
  2. 次のコマンドを入力して、External DNS Operator が実行されていることを確認します。

    $ oc get pod -n hypershift -lapp=external-dns

    出力例

    NAME                            READY   STATUS    RESTARTS   AGE
    external-dns-7c89788c69-rn8gp   1/1     Running   0          40s

  3. 外部 DNS を使用してホステッドクラスターを作成するには、次のコマンドを入力します。

    $ hcp create cluster aws \
        --role-arn <arn_role> \
        --instance-type <instance_type> \
        --region <region> \
        --auto-repair \
        --generate-ssh \
        --name <hosted_cluster_name> \
        --namespace clusters \
        --base-domain <service_consumer_domain> \
        --node-pool-replicas <node_replica_count> \
        --pull-secret <path_to_your_pull_secret> \
        --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \
        --external-dns-domain=<service_provider_domain> \
        --endpoint-access=<endpoint_access_configuration> \
        --sts-creds <path_to_sts_credential_file>

    ここでは、以下のようになります。

    <arn_role>
    Amazon Resource Name (ARN) を指定します。例: arn:aws:iam::820196288204:role/myrole
    <instance_types>
    インスタンスタイプを指定します。例: m6i.xlarge
    < 領域 >
    AWS リージョンを指定します。たとえば、us-east-1 など です。
    <hosted_cluster_name>
    ホステッドクラスター名を指定します。例: my-external-aws
    < サービスコンシューマードメイン >
    サービス利用者が所有するパブリックホストゾーンを指定します。例: service-consumer-domain.com
    <node_replica_count>
    ノードレプリカ数を指定します。たとえば、2 です
    < プルシークレットへのパス >
    プルシークレットファイルへのパスを指定します。
    <ocp_release_image>
    使用するサポートされている OpenShift Container Platform のバージョンを指定します。たとえば、4.20.0-multi などです
    < サービスプロバイダードメイン >
    サービスプロバイダーが所有するパブリックホストゾーンを指定します。たとえば、service-provider-domain.com などです。
    <endpoint_access_configuraton>
    外部 DNS のエンドポイントアクセス設定を指定します。PublicAndPrivate として設定します。外部 DNS は、Public または PublicAndPrivate 設定でのみ使用できます。
    <sts_credential_file へのパス >
    AWS STS 認証情報ファイルへのパスを指定します。例: /home/user/sts-creds/sts-creds.json

4.1.2.4. カスタム DNS 名の定義

クラスター管理者は、ノードのブートストラップとコントロールプレーンの通信に使用される内部エンドポイントとは異なる外部 API DNS 名を持つホステッドクラスターを作成できます。

別の DNS 名を定義する理由には、次のようなものがあります。

  • 内部ルート CA にバインドされている制御プレーン機能を壊さずに、ユーザー向けの TLS 証明書を公開 CA の証明書に置き換える。
  • スプリットホライズン DNS および NAT のシナリオをサポートするため
  • スタンドアロンのコントロールプレーンと同様の操作性を確保するため、正しい kubeconfig と DNS 設定を使用して Show Login Command 機能などの機能を利用できます。

HostedCluster オブジェクトの kubeAPIServerDNSName パラメーターにドメイン名を入力することで、初期セットアップ時またはインストール後の操作時に DNS 名を定義できます。

前提条件

  • kubeAPIServerDNSName パラメーターで設定する DNS 名が、有効な TLS 証明書の対象に含まれている。
  • 正しいアドレスに到達し、それを指し示す解決可能な DNS 名 URI がある。

手順

  • HostedCluster オブジェクトの仕様で、kubeAPIServerDNSName パラメーターとドメインのアドレスを追加し、使用する証明書を指定します (次の例を参照)。

    #...
    spec:
      configuration:
        apiServer:
          servingCerts:
            namedCertificates:
            - names:
              - xxx.example.com
              - yyy.example.com
              servingCertificate:
                name: <my_serving_certificate>
      kubeAPIServerDNSName: <custom_address>

    kubeAPIServerDNSName パラメーターの値は、有効でアドレス指定可能なドメインである必要があります。

    kubeAPIServerDNSName パラメーターを定義して証明書を指定すると、Control Plane Operator のコントローラーによって custom-admin-kubeconfig という名前の kubeconfig ファイルが作成されます。このファイルは HostedControlPlane namespace に保存されます。証明書はルート CA から生成され、HostedControlPlane namespace によって証明書の有効期限と更新が管理されます。

    Control Plane Operator は、HostedControlPlane namespace に CustomKubeconfig という名前の新しい kubeconfig ファイルを報告します。このファイルは、kubeAPIServerDNSName パラメーターで定義された新しいサーバーを使用します。

    カスタム kubeconfig ファイルへの参照情報は、HostedCluster オブジェクトの status パラメーター内に CustomKubeconfig という名前で存在しています。CustomKubeConfig パラメーターは任意であり、kubeAPIServerDNSName パラメーターが空でない場合にのみ追加できます。CustomKubeConfig パラメーターを設定すると、そのパラメーターによって、HostedCluster namespace で <hosted_cluster_name>-custom-admin-kubeconfig という名前のシークレットの生成がトリガーされます。このシークレットを使用して HostedCluster API サーバーにアクセスできます。インストール後の操作時に CustomKubeConfig パラメーターを削除すると、関連するすべてのシークレットとステータス参照が削除されます。

    注記

    カスタム DNS 名の定義はデータプレーンに直接影響しないため、予期されるロールアウトは発生しません。HostedControlPlane namespace は、HyperShift Operator から変更を受け取り、対応するパラメーターを削除します。

    HostedCluster オブジェクトの仕様から kubeAPIServerDNSName パラメーターを削除すると、新しく生成されたすべてのシークレットと、CustomKubeconfig 参照がクラスターと status パラメーターから削除されます。

4.1.3. AWS 上でホステッドクラスターを作成する

hcp コマンドラインインターフェイス (CLI) を使用して、Amazon Web Services (AWS) 上にホステッドクラスターを作成できます。

Amazon Web Services (AWS) 上の Hosted Control Plane では、デフォルトで AMD64 ホステッドクラスターを使用します。ただし、Hosted Control Plane を ARM64 ホステッドクラスターで実行することもできます。詳細は、「ARM64 アーキテクチャーでのホステッドクラスターの実行」を参照してください。

ノードプールとホステッドクラスターの互換性のある組み合わせは、次の表を参照してください。

Expand
表4.5 ノードプールとホステッドクラスターの互換性のあるアーキテクチャー
ホステッドクラスターノードプール

AMD64

AMD64 または ARM64

ARM64

ARM64 または AMD64

前提条件

  • Hosted Control Plane の CLI である hcp を設定した。
  • local-cluster マネージドクラスターを管理クラスターとして有効にした。
  • AWS Identity and Access Management (IAM) ロールと AWS Security Token Service (STS) 認証情報を作成した。

手順

  1. AWS 上にホステッドクラスターを作成するには、次のコマンドを実行します。

    $ hcp create cluster aws \
        --name <hosted_cluster_name> \
    1
    
        --infra-id <infra_id> \
    2
    
        --base-domain <basedomain> \
    3
    
        --sts-creds <path_to_sts_credential_file> \
    4
    
        --pull-secret <path_to_pull_secret> \
    5
    
        --region <region> \
    6
    
        --generate-ssh \
        --node-pool-replicas <node_pool_replica_count> \
    7
    
        --namespace <hosted_cluster_namespace> \
    8
    
        --role-arn <role_name> \
    9
    
        --render-into <file_name>.yaml 
    10
    1
    ホステッドクラスターの名前を指定します (例: example)。
    1 2
    インフラストラクチャー名を指定します。<hosted_cluster_name><infra_id> には同じ値を指定する必要があります。そうしないと、multicluster engine for Kubernetes Operator のコンソールに、クラスターが正しく表示されない可能性があります。
    3
    ベースドメインを指定します (例: example.com)。
    4
    AWS STS 認証情報ファイルへのパスを指定します (例: /home/user/sts-creds/sts-creds.json)。
    5
    プルシークレットへのパスを指定します (例: /user/name/pullsecret)。
    6
    AWS リージョン名を指定します (例: us-east-1)。
    7
    ノードプールのレプリカ数を指定します (例: 3)。
    8
    デフォルトでは、HostedClusterNodePool のすべてのカスタムリソースが clusters namespace に作成されます。--namespace <namespace> パラメーターを使用すると、特定の namespace に HostedCluster および NodePool カスタムリソースを作成できます。
    9
    Amazon Resource Name (ARN) を指定します (例: arn:aws:iam::820196288204:role/myrole)。
    10
    EC2 インスタンスを共有テナントハードウェア上で実行するか、シングルテナントハードウェア上で実行するかを指定する場合は、このフィールドを含めます。--render-into フラグを含めると、Kubernetes リソースが、このフィールドで指定した YAML ファイルにレンダリングされます。この場合、次のステップに進み、YAML ファイルを編集します。
  2. 前のコマンドに --render-into フラグを含めた場合は、指定した YAML ファイルを編集します。YAML ファイルの NodePool 仕様を編集して、EC2 インスタンスを共有ハードウェア上で実行するか、シングルテナントハードウェア上で実行するかを指定します。次に例を示します。

    サンプル YAML ファイル

    apiVersion: hypershift.openshift.io/v1beta1
    kind: NodePool
    metadata:
      name: <nodepool_name> 
    1
    
    spec:
      platform:
        aws:
          placement:
            tenancy: "default" 
    2

    1
    NodePool リソースの名前を指定します。
    2
    テナンシーの有効な値 ("default""dedicated"、または "host") を指定します。ノードプールインスタンスを共有ハードウェア上で実行する場合は、"default" を使用します。各ノードプールインスタンスをシングルテナントハードウェア上で実行する場合は、"dedicated" を使用します。事前に割り当てられた専用ホスト上でノードプールインスタンスを実行する場合は、"host" を使用します。

検証

  1. ホステッドクラスターのステータスを確認し、AVAILABLE の値が True であることを確認します。以下のコマンドを実行します。

    $ oc get hostedclusters -n <hosted_cluster_namespace>
  2. 次のコマンドを実行して、ノードプールのリストを取得します。

    $ oc get nodepools --namespace <hosted_cluster_namespace>

4.1.4. AWS 上のホステッドクラスターへのアクセス

AWS 上にホステッドクラスターを作成したら、kubeconfig ファイル、アクセスシークレット、および kubeadmin 認証情報を使用してアクセスできます。

ホステッドクラスターのリソースとアクセスシークレットは、ホステッドクラスターの namespace に格納されます。Hosted Control Plane は、Hosted Control Plane の namespace で実行されます。

秘密名のフォーマットは以下の表に示されています。

Expand
表4.6 アクセスシークレット
Secret形式

kubeconfig シークレット

<hosted_cluster_namespace>-<name>-admin-kubeconfig

clusters-hypershift-demo-admin-kubeconfig

kubeadmin パスワードシークレット

<hosted_cluster_namespace>-<name>-kubeadmin-password

clusters-hypershift-demo-kubeadmin-password

注記

kubeadmin パスワードシークレットは、Base64 でエンコードされています。kubeconfig シークレットには、Base64 でエンコードされた kubeconfig 設定が含まれています。Base64 でエンコードされた kubeconfig 設定をデコードし、<hosted_cluster_name>.kubeconfig ファイルに保存する必要があります。

手順

  1. 次のコマンドを入力して、kubeconfig ファイルを生成します。

    $ hcp create kubeconfig --namespace <hosted_cluster_namespace> \
      --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
  2. デコードされた kubeconfig 設定を含む <hosted_cluster_name>.kubeconfig ファイルを使用して、ホステッドクラスターにアクセスします。以下のコマンドを入力します。

    $ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes

    API サーバーまたはホステッドクラスターのコンソールにログインするには、kubeadmin パスワードシークレットをデコードする必要があります。

4.1.5. AWS 上の複数のゾーンにホステッドクラスターを作成する

可用性と耐障害性を向上させるために、複数の AWS アベイラビリティーゾーンにまたがるホステッドクラスターを作成できます。ノードプールとコンピュートノードを複数のゾーンに分散させることで、単一の地理的リージョンで発生する可能性のある障害からワークロードを保護できます。

hcp コマンドラインインターフェイス (CLI) を使用して、Amazon Web Services (AWS) 上の複数のゾーンにホステッドクラスターを作成できます。

前提条件

  • AWS Identity and Access Management (IAM) ロールと AWS Security Token Service (STS) 認証情報を作成した。

手順

  • 次のコマンドを実行して、AWS 上の複数のゾーンにホステッドクラスターを作成します。

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \
      --node-pool-replicas=<node_pool_replica_count> \
      --base-domain <basedomain> \
      --pull-secret <path_to_pull_secret> \
      --role-arn <arn_role> \
      --region <region> \
      --zones <zones> \
      --sts-creds <path_to_sts_credential_file>

    ここでは、以下のようになります。

    <hosted_cluster_name>
    : ホステッドクラスターの名前を指定します。
    <node_pool_replica_count>
    ノードプールのレプリカ数を指定します。たとえば、2 です
    < ベースドメイン >
    ベースドメインを指定します。例: example.com
    <path_to_pull_secret>
    プルシークレットへのパスを指定します。たとえば、/user/name/pullsecret です
    <arn_role>
    Amazon Resource Name (ARN) を指定します。例: arn:aws:iam::820196288204:role/myrole
    < 領域 >
    AWS リージョン名を指定します。例: us-east-1
    < ゾーン >
    AWS リージョン内のアベイラビリティーゾーンを指定します。たとえば、us-east-1aus-east-1b などです。
    <sts_credential_file へのパス >
    AWS STS 認証情報ファイルへのパスを指定します。例: /home/user/sts-creds/sts-creds.json

指定したゾーンごとに、次のインフラストラクチャーが作成されます。

  • パブリックサブネット
  • プライベートサブネット
  • NAT ゲートウェイ
  • プライベートルートテーブル

パブリックルートテーブルはパブリックサブネット間で共有されます。

ゾーンごとに 1 つの NodePool リソースが作成されます。ノードプール名の末尾にはゾーン名が付けられます。ゾーンのプライベートサブネットは spec.platform.aws.subnet.id に設定されます。

4.1.5.1. AWS STS 認証情報を指定してホステッドクラスターを作成する

hcp create cluster aws コマンドを使用してホステッドクラスターを作成する場合は、ホステッドクラスターのインフラストラクチャーリソースを作成する権限を持つ Amazon Web Services (AWS) アカウントの認証情報を指定する必要があります。

インフラストラクチャーリソースの例としては、次のものがあります。

  • Virtual Private Cloud (VPC)
  • サブネット
  • ネットワークアドレス変換 (NAT) ゲートウェイ

次のいずれかの方法で AWS 認証情報を指定できます。

  • AWS Security Token Service (STS) 認証情報
  • multicluster engine Operator からの AWS クラウドプロバイダーのシークレット

手順

  • AWS STS 認証情報を指定して AWS 上にホステッドクラスターを作成するには、次のコマンドを入力します。

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \
    1
    
      --node-pool-replicas <node_pool_replica_count> \
    2
    
      --base-domain <basedomain> \
    3
    
      --pull-secret <path_to_pull_secret> \
    4
    
      --sts-creds <path_to_sts_credential_file> \
    5
    
      --region <region> \
    6
    
      --role-arn <arn_role>  
    7
    1
    ホステッドクラスターの名前を指定します (例: example)。
    2
    ノードプールのレプリカ数を指定します (例: 2)。
    3
    ベースドメインを指定します (例: example.com)。
    4
    プルシークレットへのパスを指定します (例: /user/name/pullsecret)。
    5
    AWS STS 認証情報ファイルへのパスを指定します (例: /home/user/sts-creds/sts-creds.json)。
    6
    AWS リージョン名を指定します (例: us-east-1)。
    7
    Amazon Resource Name (ARN) を指定します (例: arn:aws:iam::820196288204:role/myrole)。

4.1.6. ARM64 アーキテクチャーでのホステッドクラスターの実行

Amazon Web Services (AWS) 上の Hosted Control Plane では、デフォルトで AMD64 ホステッドクラスターを使用します。ただし、Hosted Control Plane を ARM64 ホステッドクラスターで実行することもできます。

ノードプールとホステッドクラスターの互換性のある組み合わせは、次の表を参照してください。

Expand
表4.7 ノードプールとホステッドクラスターの互換性のあるアーキテクチャー
ホステッドクラスターノードプール

AMD64

AMD64 または ARM64

ARM64

ARM64 または AMD64

4.1.6.1. ARM64 OpenShift Container Platform クラスターにホステッドクラスターを作成する

デフォルトのリリースイメージをマルチアーキテクチャーリリースイメージでオーバーライドすることで、Amazon Web Services (AWS) の ARM64 OpenShift Container Platform クラスターでホステッドクラスターを実行できます。

マルチアーキテクチャーリリースイメージを使用しない場合、ホステッドクラスターでマルチアーキテクチャーリリースイメージを使用するか、リリースイメージに基づいて NodePool カスタムリソースを更新するまで、ノードプール内のコンピュートノードが作成されず、ノードプールのリコンシリエーションが停止します。

前提条件

  • AWS にインストールされた、64 ビット ARM インフラストラクチャーの OpenShift Container Platform クラスターがある。詳細は、Create an OpenShift Container Platform Cluster: AWS (ARM) を参照してください。
  • AWS Identity and Access Management (IAM) ロールと AWS Security Token Service (STS) 認証情報を作成する。詳細は、「AWS IAM ロールと STS 認証情報の作成」を参照してください。

手順

  • 次のコマンドを入力して、ARM64 OpenShift Container Platform クラスターにホステッドクラスターを作成します。

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \
    1
    
      --node-pool-replicas <node_pool_replica_count> \
    2
    
      --base-domain <basedomain> \
    3
    
      --pull-secret <path_to_pull_secret> \
    4
    
      --sts-creds <path_to_sts_credential_file> \
    5
    
      --region <region> \
    6
    
      --release-image quay.io/openshift-release-dev/ocp-release:<ocp_release_image> \
    7
    
      --role-arn <role_name> 
    8
    1
    ホステッドクラスターの名前を指定します (例: example)。
    2
    ノードプールのレプリカ数を指定します (例: 3)。
    3
    ベースドメインを指定します (例: example.com)。
    4
    プルシークレットへのパスを指定します (例: /user/name/pullsecret)。
    5
    AWS STS 認証情報ファイルへのパスを指定します (例: /home/user/sts-creds/sts-creds.json)。
    6
    AWS リージョン名を指定します (例: us-east-1)。
    7
    使用するサポート対象の OpenShift Container Platform バージョンを指定します (例: 4.20.0-multi)。非接続環境を使用している場合は、<ocp_release_image> をダイジェストイメージに置き換えます。OpenShift Container Platform リリースイメージダイジェストを抽出するには、「OpenShift Container Platform リリースイメージダイジェストの抽出」を参照してください。
    8
    Amazon Resource Name (ARN) を指定します (例: arn:aws:iam::820196288204:role/myrole)。

4.1.6.2. AWS ホステッドクラスターに ARM または AMD の NodePool オブジェクトを作成する

同じ Hosted Control Plane から、64 ビット ARM および AMD の NodePool オブジェクトであるアプリケーションワークロードをスケジュールできます。NodePool 仕様で arch フィールドを定義し、NodePool オブジェクトに必要なプロセッサーアーキテクチャーを設定できます。arch フィールドの有効な値は次のとおりです。

  • arm64
  • amd64

前提条件

手順

  • 次のコマンドを実行して、AWS でホステッドクラスターに ARM または AMD の NodePool オブジェクトを追加します。

    $ hcp create nodepool aws \
      --cluster-name <hosted_cluster_name> \
    1
    
      --name <node_pool_name> \
    2
    
      --node-count <node_pool_replica_count> \
    3
    
      --arch <architecture> 
    4
    1
    ホステッドクラスターの名前を指定します (例: example)。
    2
    ノードプール名を指定します。
    3
    ノードプールのレプリカ数を指定します (例: 3)。
    4
    アーキテクチャータイプを指定します (例: arm64amd64)。--arch フラグに値を指定しない場合は、デフォルトで amd64 値が使用されます。

4.1.7. AWS でのプライベートホステッドクラスターの作成

local-cluster を 管理クラスターとして有効にした後、Amazon Web Services (AWS) 上にホステッドクラスターまたはプライベートホステッドクラスターをデプロイできます。

デフォルトでは、ホステッドクラスターはパブリック DNS と管理クラスターのデフォルトルーターを介してパブリックにアクセスできます。

AWS 上のプライベートクラスターの場合、ホステッドクラスターとの通信は、すべて AWS PrivateLink を介して行われます。

前提条件

  • AWS PrivateLink を有効にした。詳細は、「AWS PrivateLink の有効化」を参照してください。
  • AWS Identity and Access Management (IAM) ロールと AWS Security Token Service (STS) 認証情報を作成した。詳細は、「AWS IAM ロールと STS 認証情報の作成」および「Identity and Access Management (IAM) 権限」を参照してください。
  • AWS に踏み台インスタンス を設定した。

手順

  • 次のコマンドを入力して、AWS 上にプライベートホステッドクラスターを作成します。

    $ hcp create cluster aws \
      --name <hosted_cluster_name> \
      --node-pool-replicas=<node_pool_replica_count> \
      --base-domain <basedomain> \
      --pull-secret <path_to_pull_secret> \
      --sts-creds <path_to_sts_credential_file> \
      --region <region> \
      --endpoint-access Private \
      --role-arn <role_name>

    ここでは、以下のようになります。

    <hosted_cluster_name>
    ホステッドクラスターの名前を指定します。例: example .
    <node_pool_replica_count>
    ノードプールのレプリカ数を指定します。たとえば、3 と 指定します。
    < ベースドメイン >
    ベースドメインを指定します。例: example.com
    <path_to_pull_secret>
    プルシークレットへのパスを指定します。たとえば、/user/name/pullsecret です
    <sts_credential_file へのパス >
    AWS STS 認証情報ファイルへのパスを指定します。例: /home/user/sts-creds/sts-creds.json
    < 領域 >
    AWS リージョン名を指定します。例: us-east-1
    Private
    クラスターがプライベートであることを指定します。
    < ロール名 >
    Amazon Resource Name (ARN) を指定します。例: arn:aws:iam::820196288204:role/myrole。ARN ロールの詳細は、「Identity and Access Management (IAM) 権限」を参照してください。

    ホステッドクラスターの次の API エンドポイントは、プライベート DNS ゾーンを通じてアクセスできます。

  • api.<hosted_cluster_name>.hypershift.local
  • *.apps.<hosted_cluster_name>.hypershift.local

4.1.7.1. AWS 上のプライベートホステッドクラスターへのアクセス

プライベートホステッドクラスターを作成したら、コマンドラインインターフェイス (CLI) を使用してアクセスできます。

手順

  1. 次のコマンドを入力して、ノードのプライベート IP を確認します。

    $ aws ec2 describe-instances \
      --filter="Name=tag:kubernetes.io/cluster/<infra_id>,Values=owned" \
      | jq '.Reservations[] | .Instances[] | select(.PublicDnsName=="") \
      | .PrivateIpAddress'
  2. 次のコマンドを入力して、ホステッドクラスターの kubeconfig ファイルを作成し、ノードにコピーします。

    $ hcp create kubeconfig > <hosted_cluster_kubeconfig>
  3. 踏み台経由でノードの 1 つに SSH 接続するために、次のコマンドを入力します。

    $ ssh -o ProxyCommand="ssh ec2-user@<bastion_ip> \
      -W %h:%p" core@<node_ip>
  4. SSH シェルから、次のコマンドを入力して、kubeconfig ファイルの内容をノード上のファイルにコピーします。

    $ mv <path_to_kubeconfig_file> <new_file_name>
  5. 次のコマンドを入力して、kubeconfig ファイルをエクスポートします。

    $ export KUBECONFIG=<path_to_kubeconfig_file>
  6. 次のコマンドを入力して、ホステッドクラスターのステータスを確認します。

    $ oc get clusteroperators clusterversion
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る