Outpost でのローカルクラスターの作成 - Amazon EKS

Outpost でのローカルクラスターの作成

このトピックでは、Outpost でローカルクラスターを実行する際に考慮すべき事項について、概要を説明します。また、Outpost でローカルクラスターをデプロイする方法についても説明します。

考慮事項
重要
  • これらの考慮事項は、関連する Amazon EKS ドキュメントには記載されていません。Amazon EKS ドキュメントに記載されている他のトピックの情報が、ここに紹介する考慮事項と競合する場合は、こちらの考慮事項を優先してください。

  • これらの考慮事項は変更される可能性があり、変更は頻繁に行われる場合があります。そのため、このトピックは定期的に確認することをお勧めします。

  • 考慮事項の多くは、AWS クラウド でクラスターを作成する場合の考慮事項とは異なります。

  • ローカルクラスターは Outpost ラックのみをサポートします。単一のローカルクラスターは、単一の論理 Outpost を構成する複数の物理 Outpost ラックにわたって実行できます。単一のローカルクラスターを複数の論理 Outposts にわたって実行することはできません。各論理 Outpost には、単一の Outpost ARN があります。

  • ローカルクラスターは、Outpost のアカウントで Kubernetes コントロールプレーンを実行および管理します。Kubernetes コントロールプレーンインスタンスでワークロードを実行したり、Kubernetes コントロールプレーンのコンポーネントを変更することはできません。これらのノードは Amazon EKS サービスによって管理されます。Kubernetes コントロールプレーンへの変更は、パッチ適用などの自動 Amazon EKS 管理アクションでは存続しません。

  • ローカルクラスターは、セルフマネージド理型アドオンとセルフマネージド型 Amazon Linux ノードグループをサポートしています。Amazon VPC CNI plugin for Kuberneteskube-proxy、および CoreDNS アドオンはローカルクラスターに自動的にインストールされます。

  • ローカルクラスターでは、Outposts で Amazon EBS を使用する必要があります。お客様の Outpost では、Kubernetes コントロールプレーンストレージに使用できる Amazon EBS が必要です。

  • ローカルクラスターは、Outposts で Amazon EBS を使用します。お客様の Outpost では、Kubernetes コントロールプレーンストレージに使用できる Amazon EBS が必要です。Outposts は、Amazon EBS gp2 ボリュームのみをサポートします。

  • Amazon EBS のバックアップ対象である Kubernetes PersistentVolumes は、Amazon EBS CSI ドライバーを使用してサポートされています。

前提条件

ローカルの Amazon EKS クラスターが作成される時点で、クラスターを作成する IAM プリンシパルが恒久的に追加されています。とりわけ、プリンシパルは管理者として、Kubernetes RBAC 承認テーブルに追加されます。このエンティティには system:masters アクセス許可が付与されています。このエンティティの ID は、クラスター設定には表示されません。したがって、クラスターを作成したエンティティに注意し、削除しないようにすることが重要です。初期状態では、サーバーを作成したプリンシパルのみが、kubectl を使用して Kubernetes API サーバーへのコールを実行することができます。コンソールを使用してクラスターを作成する場合は、クラスター上で kubectl コマンドを実行する際、同じ IAM 認証情報が AWS SDK 認証情報チェーンにあることを確認する必要があります。クラスターの作成が完了したら、他の IAM プリンシパルにクラスターへのアクセスを付与できます。

ローカルの Amazon EKS ローカルクラスターを作成するには

