CNI カスタムネットワーク - Amazon EKS

CNI カスタムネットワーク

デフォルトでは、新しいネットワークインターフェイスがポッドに割り当てられると、ipamD はノードのプライマリネットワークインターフェイスのセキュリティグループとサブネットを使用します。ポッドでは、コントロールプレーンのセキュリティグループと同じ VPC 内の別のセキュリティグループまたはサブネットを使用することもできます。以下に例を示します。

  • サブネットの使用できる IP アドレスの数は限られています。これにより、クラスターに作成できるポッドの数が制限されることがあります。ポッドに別のサブネットを使用することで、使用可能な IP アドレスの数を増やすことができます。

  • セキュリティ上の理由から、ポッドはノードのプライマリネットワークインターフェイスとは異なるセキュリティグループまたはサブネットを使用する必要があります。

  • ノードはパブリックサブネットで設定されます。ポッドは、NAT ゲートウェイを使用してプライベートサブネットに配置されます。詳細については、「」を参照してください外部ソースネットワークアドレス変換 (SNAT)

Considerations

  • このトピックの手順では、Amazon VPC CNI plugin for Kubernetes バージョン 1.4.0 以降が必要です。

  • カスタムネットワークを有効にすると、使用可能なネットワークインターフェイス (およびポッド用に使用可能なすべての IP アドレス) が、それを使用する各ノードから効率的に削除されます。カスタムネットワークが有効になると、ノードのプライマリネットワークインターフェイスはポッドの配置には使用されません。

  • このトピックの手順では、Amazon VPC CNI アドオンに、インスタンスのプライマリネットワークインターフェイスに関連付けられているセキュリティグループとは異なるセキュリティグループをセカンダリネットワークインターフェイスに関連付けるように指示します。セカンダリネットワークインターフェイスを使用するすべてのポッドは、引き続きセカンダリネットワークインターフェイスの使用を共有し、すべて同じセキュリティグループを使用します。

    個々のポッドに異なるセキュリティグループを割り当てる場合は、ポッドのセキュリティグループ を使用します。ポッドのセキュリティグループは、それぞれに一意のセキュリティグループを割り当てることができる追加のネットワークインターフェイスを作成します。セカンダリネットワークインターフェイスを使用するポッドは、引き続きセカンダリネットワークインターフェイスの使用を共有し、すべて同じセキュリティグループを使用します。個々のポッドに異なるセキュリティグループを割り当てる場合は、ポッドのセキュリティグループ を使用します。ポッドのセキュリティグループは、それぞれに一意のセキュリティグループを割り当てることができる追加のネットワークインターフェイスを作成します。ポッドのセキュリティグループは、カスタムネットワークの有無にかかわらず使用できます。

