Amazon EKS クラスターのポッドに使用する特定の IP サブネットを選択するにはどうすればよいですか?

所要時間3分
0

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

簡単な説明

ポッドが Amazon EKS クラスターで使用可能なすべてのサブネットを使用しない場合があります。これは、一部のノードサブネットには使用可能な IP アドレスがないにもかかわらず、Amazon Virtual Private Cloud (Amazon VPC) の他のサブネットが十分に活用されていない場合に発生します。

Amazon EKS のノードとポッドは、同じアドレス空間、つまり、クラスター VPC に関連付けられた IP CIDR 範囲の IP アドレスを使用します。具体的には、Amazon EKS は、ポッドがスケジュールされているワーカーノードと同じサブネットからポッドに IP を割り当てます。

例えば、node-1 が subnet-1 で起動したとします。つまり、ノードのプライマリ Elastic Network Interface は subnet-1 にあります。後で、pod-A がデプロイされ、node-1 に対してスケジュールされる可能性があります。デフォルトでは、Amazon VPC CNI プラグインは、subnet-1 でセカンダリ Elastic Network Interface と IP を割り振り、pod-A に IP アドレスを割り当てます。

その結果、ポッドとノードは同じサブネットを使用するため、ユーザーは IP サブネットに対するポッドのカスタム割り振りを直接制御できません。多数のポッドを実行するのに十分なコンピューティング性能がノードにある場合、ポッドはノードサブネット内の使用可能なすべての IP アドレスを使用する可能性があります。ノードサブネットの IP アドレスが枯渇しているため、新しいポッドの実行は失敗します。これは、Amazon VPC 内の他のサブネットに使用可能な IP アドレスがある可能性がある場合であっても発生します。

解決方法

この問題は、Amazon VPC CNI のカスタムネットワーキングコンポーネントを使用して解決できます。この機能により、ポッドで使用する Amazon VPC クラスター内の特定のサブネットを定義できます。これにより、ユーザーのサブネットと、ワーカーノードによって使用されるサブネットが区別されます。さらに、ポッドのセキュリティグループを定義することもできます。カスタムネットワーキングのユースケースの詳細については、「チュートリアル: カスタムネットワーキング」を参照してください。

前提条件

開始する前に、次を実行します。

ベストプラクティスとして、クラスターで Amazon VPC CNI プラグインの最新バージョンを実行していることを確認してください。Amazon VPC クラスターのバージョンを確認するには、次のコマンドを実行します。

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

注: 使用するのに最適なバージョンの詳細については、「Updating the Amazon VPC CNI plugin for self-managed add-on」(セルフマネージドアドオン用 Amazon VPC CNI プラグインの更新) を参照してください。

カスタムサブネットと IP の範囲を設定する

Amazon VPC CNI カスタムネットワーキング機能を使用するには、次のステップに従います。

1.    Amazon VPC CNI カスタムネットワーキング機能をオンにします。

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

2.    ENIConfig オブジェクトを作成して、ポッドが使用するサブネットとセキュリティグループを定義します。

ENIConfig オブジェクトは、1 つのサブネットとセキュリティグループのリストを定義します。1 つの ENIConfig オブジェクトのみでノードが注釈またはラベル付けされている場合、そのノードに対してスケジュールされるすべてのポッドは、その ENIConfig オブジェクトで定義されるサブネットとセキュリティグループを使用します。

ENIConfig オブジェクトをノードに自動または手動で関連付けることができます。

ENIConfig オブジェクトをノードに自動的に関連付ける

このオプションでは、アベイラビリティーゾーン (AZ) ごとに 1 つの ENIConfig オブジェクト (1 つのサブネット) しか使用できません。ENIConfig 名は AZ の名前である必要があります。

1.    AZ 名を使用して ENIConfig オブジェクトを作成します。

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2b
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-YYYYYYYYY
EOF

2.    Amazon VPC-CNI を有効にすると、ノード AZ と一致する ENIConfig オブジェクトを使用してノードに自動的にラベルを付けることができます。

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

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