eksctl、AWS Management Console、AWS CLIAmazon EKS APIAWS SDKAWS CloudFormation、または Terraform を使用して、ローカルクラスターを作成できます。

  1. ローカルクラスターを作成する。

    eksctl
    前提条件

    デバイスまたは AWS CloudShell にインストールされている eksctl コマンドラインツールのバージョン 0.172.0 以降。eksctl をインストールまたはアップグレードするには、eksctl ドキュメントの「インストール」を参照してください。

    eksctl を使用してクラスターを作成するには
    1. 次のコンテンツをデバイスにコピーします。次の値を置き換えたら、変更したコマンドを実行して outpost-control-plane.yaml ファイルを作成します。

      • region-code を、クラスターを作成するサポートされている AWS リージョン に置き換えます。

      • my-cluster をクラスターの名前に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字はアルファベット文字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョン および AWS アカウント 内で一意である必要があります。

      • vpc-ExampleID1subnet-ExampleID1 を既存の VPC とサブネットの ID に置き換えます。VPC とサブネットは、Amazon EKS ローカルクラスター VPC およびサブネットの要件と考慮事項 に記載される要件を満たしている必要があります。

      • uniqueid を Outpost の ID に置き換えます。

      • m5.large を、Outpost で使用可能なインスタンスタイプに置き換えます。インスタンスタイプを選択する前に、「容量に関する考慮事項」を参照してください。3 つのコントロールプレーンインスタンスがデプロイされます。この番号を変更することはできません。

      cat >outpost-control-plane.yaml <<EOF apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "1.24" vpc: clusterEndpoints: privateAccess: true id: "vpc-vpc-ExampleID1" subnets: private: outpost-subnet-1: id: "subnet-subnet-ExampleID1" outpost: controlPlaneOutpostARN: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid controlPlaneInstanceType: m5.large EOF

      使用可能なすべてのオプションとデフォルトの完全なリストについては、eksctl ドキュメントの「AWS Outposts サポート」および「設定ファイルスキーマ」を参照してください。

    2. 前のステップで作成した設定ファイルを使用してクラスターを作成します。eksctl は、クラスターをデプロイするために VPC と 1 つのサブネットを Outpost に作成します。

      eksctl create cluster -f outpost-control-plane.yaml

      クラスターのプロビジョニングには数分かかります。クラスターの作成中は、数行の出力が表示されます。出力の最後の行は、次のサンプル行のようになります。

      [✓]  EKS cluster "my-cluster" in "region-code" region is ready
    ヒント

    eksctl を使用してクラスターを作成するときに指定できるほとんどのオプションを表示するには、eksctl create cluster --help コマンドを使用します。使用可能なオプションをすべて表示するには、config ファイルを使用します。詳細については、「eksctl ドキュメント」の「Using config files」(設定ファイルの使用) と「設定ファイルのスキーマ」を参照してください。設定ファイルの例は、GitHub で見つけることができます。

    Eksctl はクラスターを作成した IAM プリンシパル (ユーザーまたはロール) のアクセスエントリを自動的に作成し、クラスター上の Kubernetes オブジェクトに対して IAM プリンシパル管理者にアクセス許可を付与しました。クラスター作成者にクラスター上の Kubernetes オブジェクトへの管理者アクセス権を付与したくない場合は、前の設定ファイルに次のテキストを追加します: bootstrapClusterCreatorAdminPermissions: false (metadatavpc および outpost と同じレベル)。オプションを追加した場合、クラスターの作成後に少なくとも 1 つの IAM プリンシパルのアクセスエントリを作成する必要があります。そうしないと、IAM プリンシパルはクラスター上の Kubernetes オブジェクトにアクセスできなくなります。

    AWS Management Console
    前提条件

    Amazon EKS の要件を満たす既存の VPC とサブネット。詳細については、「Amazon EKS ローカルクラスター VPC およびサブネットの要件と考慮事項」を参照してください。

    AWS Management Console を使用してクラスターを作成するには
    1. 既にローカルクラスター IAM ロールがある場合、または eksctl を使用してクラスターを作成する場合は、このステップはスキップできます。デフォルトでは、eksctl により、ロールが自動的に作成されます。

      1. IAM 信頼ポリシー用の JSON ファイルを作成するには、次のコマンドを実行します。

        cat >eks-local-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
      2. Amazon EKS クラスターの IAM ロールを作成します。IAM ロールを作成するには、ロールを作成する IAM プリンシパルiam:CreateRole アクション (許可) を割り当てる必要があります。

        aws iam create-role --role-name myAmazonEKSLocalClusterRole --assume-role-policy-document file://"eks-local-cluster-role-trust-policy.json"
      3. このロールに、Amazon EKS 管理の IAM ポリシー (AmazonEKSLocalOutpostClusterPolicy) をアタッチします。IAM ポリシーを IAM プリンシパルにアタッチするには、ポリシーのアタッチを行っているプリンシパルに、次のいずれかの IAM アクション (許可) を割り当てる必要があります: iam:AttachUserPolicy または iam:AttachRolePolicy

        aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
    2. Amazon EKS コンソール (https://console.aws.amazon.com/eks/home#/clusters) を開きます。

    3. コンソール画面の上部で、サポートされている AWS リージョン を選択したことを確認します。

    4. [クラスターを追加][作成] の順にクリックします。

    5. [クラスターの設定] ページで、次のフィールドの値を入力または選択します。

      • [Kubernetes コントロールプレーンの位置] - AWS Outposts を選択します。

      • [Outpost ID] - コントロールプレーンを作成する Outpost の ID を選択します。

      • [インスタンスタイプ] - インスタンスタイプを選択します。Outpost で使用可能なインスタンスタイプのみが表示されます。ドロップダウンリストでは、各インスタンスタイプにそのインスタンスタイプに推奨されるノード数が示されています。インスタンスタイプを選択する前に、「容量に関する考慮事項」を参照してください。すべてのレプリカは、同じインスタンスタイプを使用してデプロイされます。クラスターの作成後にインスタンスタイプを変更することはできません。3 つのコントロールプレーンインスタンスがデプロイされます。この番号を変更することはできません。

      • [名前] - クラスターの名前。AWS アカウント内で一意である必要があります。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字はアルファベット文字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョン および AWS アカウント 内で一意である必要があります。

      • Kubernetes バージョン – クラスターで使用する Kubernetes バージョンを選択します。以前のバージョンを使用する必要がない限り、最新バージョンを選択することをお勧めします。

      • [クラスターサービスロール] - AWS リソースを管理することを Kubernetes コントロールプレーンに許可するために、前のステップで作成した Amazon EKS クラスター IAM ロールを選択します。

      • Kubernetes クラスター管理者アクセス — クラスターを作成している IAM プリンシパル (ロールまたはユーザー) にクラスター上の Kubernetes オブジェクトへの管理者アクセス権を付与する場合は、デフォルト (許可) をそのまま使用します。Amazon EKS は IAM プリンシパルのアクセスエントリを作成し、クラスター管理者にそのアクセスエントリに対するアクセス許可を付与します。アクセスエントリの詳細については、「IAM ロールまたはユーザーに Amazon EKS クラスター上の Kubernetes オブジェクトへのアクセスを許可する」を参照してください。

        クラスターを作成するプリンシパルとは異なる IAM プリンシパルに Kubernetes クラスターオブジェクトへの管理者アクセス権を付与したい場合は、拒否のオプションを選択します。クラスターの作成後、アクセスエントリを作成する IAM アクセス許可を持つすべての IAM プリンシパルは、Kubernetes クラスターオブジェクトへのアクセスを必要とするすべての IAM プリンシパルのアクセスエントリを追加できます。必要な IAM アクセス許可の詳細については、サービス認証リファレンスの「Amazon Elastic Kubernetes Service で定義されるアクション」を参照してください。拒否のオプションを選択し、アクセスエントリを作成しない場合、IAM プリンシパルはクラスター上の Kubernetes オブジェクトにアクセスできなくなります。

      • [タグ] - (オプション) クラスターにタグを追加します。詳細については、「Amazon EKS リソースのタグ付け」を参照してください。

      このページを読み終えたら、[次へ] を選択します。

    6. [ネットワーキングの指定] ページで、次のフィールドの値を選択します。

      • [VPC] - 既存の VPC を選択します。VPC には、作成するクラスター、ノード、およびその他の Kubernetes リソースで利用できる十分な数の IP アドレスが必要です。VPC は、VPC の要件と考慮事項 に記載されている要件を満たしている必要があります。

      • [サブネット] - デフォルトで、前のフィールドで指定した VPC 内の利用可能なすべてのサブネットがあらかじめ選択されています。選択するサブネットは サブネットの要件と考慮事項 に記載される要件を満たしている必要があります。

        [セキュリティグループ] - (オプション) Amazon EKS が作成するネットワークインターフェイスに関連付ける 1 つまたは複数のセキュリティグループを指定します。Amazon EKS は、クラスターと VPC 間の通信を可能にするセキュリティグループを自動的に作成します。Amazon EKS は、このセキュリティグループおよびユーザーが選択したセキュリティグループを、作成するネットワークインターフェイスに関連付けます。Amazon EKS が作成するクラスターセキュリティグループの詳細については、「Amazon EKS セキュリティグループの要件および考慮事項」を参照してください。Amazon EKS が作成するクラスターセキュリティグループのルールを変更できます。独自のセキュリティグループを追加することを選択した場合、クラスターの作成後に選択したセキュリティグループを変更することはできません。オンプレミスホストがクラスターエンドポイントと通信するためには、クラスターセキュリティグループからのインバウンドトラフィックを許可する必要があります。入出力のインターネット接続がないクラスター (プライベートクラスターとも呼ばれる) の場合は、次のいずれかを行う必要があります。

        • 必要となる VPC エンドポイントに関連付けられたセキュリティグループを追加します。必要となるエンドポイントの詳細については、AWS のサービス へのサブネットアクセス の「インターフェイス VPC エンドポイント」を参照してください。

        • VPC エンドポイントに関連付けられたセキュリティグループからのトラフィックを許可するように、Amazon EKS が作成したセキュリティグループを変更します。

      このページを読み終えたら、[次へ] を選択します。

    7. [オブザーバビリティの設定] ページでは、有効にする [メトリクス][コントロールプレーンのロギング] オプションをオプションで選択できます。デフォルトでは、それぞれのログタイプは無効化されています。

      このページを読み終えたら、[次へ] を選択します。

    8. [確認と作成] ページで、前のページで入力または選択した情報を確認します。変更する必要がある場合は、[編集] を選択します。そのままでよければ、[作成] を選択します。クラスターがプロビジョニングされている間、[ステータス] フィールドに [作成中] と表示されます。

      クラスターのプロビジョニングには数分かかります。

  2. クラスターを作成すると、作成された Amazon EC2 コントロールプレーンのインスタンスを表示できます。

    aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value}' | grep my-cluster-control-plane

    出力例は次のとおりです。

    "Name": "my-cluster-control-plane-id1"
    "Name": "my-cluster-control-plane-id2"
    "Name": "my-cluster-control-plane-id3"

    各インスタンスは node-role.eks-local.amazonaws.com/control-plane で汚染されているため、コントロールプレーンインスタンスでワークロードがスケジュールされることはありません。テイントの詳細については、Kubernetes ドキュメントの「テイントと容認」を参照してください。Amazon EKS はローカルクラスターの状態を継続的に監視します。セキュリティパッチや問題のあるインスタンスの修復などの自動管理アクションを実行します。ローカルクラスターがクラウドから切断されると、再接続時にクラスターが正常な状態に修復されるようアクションが実行されます。

  3. eksctl を使用してクラスターを作成した場合、このステップはスキップできます。eksctl がこのステップを完了します。新しいコンテキストを kubectl config ファイルに追加して、kubectl がクラスターと通信できるようにします。ファイルを作成し更新する手順については、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照しください。

    aws eks update-kubeconfig --region region-code --name my-cluster

    出力例は次のとおりです。

    Added new context arn:aws:eks:region-code:111122223333:cluster/my-cluster to /home/username/.kube/config
  4. ローカルクラスターの Kubernetes API サーバーに接続するには、サブネットのローカルゲートウェイにアクセスするか、VPC 内から接続します。Outpost ラックをオンプレミスネットワークに接続する方法の詳細については、「AWS Outposts ユーザーガイド」の「How local gateways for racks work」(ラックのローカルゲートウェイの仕組み) を参照してください。ダイレクト VPC ルーティングを使用しており、Outpost サブネットにローカルゲートウェイへのルートがある場合、Kubernetes コントロールプレーンインスタンスのプライベート IP アドレスがローカルネットワークを介して自動的にブロードキャストされます。ローカルクラスターの Kubernetes API サーバーエンドポイントは Amazon Route 53 (Route 53) でホストされます。API サービスエンドポイントは、パブリック DNS サーバーによって Kubernetes API サーバーのプライベート IP アドレスに解決されます。

    ローカルクラスターの Kubernetes コントロールプレーンインスタンスは、クラスターのライフサイクルを通じて変更されない固定プライベート IP アドレスを静的なエラスティックネットワークインターフェイスで構成されます。Kubernetes API サーバーとやり取りするマシンは、ネットワーク接続が切断されている間は Route 53 に接続できない場合があります。このような場合は、操作の継続性を確保するために、静的プライベート IP アドレスを使用して /etc/hosts を構成することをお勧めします。また、ローカル DNS サーバーを設定して Outpost に接続することもお勧めします。詳細については、「AWS Outpostsドキュメント」を参照してください。次のコマンドを実行して、クラスターとの通信が確立されていることを確認します。

    kubectl get svc

    出力例は次のとおりです。

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 28h
  5. (オプション) AWS クラウド から切断された状態のときにローカルクラスターへの認証をテストします。手順については、ネットワーク切断の準備 を参照してください。

