Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6b4c826
validations: allow IPv6 configurations for unmanaged clusters
tthvo Jul 22, 2025
986b5e8
ec2: enable primary IPv6 on ENI for EC2 instances
tthvo Jul 22, 2025
4b48513
ec2: support option HTTPProtocolIPv6 for EC2 IMDS
tthvo Jul 22, 2025
e17adb5
routing: ensure routes to eigw are up to date
tthvo Jul 22, 2025
1c8b976
subnets: configure default subnets to use NAT64/DNS64
tthvo Jul 23, 2025
7d022ad
securitygroup: ensure icmpv6 is supported
tthvo Jul 23, 2025
e60c50c
securitygroup: allow setting allowed IPv6 CIDR for node NodePort serv…
tthvo Jul 28, 2025
d428141
securitygroup: allow configuring IPv6 source CIDRs for bastion SSH
tthvo Jul 28, 2025
6118462
crd: add IPv6 of bastion host to cluster status
tthvo Jul 30, 2025
3336db0
template: manifest templates for IPv6-enabled cluster
tthvo Jul 29, 2025
c795796
cni: customized calico manifests for single-stack IPv6
tthvo Jul 29, 2025
dff77ca
docs: add documentations for enabling IPv6 in non-eks clusters
tthvo Jul 29, 2025
65c25d5
validations: validate vpc and subnet CIDR
tthvo Aug 5, 2025
e21265d
docs: update doc for enabling ipv6
tthvo Aug 6, 2025
25bd540
cni: document the requirement for calico ipv6 support
tthvo Aug 8, 2025
50cac8e
subnets: wait till IPv6 CIDR is associated with subnets
tthvo Sep 19, 2025
73c25cf
sg: allow both ipv4 and ipv6 cidrs to API LB if vpc ipv6 block is def…
tthvo Sep 29, 2025
101c1c0
crd: clarify isIpv6 field on subnet spec
tthvo Jul 29, 2025
1cca7b9
api: add spec field to configure target group ipType
tthvo Oct 2, 2025
e0c6232
subnets: auto-assign IPv6 CIDR blocks to subnets when not specified
tthvo Oct 6, 2025
57d87ba
vpc: ipam pool under vpc.ipv6 should be used for VPC IPv6 CIDR
tthvo Oct 9, 2025
abe113a
subnets: only enable DNS64 for IPv6-only subnets
tthvo Oct 10, 2025
6f37668
docs: add dualstack cluster support documentation
tthvo Oct 10, 2025
e5dedfa
fixup! ec2: enable primary IPv6 on ENI for EC2 instances
tthvo Oct 23, 2025
1c0dc3d
fixup! docs: add dualstack cluster support documentation
tthvo Oct 23, 2025
160c6b1
fixup! api: add spec field to configure target group ipType
tthvo Oct 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions api/v1beta1/awscluster_conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ func (src *AWSCluster) ConvertTo(dstRaw conversion.Hub) error {
dst.Status.Bastion.HostID = restored.Status.Bastion.HostID
dst.Status.Bastion.CapacityReservationPreference = restored.Status.Bastion.CapacityReservationPreference
dst.Status.Bastion.CPUOptions = restored.Status.Bastion.CPUOptions
dst.Status.Bastion.IPv6Address = restored.Status.Bastion.IPv6Address
if restored.Status.Bastion.DynamicHostAllocation != nil {
dst.Status.Bastion.DynamicHostAllocation = restored.Status.Bastion.DynamicHostAllocation
}
Expand Down Expand Up @@ -158,6 +159,7 @@ func (src *AWSCluster) ConvertTo(dstRaw conversion.Hub) error {
func restoreControlPlaneLoadBalancerStatus(restored, dst *infrav1.LoadBalancer) {
dst.ARN = restored.ARN
dst.LoadBalancerType = restored.LoadBalancerType
dst.LoadBalancerIPAddressType = restored.LoadBalancerIPAddressType
dst.ELBAttributes = restored.ELBAttributes
dst.ELBListeners = restored.ELBListeners
dst.Name = restored.Name
Expand Down Expand Up @@ -195,6 +197,7 @@ func restoreControlPlaneLoadBalancer(restored, dst *infrav1.AWSLoadBalancerSpec)
dst.Scheme = restored.Scheme
dst.CrossZoneLoadBalancing = restored.CrossZoneLoadBalancing
dst.Subnets = restored.Subnets
dst.TargetGroupIPType = restored.TargetGroupIPType
}

// ConvertFrom converts the v1beta1 AWSCluster receiver to a v1beta1 AWSCluster.
Expand Down
4 changes: 1 addition & 3 deletions api/v1beta1/network_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,6 @@ type SubnetSpec struct {

// IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC.
// A subnet can have an IPv4 and an IPv6 address.
// IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
// +optional
IPv6CidrBlock string `json:"ipv6CidrBlock,omitempty"`

Expand All @@ -260,8 +259,7 @@ type SubnetSpec struct {
// +optional
IsPublic bool `json:"isPublic"`

// IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled.
// IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object.
// IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with an IPv6 CIDR.
// +optional
IsIPv6 bool `json:"isIpv6,omitempty"`

Expand Down
4 changes: 3 additions & 1 deletion api/v1beta1/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 21 additions & 2 deletions api/v1beta2/awscluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,9 @@ type Bastion struct {

// AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host.
// They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0).
// If the cluster has IPv6 enabled, defaults to ::/0 and 0.0.0.0/0.
// +optional
AllowedCIDRBlocks []string `json:"allowedCIDRBlocks,omitempty"`
AllowedCIDRBlocks CidrBlocks `json:"allowedCIDRBlocks,omitempty"`

// InstanceType will use the specified instance type for the bastion. If not specified,
// Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro
Expand Down Expand Up @@ -252,6 +253,15 @@ type AWSLoadBalancerSpec struct {
// PreserveClientIP lets the user control if preservation of client ips must be retained or not.
// If this is enabled 6443 will be opened to 0.0.0.0/0.
PreserveClientIP bool `json:"preserveClientIP,omitempty"`

// TargetGroupIPType sets the IP address type for the target group.
// Valid values are ipv4 and ipv6. If not specified, defaults to ipv4 unless
// the VPC has IPv6 enabled, in which case it defaults to ipv6.
// This applies to the API server target group.
// This field cannot be set if LoadBalancerType is classic or disabled.
// +kubebuilder:validation:Enum=ipv4;ipv6
// +optional
TargetGroupIPType *TargetGroupIPType `json:"targetGroupIPType,omitempty"`
}

// AdditionalListenerSpec defines the desired state of an
Expand All @@ -271,6 +281,14 @@ type AdditionalListenerSpec struct {
// HealthCheck sets the optional custom health check configuration to the API target group.
// +optional
HealthCheck *TargetGroupHealthCheckAdditionalSpec `json:"healthCheck,omitempty"`

// TargetGroupIPType sets the IP address type for the target group.
// Valid values are ipv4 and ipv6. If not specified, defaults to ipv4 unless
// the VPC has IPv6 enabled, in which case it defaults to ipv6.
// This field cannot be set if LoadBalancerType is classic or disabled.
// +kubebuilder:validation:Enum=ipv4;ipv6
// +optional
TargetGroupIPType *TargetGroupIPType `json:"targetGroupIPType,omitempty"`
}

// AWSClusterStatus defines the observed state of AWSCluster.
Expand Down Expand Up @@ -323,7 +341,8 @@ type S3Bucket struct {
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.ready",description="Cluster infrastructure is ready for EC2 instances"
// +kubebuilder:printcolumn:name="VPC",type="string",JSONPath=".spec.network.vpc.id",description="AWS VPC the cluster is using"
// +kubebuilder:printcolumn:name="Endpoint",type="string",JSONPath=".spec.controlPlaneEndpoint",description="API Endpoint",priority=1
// +kubebuilder:printcolumn:name="Bastion IP",type="string",JSONPath=".status.bastion.publicIp",description="Bastion IP address for breakglass access"
// +kubebuilder:printcolumn:name="Bastion IP",type="string",JSONPath=".status.bastion.publicIp",description="Bastion IPv4 address for breakglass access"
// +kubebuilder:printcolumn:name="Bastion IPv6",type="string",JSONPath=".status.bastion.ipv6Address",description="Bastion IPv6 address for breakglass access"
// +k8s:defaulter-gen=true

// AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster API.
Expand Down
Loading