Skip to content

Feature Request: Add IPv6 subnet support for ENI attachments #25

Description

@johnlam90

Summary

Add comprehensive IPv6 subnet support to the AWS Multi-ENI Controller, enabling IPv6-only and dual-stack (IPv4 + IPv6) ENI configurations through NodeENI resources.

Motivation

As AWS VPCs increasingly adopt IPv6 for modern cloud-native applications, the AWS Multi-ENI Controller needs to support IPv6 subnets to remain relevant for next-generation networking requirements. This includes support for IPv6-only environments and dual-stack configurations that many enterprises are adopting.

Feature Description

Core Functionality

  • IPv6 Subnet Support: Ability to specify IPv6 subnet IDs in NodeENI resource specifications
  • Dual-Stack Configuration: Support for both IPv4 and IPv6 subnets in a single NodeENI resource
  • IPv6 Address Management: Automatic IPv6 address assignment and management for attached ENIs
  • AWS VPC Integration: Full integration with AWS VPC IPv6 functionality and routing
  • Status Reporting: Enhanced ENI attachment status to include IPv6 addresses and subnet information
  • Multus CNI Compatibility: Ensure seamless integration with existing Multus CNI configurations
  • SR-IOV/DPDK Compatibility: Maintain compatibility with existing SR-IOV and DPDK functionality

Proposed NodeENI Resource Schema

apiVersion: networking.k8s.aws/v1alpha1
kind: NodeENI
metadata:
  name: dual-stack-eni
spec:
  nodeSelector:
    ng: ipv6-enabled
  
  # IPv4 Configuration (existing)
  subnetIDs:
    - subnet-12345678  # IPv4 subnet
  
  # NEW: IPv6 Configuration
  ipv6SubnetIDs:
    - subnet-ipv6-abcdef123  # IPv6 subnet
  
  # Alternative: Combined subnet configuration
  # subnets:
  #   - id: subnet-12345678
  #     type: ipv4
  #   - id: subnet-ipv6-abcdef123
  #     type: ipv6
  
  securityGroupIDs:
    - sg-12345678
  deviceIndex: 2
  
  # IPv6-specific configuration
  ipv6Config:
    enabled: true
    addressCount: 1  # Number of IPv6 addresses to assign
    prefixDelegation: false  # Enable IPv6 prefix delegation
    
status:
  attachments:
    - eniID: eni-12345678
      deviceIndex: 2
      status: attached
      # IPv4 information (existing)
      subnetID: subnet-12345678
      subnetCIDR: "10.0.1.0/24"
      privateIPAddress: "10.0.1.100"
      # NEW: IPv6 information
      ipv6SubnetID: subnet-ipv6-abcdef123
      ipv6SubnetCIDR: "2001:db8::/64"
      ipv6Addresses:
        - "2001:db8::100"
        - "2001:db8::101"
      lastUpdated: "2025-05-28T10:00:00Z"

Example Configurations

1. IPv6-Only ENI

apiVersion: networking.k8s.aws/v1alpha1
kind: NodeENI
metadata:
  name: ipv6-only-eni
spec:
  nodeSelector:
    workload: ipv6-native
  ipv6SubnetIDs:
    - subnet-ipv6-123456
  securityGroupIDs:
    - sg-ipv6-789012
  deviceIndex: 2
  ipv6Config:
    enabled: true
    addressCount: 2

2. Dual-Stack ENI (IPv4 + IPv6)

apiVersion: networking.k8s.aws/v1alpha1
kind: NodeENI
metadata:
  name: dual-stack-eni
spec:
  nodeSelector:
    network: dual-stack
  subnetIDs:
    - subnet-ipv4-abc123  # IPv4 subnet
  ipv6SubnetIDs:
    - subnet-ipv6-def456  # IPv6 subnet
  securityGroupIDs:
    - sg-dual-stack-789
  deviceIndex: 3
  ipv6Config:
    enabled: true
    addressCount: 1

3. IPv6 with SR-IOV (Non-DPDK)

