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

CNI カスタムネットワーク

デフォルトでは、新しいネットワークインターフェイスがポッドに割り当てられると、ipamD はワーカーノードのプライマリ Elastic Network Interface (ENI) のセキュリティグループとサブネットを使用します。ただし、ポッドのネットワークインターフェイスが、コントロールプレーンのセキュリティグループと同じ VPC 内にある別のセキュリティグループまたはサブネットを使用する必要があるユースケースもあります。次に例を示します。

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

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

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

注記

セルフマネージド型ノードグループにはカスタムネットワークを設定できますが、マネージド型ノードグループには設定できません。このトピックで説明するユースケースでは、Amazon VPC CNI plugin for Kubernetes バージョン 1.4.0 以降が必要です。CNI のバージョンを確認して必要に応じて更新するには、「Amazon VPC CNI Plugin for Kubernetes のアップグレード」を参照してください。

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

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

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

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

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

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  4. 現在インストールされている CNI バージョンを表示します。

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

    出力:

    amazon-k8s-cni:1.6.3
  5. バージョン 1.3 以降の CNI がインストールされている場合は、ステップ 6 に進むことができます。クラスター用に新しい ENIConfig カスタムリソースを定義します。

    1. ENIConfig.yaml というファイルを作成して、次の内容を貼り付けます。

      apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: eniconfigs.crd.k8s.amazonaws.com spec: scope: Cluster group: crd.k8s.amazonaws.com version: v1alpha1 names: plural: eniconfigs singular: eniconfig kind: ENIConfig
    2. 次のコマンドを使用して、クラスターにファイルを適用します。

      kubectl apply -f ENIConfig.yaml
  6. ポッドをスケジュールするサブネットごとに ENIConfig カスタムリソースを作成します。

    1. Elastic Network Interface 設定ごとに固有のファイルを作成します。各ファイルには、以下の内容が含まれ、name の値は一意であることが必要です。サブネットの アベイラビリティーゾーン と一致する name の値を使用することを強くお勧めします。これにより、マルチ AZ Auto Scaling グループのデプロイが簡単になるためです (以下のステップ 6c を参照)。この例では、us-west-2a.yaml という名前のファイルが作成されます。namesubnetsecurityGroupsサンプル値を独自の値に置き換えます。この例では、ベストプラクティスに従い、name の値を、サブネットが存在する アベイラビリティーゾーン に設定します。ポッドにアタッチする特定のセキュリティグループがない場合、現時点ではその値を空のままにしておくことができます。後で、ENIConfig でワーカーノードのセキュリティグループを指定します。

      注記

      サブネットとセキュリティグループの組み合わせごとに、独自のカスタムリソースが必要です。

      apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: us-west-2a spec: securityGroups: - sg-0dff111a1d11c1c11 subnet: subnet-011b111c1f11fdf11
    2. 以下のコマンドを使用して、作成したカスタムリソースファイルをそれぞれクラスターに適用します。

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

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

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

  7. 設定した ENIConfig ごとに、新しいセルフマネージド型ワーカーノードグループを作成します。

    1. 以下の式を使用して、各ワーカーノードでスケジュールできるポッドの最大数を決定します。

      maxPods = (number of interfaces - 1) * (max IPv4 addresses per interface - 1) + 2

      たとえば、m5.large インスタンスタイプは、3 つのネットワークインターフェイスと、インターフェイスごとに 10 個の IPv4 アドレスをサポートします。これらの値を式に代入すると、以下の計算に示すように、インスタンスは最大 20 のポッドをサポートできるのがわかります。

      maxPods = (3 - 1) * (10 - 1) + 2 = 20

      インスタンスタイプごとのネットワークインターフェイスの最大数の詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイド の「Elastic Network Interface」を参照してください。

    2. Amazon EKS Linux ワーカーノードの起動 の [Self-managed nodes (セルフマネージド型ノード)] タブにある手順に従って、新しいセルフマネージド型ワーカーノードグループをそれぞれ作成します。AWS CloudFormation テンプレートを開いた後、指示に従って値を入力します。[BootstrapArguments] フィールドに、次の値を入力します。

      --use-max-pods false --kubelet-extra-args '--max-pods=20'
  8. ワーカーノードグループが作成されたら、ワーカーノードグループごとに作成されたセキュリティグループを記録し、それを関連付けられた ENIConfig に適用します。次のコマンドで各 ENIConfig を編集し、eniconfig-name を独自の値に置き換えます。

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

    上記の手順 6a および 6c のベストプラクティスに従った場合、eniconfig-name は アベイラビリティーゾーン 名に対応します。

    spec セクションは、次のようになります。

    spec: securityGroups: - sg-0dff222a2d22c2c22 subnet: subnet-022b222c2f22fdf22
  9. クラスター内にポッドが配置されているワーカーノードがある場合は、この手順を完了する前にそれらを終了する必要があります。新しいカスタムのネットワーキング機能は、k8s.amazonaws.com/eniConfig ラベルで登録されている新しいノードでのみ使用されます。