高可用性を実現するために AWS Outposts でローカル Amazon EKS クラスターを作成する
ローカルクラスターを使用すると、Amazon EKS クラスターすべてを AWS Outposts でローカルに実行できます。これにより、クラウドへの一時的なネットワーク切断によって生じる可能性のあるアプリケーションダウンタイムのリスクを軽減できます。このような接断は、ファイバーの切断や天候によって発生する可能性があります。Kubernetes クラスター全体が Outposts でローカルに実行されるため、アプリケーションは引き続き使用できます。クラウドへのネットワーク切断中にクラスターオペレーションを実行できます。詳細については、「AWS Outposts でローカル Amazon EKS クラスターを準備して、ネットワークの切断に備える」を参照してください。次の図は、ローカルクラスターのデプロイを示しています。
ローカルクラスターは一般的に Outposts ラックで使用できます。
AWS でサポートされているリージョン
ローカルクラスターを作成できる AWS リージョンは、米国東部 (オハイオ)、米国東部 (バージニア北部)、米国西部 (北カリフォルニア)、米国西部 (オレゴン)、アジアパシフィック (ソウル)、アジアパシフィック (シンガポール)、アジアパシフィック (シドニー)、アジアパシフィック (東京)、カナダ (中部)、欧州 (フランクフルト)、欧州 (アイルランド)、欧州 (ロンドン)、中東 (バーレーン)、南米 (サンパウロ) です。サポートされる機能の詳細については、「デプロイオプションの比較」を参照してください。
トピック
Amazon EKS ローカルクラスターを作成します。
このページで説明されている以下のツールを使用して、ローカルクラスターを作成できます。
AWS CLI、Amazon EKS API、AWS SDK
eksctl
eksctl
を使用してローカルクラスターを作成するには
-
デバイスまたは AWS CloudShell に
eksctl
コマンドラインツールのバージョン0.194.0
以降をインストールします。eksctl
をインストールまたはアップグレードするには、eksctl
ドキュメントの「インストール」を参照してください。 -
次のコンテンツをデバイスにコピーします。次の値を置き換えたら、変更したコマンドを実行して
outpost-control-plane.yaml
ファイルを作成します。-
region-code
は、クラスターを作成する サポートされている AWS リージョンに置き換えます。 -
my-cluster
の部分は、自分のクラスター名に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。 -
vpc-ExampleID1
とsubnet-ExampleID1
を既存の VPC とサブネットの ID に置き換えます。VPC とサブネットは、AWS Outposts で Amazon EKS クラスターの VPC とサブネットを作成するの要件を満たす必要があります。 -
uniqueid
を Outpost の ID に置き換えます。 -
m5.large
を Outpost で使用可能なインスタンスタイプに置き換えます。インスタンスタイプを選択する前に、「キャパシティに関する考慮事項に基づいて、AWS Outposts で Amazon EKS クラスターのインスタンスタイプとプレイスメントグループを選択する」を参照してください。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 サポート」および「設定ファイルスキーマ 」を参照してください。
-
-
前のステップで作成した設定ファイルを使用してクラスターを作成します。
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
(metadata
、vpc
およびoutpost
と同じレベル)。オプションを追加した場合、クラスターの作成後に少なくとも 1 つの IAM プリンシパルのアクセスエントリを作成する必要があります。そうしないと、IAM プリンシパルはクラスター上の Kubernetes オブジェクトにアクセスできなくなります。
AWS Management Console
AWS Management Console を使用してクラスターを作成するには
-
Amazon EKS の要件を満たす既存の VPC とサブネットが必要です。詳細については、「AWS Outposts で Amazon EKS クラスターの VPC とサブネットを作成する」を参照してください。
-
既にローカルクラスター IAM ロールがある場合、または
eksctl
を使用してクラスターを作成する場合は、このステップはスキップできます。デフォルトでは、eksctl
により、ロールが自動的に作成されます。-
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
-
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"
-
AmazonEKSLocalOutpostClusterPolicy という名前の Amazon EKS マネージド型ポリシーをロールにアタッチします。IAM ポリシーを IAM プリンシパルにアタッチするには、ポリシーのアタッチを行っているプリンシパルに、次のいずれかの IAM アクション (許可) を割り当てる必要があります:
iam:AttachUserPolicy
またはiam:AttachRolePolicy
。aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
-
-
Amazon EKS コンソール
を開きます。 -
コンソール画面の上部で、サポートされている AWS リージョン を選択したことを確認します。
-
[クラスターを追加]、[作成] の順にクリックします。
-
[クラスターの設定] ページで、次のフィールドの値を入力または選択します。
-
Kubernetes コントロールプレーンの場所 – AWS Outposts を選択します。
-
[Outpost ID] - コントロールプレーンを作成する Outpost の ID を選択します。
-
[インスタンスタイプ] - インスタンスタイプを選択します。Outpost で使用可能なインスタンスタイプのみが表示されます。ドロップダウンリストでは、各インスタンスタイプにそのインスタンスタイプに推奨されるノード数が示されています。インスタンスタイプを選択する前に、「キャパシティに関する考慮事項に基づいて、AWS Outposts で Amazon EKS クラスターのインスタンスタイプとプレイスメントグループを選択する」を参照してください。すべてのレプリカは、同じインスタンスタイプを使用してデプロイされます。クラスターの作成後にインスタンスタイプを変更することはできません。3 つのコントロールプレーンインスタンスがデプロイされます。この番号を変更することはできません。
-
[名前] - クラスターの名前。AWS アカウント内で一意にする必要があります。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。
-
Kubernetes バージョン – クラスターで使用する Kubernetes バージョンを選択します。以前のバージョンを使用する必要がない限り、最新バージョンを選択することをお勧めします。
-
[クラスターサービスロール] - AWS リソースを管理することを Kubernetes コントロールプレーンに許可するために、前のステップで作成した Amazon EKS クラスター IAM ロールを選択します。
-
Kubernetes クラスター管理者アクセス — クラスターを作成している IAM プリンシパル (ロールまたはユーザー) にクラスター上の Kubernetes オブジェクトへの管理者アクセス権を付与する場合は、デフォルト (許可) をそのまま使用します。Amazon EKS は IAM プリンシパルのアクセスエントリを作成し、クラスター管理者にそのアクセスエントリに対するアクセス許可を付与します。アクセスエントリの詳細については、「EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する」を参照してください。
クラスターを作成するプリンシパルとは異なる IAM プリンシパルに Kubernetes クラスターオブジェクトへの管理者アクセス権を付与したい場合は、拒否のオプションを選択します。クラスターの作成後、アクセスエントリを作成する IAM アクセス許可を持つすべての IAM プリンシパルは、Kubernetes クラスターオブジェクトへのアクセスを必要とするすべての IAM プリンシパルのアクセスエントリを追加できます。必要な IAM アクセス許可の詳細については、サービス認可リファレンスの「Amazon Elastic Kubernetes Service で定義されるアクション」を参照してください。拒否のオプションを選択し、アクセスエントリを作成しない場合、IAM プリンシパルはクラスター上の Kubernetes オブジェクトにアクセスできなくなります。
-
[タグ] - (オプション) クラスターにタグを追加します。詳細については、「タグを使用して Amazon EKS リソースを整理する」を参照してください。このページを読み終えたら、[次へ] を選択します。
-
-
[ネットワーキングの指定] ページで、次のフィールドの値を選択します。
-
[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 が作成したセキュリティグループを変更します。このページを読み終えたら、[次へ] を選択します。
-
-
-
[オブザーバビリティの設定] ページでは、有効にする [メトリクス] と [コントロールプレーンのロギング] オプションをオプションで選択できます。デフォルトでは、それぞれのログタイプは無効化されています。
-
Prometheus メトリクスオプションの追加についての詳細は、「ステップ 1: Prometheus メトリクスをオンにする」を参照してください。
-
「コントロールプレーン」に関する詳細に関しては、「コントロールプレーンログを CloudWatch Logs に送信する」を参照してください。このページを読み終えたら、[次へ] を選択します。
-
-
[確認と作成] ページで、前のページで入力または選択した情報を確認します。変更する必要がある場合は、[編集] を選択します。そのままでよければ、[作成] を選択します。クラスターがプロビジョニングされている間、[ステータス] フィールドに [作成中] と表示されます。
クラスターのプロビジョニングには数分かかります。
Amazon EKS ローカルクラスターを表示する
-
クラスターを作成すると、作成された 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 はローカルクラスターの状態を継続的に監視します。セキュリティパッチや問題のあるインスタンスの修復などの自動管理アクションを実行します。ローカルクラスターがクラウドから切断されると、再接続時にクラスターが正常な状態に修復されるようアクションが実行されます。 -
eksctl
を使用してクラスターを作成した場合、このステップはスキップできます。eksctl
がこのステップを完了します。新しいコンテキストをkubectl
config
ファイルに追加して、kubectl
がクラスターと通信できるようにします。ファイルを作成し更新する手順については、「kubeconfig ファイルを作成して kubectl を EKS クラスターに接続する」を参照しください。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
-
ローカルクラスターの 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
-
(オプション) AWS Cloud から切断された状態のときにローカルクラスターへの認証をテストします。手順については、AWS Outposts でローカル Amazon EKS クラスターを準備して、ネットワークの切断に備える を参照してください。
内部リソース
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-
という名前の AWS アカウントにセキュリティグループを作成します。このセキュリティグループにより、コントロールプレーンインスタンスで実行されている Kubernetes コンポーネント間のトラフィックが自由に流れるようになります。cluster-name
-uniqueid
推奨される次の手順は以下の通りです。
-
クラスターを作成した IAM プリンシパルに、AWS Management Console 内の Kubernetes リソースを表示するために必要な許可を付与する
-
IAM エンティティにクラスターへのアクセスを許可する。エンティティに Amazon EKS コンソールで Kubernetes リソースを表示させる場合は、必要なアクセス許可をエンティティに付与します。
-
ネットワークの切断中に何が起こるかをよく理解してください。
-
etcd
のバックアップ計画を設定することを検討してください。Amazon EKS は、ローカルクラスターのetcd
の自動バックアップと復元をサポートしていません。詳細については、「Kubernetes ドキュメント」の「etcd クラスターのバックアップ」を参照してください。2 つの主なオプションは、 etcdctl
を使用してスナップショットの作成を自動化する、または Amazon EBS ストレージボリュームのバックアップを使用することです。