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 管理アクションでは存続しません。

  • ローカルクラスターは、Kubernetes バージョン 1.21 のみをサポートします。

  • ローカルクラスターは、自己管理型アドオンと自己管理型 Amazon Linux 2 ノードグループをサポートします。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 は、クラスター設定には表示されません。したがって、クラスターを作成したエンティティに注意し、削除しないようにすることが重要です。初期状態では、サーバーを作成した IAM エンティティのみが、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.114.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.21 vpc: clusterEndpoints: privateAccess: true id: "vpc-vpc-ExampleID1" subnets: private: outpost-subnet-1: id: "subnet-subnet-ExampleID1" outposts: controlPlaneOutpostArn: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid controlPlaneInstanceType: m5.large

      使用可能なすべてのオプションとデフォルトの完全なリストについては、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 で見つけることができます。

    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 アクション (アクセス許可) を割り当てる必要があります: 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 アクション (アクセス許可) を割り当てる必要があります: 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. [Add cluster] (クラスターを追加)、[Create] (作成) の順にクリックします。

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

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

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

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

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

      • [Kubernetes version] (Kubernetes バージョン) - バージョン 1.21 のみが使用可能です。

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

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

    6. [Next (次へ)] を選択します。

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

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

      • [Subnets] (サブネット) – デフォルトで、前のフィールドで指定した VPC 内の利用可能なすべてのサブネットがあらかじめ選択されています。選択するサブネットは サブネットの要件と考慮事項 に記載される要件を満たしている必要があります。クラスターの作成後は、使用するサブネットを変更できません。

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

    8. [Next (次へ)] を選択します。

    9. [ログ記録の構成] ページで、有効にするログタイプをオプションで選択できます。各ログタイプは、デフォルトで [無効] になっています。別のオプションを選択する前に、Amazon EKS コントロールプレーンのログ記録 の情報をよく理解してください。クラスターの作成後に、このオプションを変更できます。

    10. [Next (次へ)] を選択します。

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

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

  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) でホストされており、パブリック DNS サーバーによって Kubernetes API サーバーのプライベート IP アドレスに解決されます。

    ローカルクラスターの Kubernetes コントロールプレーンインスタンスは、クラスターのライフサイクルを通じて変更されない固定プライベート IP アドレスを持つ静的なエラスティックネットワークインターフェイスで構成されます。Kubernetes API サーバーとやり取りするマシンが、ネットワーク切断中に Route 53 に接続できない可能性がある場合、オペレーションを継続するために静的なプライベート IP アドレスで /etc/hosts を構成することをお勧めします。また、AWS Outposts ドキュメントで定義されているように、ローカル DNS サーバーを設定し、それらを Outpost に接続することをお勧めします。次のコマンドを実行して、クラスターとの通信を確認します。

    kubectl get svc

    出力例を次に示します。

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 28h
  5. (オプション) Outpost で稼働している本番サービスがなく、AWS クラウド から切断された状態のときにローカルクラスターへの認証をテストする場合は、「ネットワーク切断の準備」を参照してください。

内部リソース

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

  • 次のミラーポッド:

    • 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 コンポーネント間のトラフィックが自由に流れるようになります。

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