Amazon EKS のノードクラスを作成する - アマゾン EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

Amazon EKS のノードクラスを作成する

Amazon EKS ノードクラスは、EKS Auto Mode マネージドノードの設定をきめ細かく制御できるテンプレートです。ノードクラスは、ネットワーク設定、ストレージ設定、リソースタグ付けなど、EKS クラスター内のノードのグループに適用されるインフラストラクチャレベルの設定を定義します。このトピックでは、特定の運用要件を満たすようにノードクラスを作成および設定する方法について説明します。

EKS Auto Mode がデフォルト設定を超えて EC2 インスタンスをプロビジョニングおよび設定する方法をカスタマイズする必要がある場合は、ノードクラスを作成すると、重要なインフラストラクチャパラメータを正確に制御できます。例えば、セキュリティを強化するためにプライベートサブネットの配置を指定したり、パフォーマンス重視のワークロード用にインスタンスエフェメラルストレージを設定したり、コスト配分のためにカスタムタグ付けを適用したりできます。

ノードクラスを作成する

NodeClass を作成するには、次の手順に従います。

  1. 自分のノードクラス設定で YAML ファイル (nodeclass.yaml など) を作成します

  2. kubectl を使用してこの設定をクラスターに適用します

  3. ノードプール設定でノードクラスを参照します。詳細については、「EKS 自動モードl 用のノードプールを作成する」を参照してください。

kubectl がインストールおよび設定されている必要があります。詳細については、「Amazon EKS を使用するようにセットアップする」を参照してください。

基本的なノードクラスの例

ノードクラスの例を次に示します。

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: private-compute spec: ephemeralStorage: size: "160Gi"

この NodeClass により、ノード上のエフェメラルストレージの量が増加します。

次を使用してこの設定を適用します。

kubectl apply -f nodeclass.yaml

次に、ノードプール設定でノードクラスを参照します。詳細については、「EKS 自動モードl 用のノードプールを作成する」を参照してください。

ノードクラスのアクセスエントリを作成する

カスタムノードクラスを作成する場合は、ノードがクラスターに参加できるように EKS アクセスエントリを作成する必要があります。組み込みのノードクラスとノードプールを使用すると、EKS によってアクセスエントリが自動的に作成されます。

アクセスエントリがどのように機能するかについては、「EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する」を参照してください。

EKS Auto Mode ノードクラスのアクセスエントリを作成するときは、EC2 のアクセスエントリタイプを使用する必要があります。

CLI でアクセスエントリを作成する

EC2 ノードのアクセスエントリを作成して EKS Auto Node ポリシーを関連付けるには:

次の CLI コマンドを、使用するクラスター名とノードロール ARN で更新します。ノードロール ARN は、ノードクラス YAML で指定されます。

# Create the access entry for EC2 nodes aws eks create-access-entry \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --type EC2 # Associate the auto node policy aws eks associate-access-policy \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy \ --access-scope type=cluster

CloudFormation でアクセスエントリを作成する

EC2 ノードのアクセスエントリを作成して EKS Auto Node ポリシーを関連付けるには:

次の CloudFormation を、使用するクラスター名とノードロール ARN で更新します。ノードロール ARN は、ノードクラス YAML で指定されます。

EKSAutoNodeRoleAccessEntry: Type: AWS::EKS::AccessEntry Properties: ClusterName: <cluster-name> PrincipalArn: <node-role-arn> Type: "EC2" AccessPolicies: - AccessScope: Type: cluster PolicyArn: arn:aws:eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy DependsOn: [ <cluster-name> ] # previously defined in CloudFormation

CloudFormation スタックのデプロイの詳細については、「Getting started with CloudFormation」を参照してください

ノードクラスの指定

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: my-node-class spec: # Required fields role: MyNodeRole # IAM role for EC2 instances subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" # Alternative using direct subnet ID # - id: "subnet-0123456789abcdef0" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Alternative approaches: # - id: "sg-0123456789abcdef0" # - name: "eks-cluster-security-group" # Optional: Pod subnet selector for advanced networking podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" # Alternative using direct subnet ID # - id: "subnet-0987654321fedcba0" # Optional fields snatPolicy: Random # or Disabled networkPolicy: DefaultAllow # or DefaultDeny networkPolicyEventLogs: Disabled # or Enabled ephemeralStorage: size: "80Gi" # Range: 1-59000Gi or 1-64000G or 1-58Ti or 1-64T iops: 3000 # Range: 3000-16000 throughput: 125 # Range: 125-1000 # Optional KMS key for encryption kmsKeyID: "arn:aws:kms:region:account:key/key-id" # Accepted formats: # KMS Key ID # KMS Key ARN # Key Alias Name # Key Alias ARN # Optional: Forward proxy, commonly requires certificateBundles as well #for EC2, see https://repost.aws/knowledge-center/eks-http-proxy-containerd-automation advancedNetworking: httpsProxy: http://192.0.2.4:3128 #commonly port 3128 (Squid) or 8080 (NGINX) #Max 255 characters #httpsProxy: http://[2001:db8::4]:3128 # IPv6 address with port, use [] noProxy: #Max 50 entries - localhost #Max 255 characters each - 127.0.0.1 #- ::1 # IPv6 localhost #- 0:0:0:0:0:0:0:1 # IPv6 localhost - 169.254.169.254 # EC2 Instance Metadata Service #- [fd00:ec2::254] # IPv6 EC2 Instance Metadata Service # Domains to exclude, put all VPC endpoints here - .internal - .eks.amazonaws.com # Optional: Custom certificate bundles. certificateBundles: - name: "custom-cert" data: "base64-encoded-cert-data" # Optional: Additional EC2 tags (with restrictions) tags: Environment: "production" Team: "platform" # Note: Cannot use restricted tags like: # - kubernetes.io/cluster/* # - karpenter.sh/provisioner-name # - karpenter.sh/nodepool # - karpenter.sh/nodeclaim # - karpenter.sh/managed-by # - eks.amazonaws.com/nodeclass