このオプションでは、アベイラビリティーゾーンごとに複数の ENIConfig オブジェクトを使用できます。各 ENIConfig オブジェクトにはカスタム名を使用できることに留意してください。ノードと、関連付けられている ENIConfig オブジェクトが、同じアベイラビリティーゾーンにあることを確認してください。

注: 1 つの ENIConfig オブジェクトを使用して注釈を付けることができるのは 1 つのノードだけですが、同じ ENIConfig オブジェクトを使用して複数のノードに注釈を付けることができます。

1.    次のように、カスタム名を使用して ENIConfig オブジェクトを作成します。

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-1-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-2-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-ZZZZZZZZZZ
EOF

2.    ENIConfig オブジェクトを使用してノードに手動で注釈を付けます。ノードと、関連付けられている ENIConfig オブジェクトのサブネットが、同じアベイラビリティーゾーンにあることを確認してください。

kubectl annotate node ip-192-168-0-126.us-east-2.compute.internal k8s.amazonaws.com/eniConfig=my-conf-1-us-east-2a

この手動注釈は、Amazon VPC CNI によって自動的に追加されたラベルに優先します。

新しいノードを起動して現在のワーカーノードを置き換える

Amazon VPC CNI でカスタムネットワーキング機能をオンにする前に、既存のワーカーノードはノードサブネットのセカンダリ Elastic Network Interface と IP を備えている場合があります。このため、新しいノードを起動して、ノードに関連付けられている ENIConfig オブジェクトで定義されるサブネットから、セカンダリ Elastic Network Interface と IP を割り振ることができるようにする必要があります

1.    次のノードグループオプションのいずれかを使用しているかどうかを確認します。

  • セルフマネージドノードグループ
  • カスタム AMI ID を持つマネージドノードグループ

注: これらのタイプのノードグループでノードを作成する場合は、ステップ 2 に進んで、ノードの最大ポッド数を手動で定義します。カスタム AMI を指定せずにマネージドノードグループのノードを起動する場合、Amazon EKS はノードの最大ポッド数を自動的に更新します。詳細については、「マネージド型ノードグループ」を参照してください。

2.    ノードあたりの最大ポッド数を決定します。カスタムネットワーキングを使用する場合、ノードのプライマリネットワークインターフェイスはポッド IP には使用されません。最大ポッド数計算スクリプトを使用して最大ポッド数の値を決定するには、「各 EC2 インスタンスタイプの Amazon EKS 推奨最大 pods 数」を参照してください。

注: 独自のインスタンス以外のインスタンスにあるサブネットでポッドを起動するには、上記のスクリプトで cni-custom-networking-enabled フラグを使用してください。

3.    新しいノードの User Data スクリプトを更新して、必要なフラグを含めます。例:

#!/bin/bash
/etc/eks/bootstrap.sh my_cluster_name --use-max-pods false --kubelet-extra-args '--max-pods=20'

注: my_cluster_name を自分の EKS クラスター名に置き換えてください。ブートストラップ機能の詳細については、GitHub ウェブサイトの「awslabs/amazon-eks-ami」を参照してください。

4.    ポッドを再作成して、新しいポッドのカスタムネットワーキング設定を使用します。

その他の考慮事項

  • デフォルトでは、ポッドからクラスター VPC CIDR の外部の IP アドレスへのトラフィックは、ノードのメインインターフェイスと IP アドレスを使用します。したがって、このトラフィックは ENIConfig で定義されているサブネットとセキュリティグループを使用しません。代わりに、トラフィックは、ノードのプライマリネットワークインターフェイスのセキュリティグループとサブネットを使用します。詳細については、「pods の SNAT」を参照してください。
  • ポッドにもセキュリティグループを使用する場合、SecurityGroupPolicy で指定されているセキュリティグループが、ENIConfig オブジェクトで指定されているセキュリティグループの代わりに使用されます**。**
  • GitHub ウェブサイトの最新情報については、「Simplify CNI custom networking」(CNI カスタムネットワーキングの簡素化) を参照してください。
  • VPC に IP CIDR 範囲をさらに追加するには、「Amazon EKS で複数の CIDR 範囲を使用するにはどうすればよいですか?」のステップに従ってください。

AWS公式
AWS公式更新しました 1年前
コメントはありません