apiVersion: networking.k8s.aws/v1alpha1
kind: NodeENI
metadata:
  name: ipv6-sriov-eni
spec:
  nodeSelector:
    workload: high-performance-ipv6
  ipv6SubnetIDs:
    - subnet-ipv6-sriov-123
  securityGroupIDs:
    - sg-sriov-ipv6-456
  deviceIndex: 2
  # SR-IOV Configuration
  enableDPDK: false
  dpdkPCIAddress: "0000:00:07.0"
  dpdkResourceName: "intel.com/sriov_ipv6_kernel"
  # IPv6 Configuration
  ipv6Config:
    enabled: true
    addressCount: 1

4. IPv6 with DPDK

apiVersion: networking.k8s.aws/v1alpha1
kind: NodeENI
metadata:
  name: ipv6-dpdk-eni
spec:
  nodeSelector:
    workload: dpdk-ipv6
  ipv6SubnetIDs:
    - subnet-ipv6-dpdk-789
  securityGroupIDs:
    - sg-dpdk-ipv6-012
  deviceIndex: 4
  # DPDK Configuration
  enableDPDK: true
  dpdkDriver: "vfio-pci"
  dpdkPCIAddress: "0000:00:08.0"
  dpdkResourceName: "intel.com/sriov_dpdk_ipv6"
  # IPv6 Configuration
  ipv6Config:
    enabled: true
    addressCount: 2

5. Multus CNI NetworkAttachmentDefinition for IPv6

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: ipv6-secondary-network
  namespace: default
spec:
  config: '{
    "cniVersion": "0.3.1",
    "type": "ipvlan",
    "master": "eth2",
    "mode": "l2",
    "ipam": {
      "type": "static",
      "addresses": [
        {
          "address": "2001:db8::100/64",
          "gateway": "2001:db8::1"
        }
      ],
      "routes": [
        {
          "dst": "::/0",
          "gw": "2001:db8::1"
        }
      ]
    }
  }'

Implementation Approach

1. NodeENI CRD Updates

// Proposed Go structures
type NodeENISpec struct {
    // Existing fields...
    SubnetIDs         []string `json:"subnetIDs,omitempty"`
    
    // NEW: IPv6 support
    IPv6SubnetIDs     []string     `json:"ipv6SubnetIDs,omitempty"`
    IPv6Config        *IPv6Config  `json:"ipv6Config,omitempty"`
    
    // Alternative: Unified subnet configuration
    // Subnets []SubnetConfig `json:"subnets,omitempty"`
}

type IPv6Config struct {
    Enabled           bool  `json:"enabled"`
    AddressCount      int32 `json:"addressCount,omitempty"`
    PrefixDelegation  bool  `json:"prefixDelegation,omitempty"`
}

type ENIAttachment struct {
    // Existing IPv4 fields...
    ENIID            string `json:"eniID"`
    SubnetID         string `json:"subnetID"`
    SubnetCIDR       string `json:"subnetCIDR"`
    PrivateIPAddress string `json:"privateIPAddress"`
    
    // NEW: IPv6 fields
    IPv6SubnetID     string   `json:"ipv6SubnetID,omitempty"`
    IPv6SubnetCIDR   string   `json:"ipv6SubnetCIDR,omitempty"`
    IPv6Addresses    []string `json:"ipv6Addresses,omitempty"`
}

// Alternative unified approach
type SubnetConfig struct {
    ID   string `json:"id"`
    Type string `json:"type"` // "ipv4" or "ipv6"
}

2. AWS EC2 Client Enhancement

  • Extend EC2 client to support IPv6 subnet operations
  • Add IPv6 address assignment and management
  • Implement IPv6 subnet validation and discovery
  • Support for dual-stack ENI creation and configuration

3. ENI Manager Updates

  • Update interface configuration logic for IPv6
  • Add IPv6 routing and address management
  • Ensure IPv6 compatibility with existing SR-IOV/DPDK functionality
  • Update status reporting to include IPv6 information