CNI カスタムネットワークを設定するには

  1. 現在インストールされている Amazon VPC CNI のバージョンが 1.9.0 以降であることを確認してください。

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

    出力:

    amazon-k8s-cni:1.9.0-eksbuild.1

    お使いのバージョンが 1.4.0 以前の場合は、それを更新する必要があります。詳細については、更新された「Amazon VPC CNI アドオンの管理」セクションを参照してください。

  2. セカンダリ CIDR ブロックをクラスターの VPC に関連付けます。詳細については、Amazon VPC ユーザーガイドの「VPC とセカンダリ IPv4 CIDR ブロックを関連付ける」を参照してください。

  3. セカンダリ CIDR ブロックを使用して、アベイラビリティーゾーンごとに VPC にサブネットを作成します。カスタムサブネットは、ノードが起動されるサブネットとは異なる VPC CIDR ブロックに属している必要があります。詳細については、Amazon VPC ユーザーガイド の「VPC でサブネットを作成する」を参照してください。

  4. AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG デーモンセットで true 環境変数を aws-node に設定します。

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  5. ポッドをスケジュールするサブネットごとに ENIConfig カスタムリソースを作成します。

    1. ネットワークインターフェイス設定ごとに固有のファイルを作成します。各ファイルには、次の内容が含まれ、name の値は一意であることが必要です。サブネットのアベイラビリティーゾーンと一致する name の値を使用することを強くお勧めします。これにより、マルチアベイラビリティーゾーン Auto Scaling グループのデプロイが簡単になるためです (以下のステップ 5c を参照)。

      この例では、us-west-2a.yaml という名前のファイルが作成されます。namesubnet、および securityGroups<example values> (<> を含む) を独自の値に置き換えます。この例では、ベストプラクティスに従い、name の値を、サブネットが存在するアベイラビリティーゾーンに設定します。ポッドにアタッチする特定のセキュリティグループがない場合、現時点ではその値を空のままにしておくことができます。その後、ENIConfig でノードのセキュリティグループを指定します。

      apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: <us-west-2a> spec: securityGroups: - <sg-0dff111a1d11c1c11> subnet: <subnet-011b111c1f11fdf11>
      注記
      • サブネットとセキュリティグループの組み合わせごとに、独自のカスタムリソースが必要です。同じアベイラビリティーゾーンに複数のサブネットがある場合は、次のコマンドを使用して、各サブネットのノードに一致する Config 名をアノテーションします。

        kubectl annotate node <node-name>.<region>.compute.internal k8s.amazonaws.com/eniConfig=<subnet1ConfigName>
      • VPC に有効なセキュリティグループを指定しないと、VPC のデフォルトのセキュリティグループがセカンダリ ENI に割り当てられます。

    2. 以下のコマンドを使用して、作成したカスタムリソースファイルをそれぞれクラスターに適用します。

      kubectl apply -f <us-west-2a>.yaml
    3. (オプション。ただし、マルチアベイラビリティーゾーンノードグループでは推奨) デフォルトでは、Kubernetes はノードのアベイラビリティーゾーンを failure-domain.beta.kubernetes.io/zone ラベルに適用します。上記のステップ 5a で推奨されているように VPC の各アベイラビリティーゾーンに基づいて ENIConfig カスタムリソースに名前を付けた場合は、次のコマンドを使用して、Kubernetes によってノードのアベイラビリティーゾーンの対応する ENIConfig が自動的に適用されるようにできます。

      kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
      注記

      k8s.amazonaws.com/eniConfig 環境変数のキーが ENI_CONFIG_ANNOTATION_DEF になっている注釈が、aws-node デーモンセットのコンテナ仕様にないことを確認します。その注釈がある場合は、ENI_CONFIG_LABEL_DEF 値が上書きされるため、削除する必要があります。kubectl describe daemonset aws-node -n kube-system | grep ENI_CONFIG_ANNOTATION_DEF コマンドを使用して、その変数が設定されているかどうかを確認できます。出力が返されない場合、その変数は設定されていません。

  6. 起動テンプレートを使用せずに、または AMI ID を指定していない起動テンプレートを使用して管理対象ノードグループをデプロイする場合は、ステップ 7 に進み、マネージド、起動テンプレートなし、または AMI ID が指定されていない起動テンプレートオプションを使用します。マネージド型ノードグループは、最大の Pod 値を自動的に計算します。

    AMI ID を指定した起動テンプレートを使用して、セルフマネージド型ノードグループまたはマネージド型ノードグループをデプロイする場合は、Amazon EKS でノードの推奨最大ポッド数を決定する必要があります。各 Amazon EC2 インスタンスタイプの Amazon EKS の推奨最大ポッド数 の指示に従って、--cni-custom-networking-enabled をステップ 3に追加します。後のステップで使用するために、出力に注意してください。

  7. 次のいずれかのタイプのノードグループを作成します。その他のインスタンスの選択基準については、Amazon EC2 インスタンスタイプを選択する を参照してください。含まれているオプションの<20> (を含む<>) の場合は、前の手順の値 (推奨) または独自の値に置き換えます。

    • セルフマネージドセルフマネージド型の Amazon Linux ノードの起動 の手順に従ってノードグループをデプロイします。デプロイした ENIConfig リソースで指定したサブネットを指定しないでください。BootstrapArguments パラメータに、以下のテキストを指定します。

      --use-max-pods false --kubelet-extra-args '--max-pods=<20>'
    • マネージド型 — 次のいずれかのオプションを使用して、ノードグループをデプロイします。

      • 起動テンプレートがない場合、または AMI ID が指定されていない起動テンプレートを使用する場合 —「マネージド型ノードグループの作成」の手順を完了します。マネージド型ノードグループは、Amazon EKS 推奨最大ポッド値を自動的に計算します。

      • 指定した AMI ID を持つ起動テンプレート — 起動テンプレートで Amazon EKS 最適化 AMI ID を指定するか、Amazon EKS 最適化 AMI から構築されたカスタム AMI を指定してから、起動テンプレートを使用してノードグループをデプロイ起動テンプレートでは、次のユーザーデータを指定します。このユーザーデータは、引数を bootstrap.sh ファイルに渡します。ブートストラップファイルの詳細については、GitHub の「bootstrap.sh」を参照してください。

        /etc/eks/bootstrap.sh <my-cluster> \ --kubelet-extra-args '--max-pods=<20>'

        Amazon EKS 最適化 AMI から構築されていないカスタム AMI を作成した場合は、自分で設定をカスタム作成する必要があります。

    注記

    ノードで大量のポッドをサポートする場合には、コマンドに 各 Amazon EC2 インスタンスタイプの Amazon EKS の推奨最大ポッド数 オプションを追加しながら --cni-prefix-delegation-enabled にあるスクリプトを再度実行します。 インスタンスタイプには 110 が返されます。たとえば、m5.large インスタンスタイプの場合は110 が返されます。この機能を有効にするには、Amazon EC2 ノードで使用可能な IP アドレスの量を増やす を参照してください。 では を使用できます。

    機能をカスタムネットワークで使用します。

  8. ノードグループが作成されたら、サブネットごとに作成されたセキュリティグループを記録し、そのセキュリティグループを関連付けられた ENIConfig に適用します。次のコマンドで各 ENIConfig を編集し、<eniconfig-name> を独自の値に置き換えます。

    kubectl edit eniconfig.crd.k8s.amazonaws.com/<eniconfig-name>

    ステップ 5 のベストプラクティスに従っている場合、eniconfig-name はアベイラビリティーゾーン名に対応します。

    specセクションは次の例の仕様になります。

    spec: securityGroups: - <sg-0dff222a2d22c2c22> subnet: <subnet-022b222c2f22fdf22>
    注記

    sはい (デフォルトは ) 詳細については、「」を参照してくださいAmazon EKS セキュリティグループの考慮事項

  9. カスタム CNI ネットワーク機能に切り替える前に、クラスター内にポッドを実行しているノードがある場合は、ノードに cordon および drain コマンドを適用し、ポッドを正常にシャットダウンしてからノードを終了する必要があります。カスタムネットワーク機能は、k8s.amazonaws.com/eniConfig ラベルで登録されている新しいノードでのみ使用されます。