内部リソース

Amazon EKS はクラスターで次のリソースを作成します。リソースは、Amazon EKS 内部で使用するためのものです。クラスターが適切に機能しなくなるため、これらのリソースは編集または変更しないでください。

  • 次のミラー Pods:

    • aws-iam-authenticator-node-hostname

    • eks-certificates-controller-node-hostname

    • etcd-node-hostname

    • kube-apiserver-node-hostname

    • kube-controller-manager-node-hostname

    • kube-scheduler-node-hostname

  • 次のセルフマネージド型アドオン:

    • kube-system/coredns

    • kube-system/kube-proxy (最初のノードを追加するまで作成されません)

    • kube-system/aws-node (最初のノードを追加するまで作成されません)。ローカルクラスターは、クラスターネットワークに Amazon VPC CNI plugin for Kubernetes プラグインを使用します。コントロールプレーンインスタンス (名前が aws-node-controlplane-* のポッド) の設定を変更しないでください。プラグインが新しいネットワークインターフェイスを作成したときに、デフォルト値を変更できる設定変数があります。詳細については、GitHub のドキュメントを参照してください。

  • 次のサービス:

    • default/kubernetes

    • kube-system/kube-dns

  • eks.system という名前の PodSecurityPolicy

  • eks:system:podsecuritypolicy という名前の ClusterRole

  • eks:system という名前の ClusterRoleBinding

  • デフォルトの PodSecurityPolicy

  • クラスターセキュリティグループに加えて、Amazon EKS は eks-local-internal-do-not-use-or-edit-cluster-name-uniqueid という名前の AWS アカウント にセキュリティグループを作成します。このセキュリティグループにより、コントロールプレーンインスタンスで実行されている Kubernetes コンポーネント間のトラフィックが自由に流れるようになります。

推奨される次の手順は以下の通りです。