考慮事項

  • ノード IAM ロールの置換 - NodeClass に関連付けられているノード IAM ロールを変更する場合は、新しいアクセスエントリを作成する必要があります。EKS は、クラスターの作成時にノード IAM ロールのアクセスエントリを自動的に作成します。ノード IAM ロールには AmazonEKSAutoNodePolicy EKS アクセスポリシーが必要です。詳細については、「EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する」を参照してください。

  • 最大ポッド密度 - EKS では、ノード上のポッドの最大数が 110 に制限されます。この制限は、既存の最大ポッド計算の後に適用されます。詳細については、「最適な Amazon EC2 ノードインスタンスタイプを選択する」を参照してください。

  • タグ - Kubernetes から EC2 にタグを伝播させる場合は、追加の IAM アクセス許可を設定する必要があります。詳細については、「EKS Auto Mode での ID とアクセスについての説明」を参照してください。

  • デフォルトのノードクラス - カスタムノードクラスに default という名前を付けないでください。これは、EKS Auto Mode には、少なくとも 1 つの組み込み NodePool を有効にすると自動的にプロビジョニングされる default と呼ばれる NodeClass が含まれるためです。組み込み NodePools を有効にする方法については、「組み込み NodePool を有効または無効にする」を参照してください。

  • 複数のサブネットを使用した subnetSelectorTerms 動作 - subnetSelectorTerms 条件に一致するサブネットまたは ID で指定したサブネットが複数ある場合、EKS Auto Mode はサブネット全体に分散されたノードを作成します。

    • サブネットが異なるアベイラビリティーゾーン (AZ) にある場合、ポッドトポロジスプレッド制約Topology Aware Routing などの Kubernetes 機能を使用して、ポッドとトラフィックをそれぞれゾーン間で分散できます。

    • 同じ AZ 内に subnetSelectorTerms に一致するサブネットが複数ある場合、EKS Auto Mode はその AZ のサブネット全体に分散された各ノードにポッドを作成します。EKS Auto Mode は、同じ AZ 内の他のサブネットの各ノードにセカンダリネットワークインターフェイスを作成します。各サブネットで使用可能な IP アドレスの数に基づいて選択し、サブネットをより効率的に使用します。ただし、EKS Auto Mode が各ポッドに使用するサブネットを指定することはできません。特定のサブネットでポッドを実行する必要がある場合は、代わりに ポッドのサブネット選択 を使用します。

ポッドのサブネット選択

podSubnetSelectorTermspodSecurityGroupSelectorTerms フィールドは、ポッドをノードとは異なるサブネットで実行できるようにすることで、高度なネットワーク設定を可能にします。この分離により、ネットワークトラフィックのルーティングとセキュリティポリシーの制御が強化されます。podSecurityGroupSelectorTerms には podSubnetSelectorTerms が必要であることに注意してください。

ユースケース

次の場合に podSubnetSelectorTerms を使用します:

  • インフラストラクチャトラフィック (ノード間の通信) とアプリケーショントラフィック (ポッド間の通信) を分離する

  • ポッドサブネットとは異なるネットワーク設定をノードサブネットに適用する。

  • ノードとポッドに異なるセキュリティポリシーまたはルーティングルールを実装する。

  • ポッドトラフィックに影響を与えずに、ノードトラフィック専用のリバースプロキシまたはネットワークフィルタリングを設定する。advancedNetworkingcertificateBundles を使用して、リバースプロキシと、プロキシの自己署名証明書またはプライベート証明書を定義する。

設定例

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole # Subnets for EC2 instances (nodes) subnetSelectorTerms: - tags: Name: "node-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Separate subnets for pods podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" podSecurityGroupSelectorTerms: - tags: Name: "eks-pod-sg"

ポッドのサブネットセレクタに関する考慮事項

  • ポッド密度の低下: podSubnetSelectorTerms を使用する場合、ノードのプライマリネットワークインターフェイスがノードサブネットにあり、ポッドサブネット内のポッドに使用できないため、各ノードで実行できるポッドが少なくなります。

  • サブネットセレクタの制限: 標準 subnetSelectorTerms および securityGroupSelectorTerms 設定は、ポッドサブネットの選択には適用されません。

  • ネットワーク計画: ワークロード要件をサポートするために、ノードサブネットとポッドサブネットの両方に十分な IP アドレススペースを確保します。

  • ルーティング設定: ポッドサブネットのルートテーブルとネットワークアクセスコントロールリスト (ACL) が、ノードとポッドサブネット間の通信用に正しく設定されていることを確認します。