第5章 Hosted Control Plane の管理
5.1. AWS での Hosted Control Plane の管理
Amazon Web Services (AWS) 上の OpenShift Container Platform に Hosted Control Plane を使用する場合、セットアップに応じてインフラストラクチャーの要件が異なります。
5.1.1. AWS インフラストラクチャーと IAM 権限を管理するための前提条件
Amazon Web Services (AWS) 上の OpenShift Container Platform の Hosted Control Plane を設定するには、次のインフラストラクチャー要件を満たす必要があります。
- ホステッドクラスターを作成する前に、Hosted Control Plane を設定した。
- AWS Identity and Access Management (IAM) ロールと AWS Security Token Service (STS) 認証情報を作成した。
5.1.1.1. AWS のインフラストラクチャー要件
Amazon Web Services (AWS) で Hosted Control Plane を使用する場合、インフラストラクチャー要件は次のカテゴリーに当てはまります。
- 任意の AWS アカウント内の、HyperShift Operator 用の事前に必要な管理対象外インフラストラクチャー
- ホステッドクラスターの AWS アカウント内の事前に必要な管理対象外インフラストラクチャー
- 管理 AWS アカウント内の Hosted Control Plane によって管理されるインフラストラクチャー
- ホステッドクラスターの AWS アカウント内の Hosted Control Plane によって管理されるインフラストラクチャー
- ホステッドクラスターの AWS アカウント内の Kubernetes によって管理されるインフラストラクチャー
事前に必要とは、Hosted Control Plane を適切に動作させるために AWS インフラストラクチャーが必要であることを意味します。管理対象外とは、Operator やコントローラーによってインフラストラクチャーが作成されないことを意味します。
5.1.1.2. AWS アカウント内の HyperShift Operator 用の管理対象外インフラストラクチャー
任意の Amazon Web Services (AWS) アカウントは、Hosted Control Plane サービスのプロバイダーによって異なります。
セルフマネージドの Hosted Control Plane では、クラスターサービスプロバイダーが AWS アカウントを制御します。クラスターサービスプロバイダーは、クラスターコントロールプレーンをホストし、稼働時間について責任を負う管理者です。マネージドの Hosted Control Plane では、AWS アカウントは Red Hat に属します。
HyperShift Operator 用の事前に必要な管理対象外のインフラストラクチャーでは、管理クラスター AWS アカウントに次のインフラストラクチャー要件が適用されます。
1 つの S3 バケット
- OpenID Connect (OIDC)
ルート 53 のホステッドゾーン
- ホステッドクラスターのプライベートおよびパブリックエントリーをホストするドメイン
5.1.1.3. 管理 AWS アカウントの管理対象外インフラストラクチャーの要件
インフラストラクチャーが事前に必要であり、ホステッドクラスターの AWS アカウントで管理されていない場合、すべてのアクセスモードのインフラストラクチャー要件は次のとおりです。
- 1 つの VPC
- 1 つの DHCP オプション
2 つのサブネット
- 内部データプレーンサブネットであるプライベートサブネット
- データプレーンからインターネットへのアクセスを可能にするパブリックサブネット
- 1 つのインターネットゲートウェイ
- 1 つの Elastic IP
- 1 つの NAT ゲートウェイ
- 1 つのセキュリティーグループ (ワーカーノード)
- 2 つのルートテーブル (1 つはプライベート、もう 1 つはパブリック)
- 2 つの Route 53 のホステッドゾーン
次の項目に対する十分なクォータ:
- パブリックホステッドクラスター用の 1 つの Ingress サービスロードバランサー
- プライベートホステッドクラスター用の 1 つのプライベートリンクエンドポイント
プライベートリンクネットワークが機能するには、ホステッドクラスターの AWS アカウントのエンドポイントゾーンが、管理クラスターの AWS アカウントのサービスエンドポイントによって解決されるインスタンスのゾーンと同じである必要があります。AWS では、ゾーン名は us-east-2b などのエイリアスであり、必ずしも異なるアカウントの同じゾーンにマップされるわけではありません。そのため、プライベートリンクが機能するには、管理クラスターのリージョンのすべてのゾーンにサブネットまたはワーカーが必要です。
5.1.1.4. 管理 AWS アカウントのインフラストラクチャーの要件
インフラストラクチャーが管理 AWS アカウントの Hosted Control Plane によって管理されている場合、インフラストラクチャーの要件は、クラスターがパブリック、プライベート、またはその組み合わせであるかによって異なります。
パブリッククラスターを使用するアカウントの場合、インフラストラクチャー要件は次のとおりです。
ネットワークロードバランサー: ロードバランサー Kube API サーバー
- Kubernetes がセキュリティーグループを作成する
ボリューム
- etcd 用 (高可用性に応じて 1 つまたは 3 つ)
- OVN-Kube 用
プライベートクラスターを使用するアカウントの場合、インフラストラクチャー要件は次のとおりです。
- ネットワークロードバランサー: ロードバランサーのプライベートルーター
- エンドポイントサービス (プライベートリンク)
パブリッククラスターとプライベートクラスターを持つアカウントの場合、インフラストラクチャー要件は次のとおりです。
- ネットワークロードバランサー: ロードバランサーのパブリックルーター
- ネットワークロードバランサー: ロードバランサーのプライベートルーター
- エンドポイントサービス (プライベートリンク)
ボリューム
- etcd 用 (高可用性に応じて 1 つまたは 3 つ)
- OVN-Kube 用
5.1.1.5. ホステッドクラスターの AWS アカウントのインフラストラクチャー要件
インフラストラクチャーがホステッドクラスターの Amazon Web Services (AWS) アカウントの Hosted Control Plane によって管理されている場合、インフラストラクチャーの要件は、クラスターがパブリック、プライベート、またはその組み合わせであるかによって異なります。
パブリッククラスターを使用するアカウントの場合、インフラストラクチャー要件は次のとおりです。
-
ノードプールには、
Role
とRolePolicy
が定義された EC2 インスタンスが必要です。
プライベートクラスターを使用するアカウントの場合、インフラストラクチャー要件は次のとおりです。
- アベイラビリティーゾーンごとに 1 つのプライベートリンクエンドポイント
- ノードプールの EC2 インスタンス
パブリッククラスターとプライベートクラスターを持つアカウントの場合、インフラストラクチャー要件は次のとおりです。
- アベイラビリティーゾーンごとに 1 つのプライベートリンクエンドポイント
- ノードプールの EC2 インスタンス
5.1.1.6. ホステッドクラスターの AWS アカウント内の Kubernetes によって管理されるインフラストラクチャー
ホステッドクラスターの Amazon Web Services (AWS) アカウント内のインフラストラクチャーを Kubernetes によって管理する場合、インフラストラクチャーの要件は次のとおりです。
- デフォルトの Ingress 用のネットワークロードバランサー
- レジストリー用の S3 バケット
5.1.2. Identity and Access Management (IAM) 権限
Hosted Control Plane のコンテキストでは、コンシューマーが Amazon Resource Name (ARN) ロールを作成する役割を果たします。コンシューマー は、権限ファイルを生成するための自動プロセスです。コンシューマーは CLI または OpenShift Cluster Manager である場合があります。Hosted Control Plane では、最小権限コンポーネントの原則を遵守するための詳細な設定が可能です。そのため、すべてのコンポーネントが独自のロールを使用して Amazon Web Services (AWS) オブジェクトを操作または作成します。ロールは、製品が正常に機能するために必要なものに制限されます。
ホステッドクラスターは ARN ロールを入力として受け取り、コンシューマーは各コンポーネントの AWS 権限設定を作成します。その結果、コンポーネントは STS および事前設定された OIDC IDP を通じて認証できるようになります。
次のロールは、コントロールプレーン上で実行され、データプレーン上で動作する、Hosted Control Plane の一部のコンポーネントによって消費されます。
-
controlPlaneOperatorARN
-
imageRegistryARN
-
ingressARN
-
kubeCloudControllerARN
-
nodePoolManagementARN
-
storageARN
-
networkARN
次の例は、ホステッドクラスターからの IAM ロールへの参照を示しています。
... endpointAccess: Public region: us-east-2 resourceTags: - key: kubernetes.io/cluster/example-cluster-bz4j5 value: owned rolesRef: controlPlaneOperatorARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-control-plane-operator imageRegistryARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-openshift-image-registry ingressARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-openshift-ingress kubeCloudControllerARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-cloud-controller networkARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-cloud-network-config-controller nodePoolManagementARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-node-pool storageARN: arn:aws:iam::820196288204:role/example-cluster-bz4j5-aws-ebs-csi-driver-controller type: AWS ...
Hosted Control Plane が使用するロールを次の例に示します。
ingressARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticloadbalancing:DescribeLoadBalancers", "tag:GetResources", "route53:ListHostedZones" ], "Resource": "\*" }, { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::PUBLIC_ZONE_ID", "arn:aws:route53:::PRIVATE_ZONE_ID" ] } ] }
imageRegistryARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:DeleteBucket", "s3:PutBucketTagging", "s3:GetBucketTagging", "s3:PutBucketPublicAccessBlock", "s3:GetBucketPublicAccessBlock", "s3:PutEncryptionConfiguration", "s3:GetEncryptionConfiguration", "s3:PutLifecycleConfiguration", "s3:GetLifecycleConfiguration", "s3:GetBucketLocation", "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucketMultipartUploads", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": "\*" } ] }
storageARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AttachVolume", "ec2:CreateSnapshot", "ec2:CreateTags", "ec2:CreateVolume", "ec2:DeleteSnapshot", "ec2:DeleteTags", "ec2:DeleteVolume", "ec2:DescribeInstances", "ec2:DescribeSnapshots", "ec2:DescribeTags", "ec2:DescribeVolumes", "ec2:DescribeVolumesModifications", "ec2:DetachVolume", "ec2:ModifyVolume" ], "Resource": "\*" } ] }
networkARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceStatus", "ec2:DescribeInstanceTypes", "ec2:UnassignPrivateIpAddresses", "ec2:AssignPrivateIpAddresses", "ec2:UnassignIpv6Addresses", "ec2:AssignIpv6Addresses", "ec2:DescribeSubnets", "ec2:DescribeNetworkInterfaces" ], "Resource": "\*" } ] }
kubeCloudControllerARN
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeRegions", "ec2:DescribeRouteTables", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVolumes", "ec2:CreateSecurityGroup", "ec2:CreateTags", "ec2:CreateVolume", "ec2:ModifyInstanceAttribute", "ec2:ModifyVolume", "ec2:AttachVolume", "ec2:AuthorizeSecurityGroupIngress", "ec2:CreateRoute", "ec2:DeleteRoute", "ec2:DeleteSecurityGroup", "ec2:DeleteVolume", "ec2:DetachVolume", "ec2:RevokeSecurityGroupIngress", "ec2:DescribeVpcs", "elasticloadbalancing:AddTags", "elasticloadbalancing:AttachLoadBalancerToSubnets", "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer", "elasticloadbalancing:CreateLoadBalancer", "elasticloadbalancing:CreateLoadBalancerPolicy", "elasticloadbalancing:CreateLoadBalancerListeners", "elasticloadbalancing:ConfigureHealthCheck", "elasticloadbalancing:DeleteLoadBalancer", "elasticloadbalancing:DeleteLoadBalancerListeners", "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:DescribeLoadBalancerAttributes", "elasticloadbalancing:DetachLoadBalancerFromSubnets", "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", "elasticloadbalancing:ModifyLoadBalancerAttributes", "elasticloadbalancing:RegisterInstancesWithLoadBalancer", "elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer", "elasticloadbalancing:AddTags", "elasticloadbalancing:CreateListener", "elasticloadbalancing:CreateTargetGroup", "elasticloadbalancing:DeleteListener", "elasticloadbalancing:DeleteTargetGroup", "elasticloadbalancing:DescribeListeners", "elasticloadbalancing:DescribeLoadBalancerPolicies", "elasticloadbalancing:DescribeTargetGroups", "elasticloadbalancing:DescribeTargetHealth", "elasticloadbalancing:ModifyListener", "elasticloadbalancing:ModifyTargetGroup", "elasticloadbalancing:RegisterTargets", "elasticloadbalancing:SetLoadBalancerPoliciesOfListener", "iam:CreateServiceLinkedRole", "kms:DescribeKey" ], "Resource": [ "\*" ], "Effect": "Allow" } ] }
nodePoolManagementARN
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:AllocateAddress", "ec2:AssociateRouteTable", "ec2:AttachInternetGateway", "ec2:AuthorizeSecurityGroupIngress", "ec2:CreateInternetGateway", "ec2:CreateNatGateway", "ec2:CreateRoute", "ec2:CreateRouteTable", "ec2:CreateSecurityGroup", "ec2:CreateSubnet", "ec2:CreateTags", "ec2:DeleteInternetGateway", "ec2:DeleteNatGateway", "ec2:DeleteRouteTable", "ec2:DeleteSecurityGroup", "ec2:DeleteSubnet", "ec2:DeleteTags", "ec2:DescribeAccountAttributes", "ec2:DescribeAddresses", "ec2:DescribeAvailabilityZones", "ec2:DescribeImages", "ec2:DescribeInstances", "ec2:DescribeInternetGateways", "ec2:DescribeNatGateways", "ec2:DescribeNetworkInterfaces", "ec2:DescribeNetworkInterfaceAttribute", "ec2:DescribeRouteTables", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "ec2:DescribeVpcAttribute", "ec2:DescribeVolumes", "ec2:DetachInternetGateway", "ec2:DisassociateRouteTable", "ec2:DisassociateAddress", "ec2:ModifyInstanceAttribute", "ec2:ModifyNetworkInterfaceAttribute", "ec2:ModifySubnetAttribute", "ec2:ReleaseAddress", "ec2:RevokeSecurityGroupIngress", "ec2:RunInstances", "ec2:TerminateInstances", "tag:GetResources", "ec2:CreateLaunchTemplate", "ec2:CreateLaunchTemplateVersion", "ec2:DescribeLaunchTemplates", "ec2:DescribeLaunchTemplateVersions", "ec2:DeleteLaunchTemplate", "ec2:DeleteLaunchTemplateVersions" ], "Resource": [ "\*" ], "Effect": "Allow" }, { "Condition": { "StringLike": { "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com" } }, "Action": [ "iam:CreateServiceLinkedRole" ], "Resource": [ "arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing" ], "Effect": "Allow" }, { "Action": [ "iam:PassRole" ], "Resource": [ "arn:*:iam::*:role/*-worker-role" ], "Effect": "Allow" } ] }
controlPlaneOperatorARN
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateVpcEndpoint", "ec2:DescribeVpcEndpoints", "ec2:ModifyVpcEndpoint", "ec2:DeleteVpcEndpoints", "ec2:CreateTags", "route53:ListHostedZones" ], "Resource": "\*" }, { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets", "route53:ListResourceRecordSets" ], "Resource": "arn:aws:route53:::%s" } ] }
5.1.3. AWS インフラストラクチャーと IAM リソースを個別に作成する
デフォルトでは、hcp create cluster aws
コマンドは、クラウドインフラストラクチャーをホステッドクラスターとともに作成し、それを適用します。hcp create cluster aws
コマンドを使用してクラスターの作成だけを実行したり、クラスターを生成して適用する前に変更したりできるように、クラウドインフラストラクチャー部分を個別に作成することもできます。
クラウドインフラストラクチャー部分を個別に作成するには、Amazon Web Services (AWS) インフラストラクチャーの作成、AWS Identity and Access (IAM) リソースの作成、およびクラスターの作成を行う必要があります。
5.1.3.1. AWS インフラストラクチャーを個別に作成する
Amazon Web Services (AWS) インフラストラクチャーを作成するには、クラスター用の Virtual Private Cloud (VPC) やその他のリソースを作成する必要があります。AWS コンソールまたはインフラストラクチャー自動化およびプロビジョニングツールを使用できます。AWS コンソールの使用手順は、AWS ドキュメントの Create a VPC plus other VPC resources を参照してください。
VPC には、プライベートサブネットとパブリックサブネット、およびネットワークアドレス変換 (NAT) ゲートウェイやインターネットゲートウェイなどの外部アクセス用のリソースが含まれている必要があります。VPC に加えて、クラスターの Ingress 用のプライベートホストゾーンが必要です。PrivateLink (Private
または PublicAndPrivate
アクセスモード) を使用するクラスターを作成する場合は、PrivateLink 用の追加のホストゾーンが必要です。
次の設定例を使用して、ホステッドクラスター用の AWS インフラストラクチャーを作成します。
--- apiVersion: v1 kind: Namespace metadata: creationTimestamp: null name: clusters spec: {} status: {} --- apiVersion: v1 data: .dockerconfigjson: xxxxxxxxxxx kind: Secret metadata: creationTimestamp: null labels: hypershift.openshift.io/safe-to-delete-with-cluster: "true" name: <pull_secret_name> 1 namespace: clusters --- apiVersion: v1 data: key: xxxxxxxxxxxxxxxxx kind: Secret metadata: creationTimestamp: null labels: hypershift.openshift.io/safe-to-delete-with-cluster: "true" name: <etcd_encryption_key_name> 2 namespace: clusters type: Opaque --- apiVersion: v1 data: id_rsa: xxxxxxxxx id_rsa.pub: xxxxxxxxx kind: Secret metadata: creationTimestamp: null labels: hypershift.openshift.io/safe-to-delete-with-cluster: "true" name: <ssh-key-name> 3 namespace: clusters --- apiVersion: hypershift.openshift.io/v1beta1 kind: HostedCluster metadata: creationTimestamp: null name: <hosted_cluster_name> 4 namespace: clusters spec: autoscaling: {} configuration: {} controllerAvailabilityPolicy: SingleReplica dns: baseDomain: <dns_domain> 5 privateZoneID: xxxxxxxx publicZoneID: xxxxxxxx etcd: managed: storage: persistentVolume: size: 8Gi storageClassName: gp3-csi type: PersistentVolume managementType: Managed fips: false infraID: <infra_id> 6 issuerURL: <issuer_url> 7 networking: clusterNetwork: - cidr: 10.132.0.0/14 machineNetwork: - cidr: 10.0.0.0/16 networkType: OVNKubernetes serviceNetwork: - cidr: 172.31.0.0/16 olmCatalogPlacement: management platform: aws: cloudProviderConfig: subnet: id: <subnet_xxx> 8 vpc: <vpc_xxx> 9 zone: us-west-1b endpointAccess: Public multiArch: false region: us-west-1 rolesRef: controlPlaneOperatorARN: arn:aws:iam::820196288204:role/<infra_id>-control-plane-operator imageRegistryARN: arn:aws:iam::820196288204:role/<infra_id>-openshift-image-registry ingressARN: arn:aws:iam::820196288204:role/<infra_id>-openshift-ingress kubeCloudControllerARN: arn:aws:iam::820196288204:role/<infra_id>-cloud-controller networkARN: arn:aws:iam::820196288204:role/<infra_id>-cloud-network-config-controller nodePoolManagementARN: arn:aws:iam::820196288204:role/<infra_id>-node-pool storageARN: arn:aws:iam::820196288204:role/<infra_id>-aws-ebs-csi-driver-controller type: AWS pullSecret: name: <pull_secret_name> release: image: quay.io/openshift-release-dev/ocp-release:4.16-x86_64 secretEncryption: aescbc: activeKey: name: <etcd_encryption_key_name> type: aescbc services: - service: APIServer servicePublishingStrategy: type: LoadBalancer - service: OAuthServer servicePublishingStrategy: type: Route - service: Konnectivity servicePublishingStrategy: type: Route - service: Ignition servicePublishingStrategy: type: Route - service: OVNSbDb servicePublishingStrategy: type: Route sshKey: name: <ssh_key_name> status: controlPlaneEndpoint: host: "" port: 0 --- apiVersion: hypershift.openshift.io/v1beta1 kind: NodePool metadata: creationTimestamp: null name: <node_pool_name> 10 namespace: clusters spec: arch: amd64 clusterName: <hosted_cluster_name> management: autoRepair: true upgradeType: Replace nodeDrainTimeout: 0s platform: aws: instanceProfile: <instance_profile_name> 11 instanceType: m6i.xlarge rootVolume: size: 120 type: gp3 subnet: id: <subnet_xxx> type: AWS release: image: quay.io/openshift-release-dev/ocp-release:4.16-x86_64 replicas: 2 status: replicas: 0
- 1
<pull_secret_name>
は、プルシークレットの名前に置き換えます。- 2
<etcd_encryption_key_name>
は、etcd 暗号鍵の名前に置き換えます。- 3
<ssh_key_name>
は、SSH 鍵の名前に置き換えます。- 4
<hosted_cluster_name>
は、ホステッドクラスターの名前に置き換えます。- 5
<dns_domain>
は、example.com
などのベース DNS ドメインに置き換えます。- 6
<infra_id>
は、ホステッドクラスターに関連付けられている IAM リソースを特定する値に置き換えます。- 7
<issuer_url>
は、末尾の値がinfra_id
である発行者 URL に置き換えます。たとえば、https://example-hosted-us-west-1.s3.us-west-1.amazonaws.com/example-hosted-infra-id
です。- 8
<subnet_xxx>
は、サブネット ID に置き換えます。プライベートサブネットとパブリックサブネットの両方にタグを付ける必要があります。パブリックサブネットの場合は、kubernetes.io/role/elb=1
を使用します。プライベートサブネットの場合は、kubernetes.io/role/internal-elb=1
を使用します。- 9
<vpc_xxx>
は、VPC ID に置き換えます。- 10
<node_pool_name>
は、NodePool
リソースの名前に置き換えます。- 11
<instance_profile_name>
は、AWS インスタンスの名前に置き換えます。
5.1.3.2. AWS IAM リソースの作成
Amazon Web Services (AWS) では、次の IAM リソースを作成する必要があります。
- IAM 内の OpenID Connect (OIDC) アイデンティティープロバイダー。これは STS 認証を有効にするために必要です。
- 7 つのロール。Kubernetes コントローラーマネージャー、クラスター API プロバイダー、レジストリーなど、プロバイダーとやり取りするコンポーネントごとに分かれたロールです。
- インスタンスプロファイル。これは、クラスターのすべてのワーカーインスタンスに割り当てられるプロファイルです。
5.1.3.3. ホステッドクラスターを個別に作成する
Amazon Web Services (AWS) にホステッドクラスターを個別に作成できます。
ホステッドクラスターを個別に作成するには、次のコマンドを入力します。
$ hcp create cluster aws \ --infra-id <infra_id> \1 --name <hosted_cluster_name> \2 --sts-creds <path_to_sts_credential_file> \3 --pull-secret <path_to_pull_secret> \4 --generate-ssh \5 --node-pool-replicas 3 --role-arn <role_name> 6
- 1
<infra_id>
をcreate infra aws
コマンドで指定したのと同じ ID に置き換えます。この値は、ホステッドクラスターに関連付けられている IAM リソースを識別します。- 2
<hosted_cluster_name>
は、ホステッドクラスターの名前に置き換えます。- 3
<path_to_sts_credential_file>
は、create infra aws
コマンドで指定した名前と同じ名前に置き換えます。- 4
<path_to_pull_secret>
を有効な OpenShift Container Platform プルシークレットを含むファイルの名前に置き換えます。- 5
--generate-ssh
フラグはオプションですが、ワーカーに SSH 接続する必要がある場合に含めるとよいでしょう。SSH キーが生成され、ホステッドクラスターと同じ名 namespace にシークレットとして保存されます。- 6
<role_name>
は、Amazon Resource Name (ARN) に置き換えます (例:arn:aws:iam::820196288204:role/myrole
)。Amazon Resource Name (ARN) を指定します (例:arn:aws:iam::820196288204:role/myrole
)。ARN ロールの詳細は、「Identity and Access Management (IAM) 権限」を参照してください。
コマンドに --render
フラグを追加して、クラスターに適用する前にリソースを編集できるファイルに出力をリダイレクトすることもできます。
コマンドを実行すると、次のリソースがクラスターに適用されます。
- namespace
- プルシークレットを含むシークレット
-
HostedCluster
-
NodePool
- コントロールプレーンコンポーネントの 3 つの AWS STS シークレット
-
--generate-ssh
フラグを指定した場合は、1 つの SSH キーシークレット。
5.1.4. ホステッドクラスターをシングルアーキテクチャーからマルチアーキテクチャーに移行する
シングルアーキテクチャーの 64 ビット AMD ホステッドクラスターを、Amazon Web Services (AWS) 上のマルチアーキテクチャーのホステッドクラスターに移行すると、クラスター上でワークロードを実行するコストを削減できます。たとえば、64 ビット ARM に移行しながら、既存のワークロードを 64 ビット AMD で実行し、このワークロードを中央の Kubernetes クラスターから管理できます。
シングルアーキテクチャーのホステッドクラスターで管理できるのは、特定の CPU アーキテクチャーのノードプールだけです。一方、マルチアーキテクチャーのホステッドクラスターでは、CPU アーキテクチャーが異なる複数のノードプールを管理できます。AWS 上のマルチアーキテクチャーのホステッドクラスターでは、64 ビット AMD ノードプールと 64 ビット ARM ノードプールの両方を管理できます。
前提条件
- multicluster engine for Kubernetes Operator を使用して、Red Hat Advanced Cluster Management (RHACM) に AWS 用の OpenShift Container Platform 管理クラスターをインストールした。
- OpenShift Container Platform リリースペイロードの 64 ビット AMD バリアントを使用する既存のシングルアーキテクチャーのホステッドクラスターがある。
- OpenShift Container Platform リリースペイロードの同じ 64 ビット AMD バリアントを使用し、既存のホステッドクラスターによって管理されるノードプールがある。
次のコマンドラインツールがインストールされている。
-
oc
-
kubectl
-
hcp
-
skopeo
-
手順
次のコマンドを実行して、シングルアーキテクチャーホステッドクラスターの既存の OpenShift Container Platform リリースイメージを確認します。
$ oc get hostedcluster/<hosted_cluster_name> -o jsonpath='{.spec.release.image}' 1
- 1
<hosted_cluster_name>
は、ホステッドクラスターの名前に置き換えます。
出力例
quay.io/openshift-release-dev/ocp-release:<4.y.z>-x86_64 1
- 1
<4.y.z>
は、使用するサポート対象の OpenShift Container Platform バージョンに置き換えます。
OpenShift Container Platform リリースイメージで、タグの代わりにダイジェストを使用する場合は、リリースイメージのマルチアーキテクチャータグバージョンを見つけます。
次のコマンドを実行して、OpenShift Container Platform バージョンの
OCP_VERSION
環境変数を設定します。$ OCP_VERSION=$(oc image info quay.io/openshift-release-dev/ocp-release@sha256:ac78ebf77f95ab8ff52847ecd22592b545415e1ff6c7ff7f66bf81f158ae4f5e -o jsonpath='{.config.config.Labels["io.openshift.release"]}')
次のコマンドを実行して、リリースイメージのマルチアーキテクチャータグバージョンの
MULTI_ARCH_TAG
環境変数を設定します。$ MULTI_ARCH_TAG=$(skopeo inspect docker://quay.io/openshift-release-dev/ocp-release@sha256:ac78ebf77f95ab8ff52847ecd22592b545415e1ff6c7ff7f66bf81f158ae4f5e | jq -r '.RepoTags' | sed 's/"//g' | sed 's/,//g' | grep -w "$OCP_VERSION-multi$" | xargs)
次のコマンドを実行して、マルチアーキテクチャーリリースイメージ名の
IMAGE
環境変数を設定します。$ IMAGE=quay.io/openshift-release-dev/ocp-release:$MULTI_ARCH_TAG
マルチアーキテクチャーイメージダイジェストのリストを表示するには、次のコマンドを実行します。
$ oc image info $IMAGE
出力例
OS DIGEST linux/amd64 sha256:b4c7a91802c09a5a748fe19ddd99a8ffab52d8a31db3a081a956a87f22a22ff8 linux/ppc64le sha256:66fda2ff6bd7704f1ba72be8bfe3e399c323de92262f594f8e482d110ec37388 linux/s390x sha256:b1c1072dc639aaa2b50ec99b530012e3ceac19ddc28adcbcdc9643f2dfd14f34 linux/arm64 sha256:7b046404572ac96202d82b6cb029b421dddd40e88c73bbf35f602ffc13017f21
ホステッドクラスターをシングルアーキテクチャーからマルチアーキテクチャーに移行します。
ホステッドクラスターで
multiArch
フラグをtrue
に設定して、ホステッドクラスターが 64 ビット AMD と 64 ビット ARM の両方のノードプールを作成できるようにします。以下のコマンドを実行します。$ oc patch -n clusters hostedclusters/<hosted_cluster_name> -p '{"spec":{"platform":{"aws":{"multiArch":true}}}}' --type=merge
次のコマンドを実行して、ホステッドクラスターで
multiArch
フラグがtrue
に設定されていることを確認します。$ oc get hostedcluster/<hosted_cluster_name> -o jsonpath='{.spec.platform.aws.multiArch}'
ホステッドクラスターと同じ OpenShift Container Platform バージョンを必ず使用して、ホステッドクラスターのマルチアーキテクチャー OpenShift Container Platform リリースイメージを設定します。以下のコマンドを実行します。
$ oc patch -n clusters hostedclusters/<hosted_cluster_name> -p '{"spec":{"release":{"image":"quay.io/openshift-release-dev/ocp-release:<4.x.y>-multi"}}}' --type=merge 1
- 1
<4.y.z>
は、使用するサポート対象の OpenShift Container Platform バージョンに置き換えます。
次のコマンドを実行して、ホステッドクラスターにマルチアーキテクチャーイメージが設定されていることを確認します。
$ oc get hostedcluster/<hosted_cluster_name> -o jsonpath='{.spec.release.image}'
次のコマンドを実行して、
HostedControlPlane
リソースのステータスがProgressing
であることを確認します。$ oc get hostedcontrolplane -n <hosted_control_plane_namespace> -oyaml
出力例
#... - lastTransitionTime: "2024-07-28T13:07:18Z" message: HostedCluster is deploying, upgrading, or reconfiguring observedGeneration: 5 reason: Progressing status: "True" type: Progressing #...
次のコマンドを実行して、
HostedCluster
リソースのステータスがProgressing
であることを確認します。$ oc get hostedcluster <hosted_cluster_name> -n <hosted_cluster_namespace> -oyaml
検証
次のコマンドを実行して、ノードプールが
HostedControlPlane
リソース内のマルチアーキテクチャーリリースイメージを使用していることを確認します。$ oc get hostedcontrolplane -n clusters-example -oyaml
出力例
#... version: availableUpdates: null desired: image: quay.io/openshift-release-dev/ocp-release:<4.x.y>-multi 1 url: https://access.redhat.com/errata/RHBA-2024:4855 version: 4.16.5 history: - completionTime: "2024-07-28T13:10:58Z" image: quay.io/openshift-release-dev/ocp-release:<4.x.y>-multi startedTime: "2024-07-28T13:10:27Z" state: Completed verified: false version: <4.x.y>
- 1
<4.y.z>
は、使用するサポート対象の OpenShift Container Platform バージョンに置き換えます。
注記マルチアーキテクチャー OpenShift Container Platform リリースイメージは、
HostedCluster
、HostedControlPlane
リソース、および Hosted Control Plane の Pod で更新されます。ただし、既存のノードプールは、マルチアーキテクチャーイメージに自動的に移行されません。リリースイメージの移行は、ホステッドクラスターとノードプール間で分離されているためです。新しいマルチアーキテクチャーホステッドクラスターに新しいノードプールを作成する必要があります。
次のステップ
- マルチアーキテクチャーホステッドクラスターでのノードプールを作成する
5.1.5. マルチアーキテクチャーホステッドクラスターでのノードプールを作成する
ホステッドクラスターをシングルアーキテクチャーからマルチアーキテクチャーに移行したら、64 ビット AMD および 64 ビット ARM アーキテクチャーベースのコンピュートマシン上にノードプールを作成します。
手順
次のコマンドを入力して、64 ビット ARM アーキテクチャーベースのノードプールを作成します。
$ hcp create nodepool aws \ --cluster-name <hosted_cluster_name> \1 --name <nodepool_name> \2 --node-count=<node_count> \3 --arch arm64
次のコマンドを入力して、64 ビット AMD アーキテクチャーベースのノードプールを作成します。
$ hcp create nodepool aws \ --cluster-name <hosted_cluster_name> \1 --name <nodepool_name> \2 --node-count=<node_count> \3 --arch amd64
検証
次のコマンドを入力して、ノードプールがマルチアーキテクチャーリリースイメージを使用していることを確認します。
$ oc get nodepool/<nodepool_name> -oyaml
64 ビット AMD ノードプールの出力例
#... spec: arch: amd64 #... release: image: quay.io/openshift-release-dev/ocp-release:<4.x.y>-multi 1
- 1
<4.y.z>
は、使用するサポート対象の OpenShift Container Platform バージョンに置き換えます。
64 ビット ARM ノードプールの出力例
#... spec: arch: arm64 #... release: image: quay.io/openshift-release-dev/ocp-release:<4.x.y>-multi