4. Controller Logic Enhancement

  • Extend NodeENI controller to handle IPv6 subnets
  • Add validation for IPv6 subnet configurations
  • Implement IPv6-aware reconciliation logic
  • Support for mixed IPv4/IPv6 environments

Acceptance Criteria

Core IPv6 Functionality

  • NodeENI CRD supports IPv6 subnet configuration fields
  • Controller can create and attach ENIs to IPv6 subnets
  • Support for IPv6-only ENI configurations
  • Support for dual-stack (IPv4 + IPv6) ENI configurations
  • Proper IPv6 address assignment and management
  • IPv6 subnet validation and error handling

Status and Monitoring

  • ENI attachment status includes IPv6 addresses and subnet information
  • IPv6 subnet CIDR information displayed in status
  • Proper error reporting for IPv6-related issues
  • Comprehensive logging for IPv6 operations

Integration Compatibility

  • IPv6 support works with existing SR-IOV configurations
  • IPv6 support works with existing DPDK configurations
  • Compatible with Multus CNI for IPv6 secondary networks
  • No breaking changes to existing IPv4-only configurations

AWS Integration

  • Full integration with AWS VPC IPv6 functionality
  • Support for IPv6 security group rules
  • Proper handling of IPv6 routing and gateways
  • Integration with AWS IPv6 prefix delegation (future)

Testing

  • Unit tests for IPv6 configuration logic
  • Integration tests for IPv6-only scenarios
  • Integration tests for dual-stack scenarios
  • End-to-end tests with Multus CNI and IPv6
  • Performance tests for IPv6 vs IPv4 performance

Technical Considerations

1. AWS VPC IPv6 Requirements

  • VPC must have IPv6 CIDR block assigned
  • Subnets must have IPv6 CIDR blocks configured
  • Route tables must include IPv6 routes
  • Security groups must allow IPv6 traffic

2. Kubernetes IPv6 Support

  • Ensure cluster supports IPv6 (dual-stack or IPv6-only)
  • Pod networking must be IPv6-capable
  • Service discovery and DNS must support IPv6
  • Ingress controllers must support IPv6

3. Container Runtime Considerations

  • Container runtime must support IPv6 networking
  • CNI plugins must be IPv6-capable
  • Network policies must support IPv6 rules

4. Backwards Compatibility

  • Existing IPv4-only NodeENI resources must continue to work
  • No changes to existing API behavior
  • Graceful handling of mixed IPv4/IPv6 environments
  • Optional IPv6 configuration (disabled by default)

Migration Strategy

Phase 1: Basic IPv6 Support

  • Add IPv6 subnet configuration to NodeENI CRD
  • Implement IPv6 ENI creation and attachment
  • Basic IPv6 status reporting

Phase 2: Dual-Stack Support

  • Support for both IPv4 and IPv6 in single NodeENI
  • Enhanced status reporting for dual-stack
  • Comprehensive testing

Phase 3: Advanced Features

  • IPv6 prefix delegation support
  • Advanced IPv6 routing configurations
  • Performance optimizations

Related Work

  • Current ENI Management: Build upon existing ENI attachment logic in v1.3.5
  • SR-IOV Integration: Ensure IPv6 works with current SR-IOV functionality
  • DPDK Integration: Maintain IPv6 compatibility with DPDK configurations
  • Multus CNI: Leverage existing Multus integration for IPv6 secondary networks

Future Enhancements

  • IPv6 Prefix Delegation: Support for AWS IPv6 prefix delegation
  • IPv6 Load Balancing: Integration with AWS IPv6 load balancers
  • IPv6 Monitoring: Enhanced metrics and monitoring for IPv6 networks
  • IPv6 Security: Advanced IPv6 security group and NACLs support
  • IPv6 Performance: IPv6-specific performance optimizations

Baseline Version: v1.3.5
Priority: High (IPv6 adoption is accelerating)
Complexity: High
Dependencies: AWS VPC IPv6 support, Kubernetes IPv6 support

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions