スキップしてコンテンツを表示

Amazon EKS クラスターのポッドに特定の IP アドレスサブネットを指定する方法を教えてください。

所要時間2分
0

Amazon Elastic Kubernetes Service (Amazon EKS) において、ポッドにカスタムサブネットまたは IP アドレス範囲を指定したいと考えています。

解決策

ワーカーノードのサブネットとは異なるサブネットに属するポッドの IP アドレスを割り当てるには、カスタムネットワークを使用します。

カスタムネットワークを有効にする

カスタムネットワークを構成する前に、次のデフォルト動作を確認します。

  • ノードとポッドには、Amazon 仮想プライベートクラウド (VPC) クラスターと同じ CIDR 範囲の IP アドレスが割り当てられます。Amazon VPC に追加の IP アドレス CIDR 範囲を割り当てる方法については、「Amazon EKS で複数の CIDR 範囲を指定する方法を教えてください」を参照してください。
  • Amazon EKS は、ワーカーノードのサブネットに属するポッドの IP アドレスを割り当てます。
  • どのサブネットにより、ポッドに IP アドレスが割り当てられるかを制御することはできません。
  • ノードのサブネットに使用可能な IP アドレスがない場合は、他のサブネットに空きアドレスが存在する場合も、新しくポッドを起動することはできません。
  • ポッドから Amazon VPC クラスターの CIDR ブロック外の IP アドレスに対するすべてのトラフィックは、ノードのメインインターフェイスと IP アドレスを使用します。このトラフィックは、ノードのプライマリ Elastic ネットワークインターフェイスに属するセキュリティグループとサブネットを使用します。ENIConfig オブジェクトで定義したサブネットとセキュリティグループは使用されません。
  • ポッドにセキュリティグループを使用する場合、そのポッドは SecurityGroupPolicy で指定したセキュリティグループを使用します。ENIConfig オブジェクトで指定したセキュリティグループは、ポッドでは使用されません。
    注: ポッドのトラフィックルーティングに関する詳細については、「ポッドの外向きインターネットアクセスを有効にする」を参照してください。

Kubernets の Amazon VPC Container Network Interface (Amazon VPC CNI) プラグインでカスタムネットワークを有効化します。使用する Kubernetes バージョンに一致する Amazon VPC CNI プラグインバージョンを使用してください。プラグインへのアクセスについては、GitHub のウェブサイトで amazon-vpc-cni-k8s を参照してください。

次のコマンドを実行して Amazon VPC クラスターにおけるバージョンを確認します。

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

プラグインのバージョンが適切でない場合は、Amazon VPC CNI を更新します。

次のコマンドを実行してカスタムネットワークを有効にします。

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

VPC CNI v1.18 以降のバージョンでは、自動サブネット検出と、利用可能な複数のサブネットにおける IP アドレス使用率に基づく動的アドレス割り当てがサポートされています。詳細については、「Amazon VPC CNI に強化されたサブネット検出が導入されました」を参照してください。

Amazon VPC CNI プラグインでは、次の操作も可能です。

  • ポッドに使用する Amazon VPC サブネットを指定する。
  • 各ポッドに個別のセキュリティグループを定義する。

ENIConfig オブジェクトを作成する

ENIConfig オブジェクトを作成する前に、次のデフォルト動作を確認します。

  • ENIConfig オブジェクトにより、1 つのサブネットとセキュリティグループのリストが定義される。
  • 各ノードには、1 つの ENIConfig オブジェクトのみを割り当てられます。ただし、同じ ENIConfig オブジェクトを複数のノードに割り当てることは可能です。
  • ノードに ENIConfig オブジェクトを割り当てると、そのノードに対してスケジュールされたポッドには、ENIConfig オブジェクト内のサブネットとセキュリティグループが割り当てられます。
  • ENIConfig オブジェクトの名前は、アベイラビリティーゾーンの名前である必要があります。

ENIConfig オブジェクトの作成には、次のコマンドを実行します。

cat EOF | kubectl apply -f -  
apiVersion: crd.k8s.amazonaws.com/v1alpha1  
kind: ENIConfig  
metadata:  
  name: example-availability-zone  
spec:  
  securityGroups:   
    - example-security-group-id  
  subnet: example-subnet-id  
EOF

注: example-availability-zone を目的のアベイラビリティーゾーンに置き換えてください。example-security-group-id をセキュリティグループの ID に置き換えてください。example-subnet-id をサブネットの ID に置き換えてください。

ENIConfig オブジェクトを割り当てる

単一の ENIConfig オブジェクトをアベイラビリティーゾーンに割り当てる場合は、その ENIConfig オブジェクトはノードに自動で割り当てられます。複数の ENIConfig オブジェクトを同じアベイラビリティーゾーンに関連付ける場合は、各 ENIConfig オブジェクトを手動で割り当てます。

ENIConfig オブジェクトを自動で割り当てる

次のコマンドを実行します。

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

ENIConfig オブジェクトを手動で関連付ける

重要: ノードおよび、関連付けられた ENIConfig オブジェクトのノードとサブネットは、同じアベイラビリティーゾーンに存在する必要があります。

次のコマンドを実行します。

kubectl annotate node example-node-name k8s.amazonaws.com/eniConfig=example-availability-zone

注: example-node-name をノードの完全な識別子に置き換えてください。example-availability-zoneENIConfig オブジェクトの作成時に使用したアベイラビリティーゾーン名に置き換えてください。

新しいノードを起動する

ENIConfig サブネットからセカンダリネットワークインターフェイスと IP アドレスを割り当てるには、新しいノードを起動する必要があります。既存のノードは、置き換えられるまで元のネットワーク構成を引き続き使用します。

次の手順を実行します。

  1. セルフマネージドノードグループのマネージドノードグループでカスタム Amazon マシンイメージ (AMI) ID を使用しているかどうかを確認します。
  2. カスタム AMI ID を使用する場合は、各ノード値の最大ポッド数を判断します。max-pods-calculator.sh スクリプトの実行時には、--cni-custom-networking-enabled パラメータを追加する必要があります。
    注: 起動テンプレートや AMI ID を指定しない場合、Amazon EKS によりポッドの最大数が自動で設定されます。
  3. 新しいノードのユーザーデータスクリプトを更新し、オペレーティングシステム (OS) に応じた最大数のポッドを使用するよう設定します。
    Amazon Linux 2、Bottlerocket、Ubuntu 20.04 以降、Windows Server 2019 以降
    #!/bin/bash  
    /etc/eks/bootstrap.sh example-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=example-max-pods'
    --user-data '#!/bin/bash /etc/eks/nodeadm init \ --container-runtime containerd \ --cluster-name example-cluster-name \ --max-pods example-max-pods'
    注: 上記のコマンドにおいて、example-cluster-name を EKS クラスター名に置き換えてください。example-max-pods をノードあたりの最大ポッド数の値に置き換えてください。
    bootstrap の詳細については、GitHub のウェブサイトで awslabs/amazon-eks-ami を参照してください。nodeadm の詳細については、「Amazon Linux 2 から Amazon Linux 2023 へのアップグレード」を参照してください。
    Amazon Linux 2023 (AL2023)
  4. ポッドを再作成し、新しいカスタムネットワーク構成を適用します
AWS公式更新しました 3ヶ月前
コメントはありません

関連するコンテンツ