Skip to content

Commit

Permalink
vip, eip support ipv6 vip count (#1624)
Browse files Browse the repository at this point in the history
  • Loading branch information
bobz965 authored Jun 20, 2022
1 parent b458bf7 commit f55e32b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 59 deletions.
67 changes: 19 additions & 48 deletions pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,7 @@ func (c *Controller) handleAddOrUpdateSubnet(key string) error {
}
}

if util.CheckProtocol(subnet.Spec.CIDRBlock) == kubeovnv1.ProtocolDual {
if subnet.Spec.Protocol == kubeovnv1.ProtocolDual {
err = calcDualSubnetStatusIP(subnet, c)
} else {
err = calcSubnetStatusIP(subnet, c)
Expand Down Expand Up @@ -1366,57 +1366,41 @@ func calcDualSubnetStatusIP(subnet *kubeovnv1.Subnet, c *Controller) error {
v6toSubIPs := util.ExpandExcludeIPs(v6ExcludeIps, cidrBlocks[1])
_, v4CIDR, _ := net.ParseCIDR(cidrBlocks[0])
_, v6CIDR, _ := net.ParseCIDR(cidrBlocks[1])
v4UsingIPs := make([]string, 0, len(podUsedIPs.Items))
v6UsingIPs := make([]string, 0, len(podUsedIPs.Items))
for _, podUsedIP := range podUsedIPs.Items {
// The format of podUsedIP.Spec.IPAddress is 10.244.0.0/16,fd00:10:244::/64 when protocol is dualstack
splitIPs := strings.Split(podUsedIP.Spec.IPAddress, ",")
v4toSubIPs = append(v4toSubIPs, splitIPs[0])
v4UsingIPs = append(v4UsingIPs, splitIPs[0])
if len(splitIPs) == 2 {
v6toSubIPs = append(v6toSubIPs, splitIPs[1])
v6UsingIPs = append(v6UsingIPs, splitIPs[1])
}
}
v4availableIPs := util.AddressCount(v4CIDR) - util.CountIpNums(v4toSubIPs)
v6availableIPs := util.AddressCount(v6CIDR) - util.CountIpNums(v6toSubIPs)

usingIPs := float64(len(podUsedIPs.Items))

vips, err := c.config.KubeOvnClient.KubeovnV1().Vips().List(context.Background(), metav1.ListOptions{
LabelSelector: fields.OneTermEqualSelector(util.SubnetNameLabel, subnet.Name).String(),
})
if err != nil {
return err
}
// TODO:// support v6 vip
for _, vip := range vips.Items {
v4toSubIPs = append(v4toSubIPs, vip.Spec.V4ip)
v4UsingIPs = append(v4UsingIPs, vip.Spec.V4ip)
}
usingIPs += float64(len(vips.Items))

if subnet.Name == util.VpcExternalNet {
eips, err := c.config.KubeOvnClient.KubeovnV1().IptablesEIPs().List(context.Background(), metav1.ListOptions{
LabelSelector: fields.OneTermEqualSelector(util.SubnetNameLabel, subnet.Name).String(),
})
if err != nil {
return err
}
// TODO:// support v6 eip
for _, eip := range eips.Items {
v4toSubIPs = append(v4toSubIPs, eip.Spec.V4ip)
v4UsingIPs = append(v4UsingIPs, eip.Spec.V4ip)
}
usingIPs += float64(len(eips.Items))
}
v4availableIPs := util.AddressCount(v4CIDR) - util.CountIpNums(v4toSubIPs)
v4availableIPs = v4availableIPs - usingIPs
if v4availableIPs < 0 {
v4availableIPs = 0
}
v6availableIPs := util.AddressCount(v6CIDR) - util.CountIpNums(v6toSubIPs)
v6availableIPs = v6availableIPs - usingIPs
if v6availableIPs < 0 {
v6availableIPs = 0
}

subnet.Status.V4AvailableIPs = v4availableIPs
subnet.Status.V6AvailableIPs = v6availableIPs
subnet.Status.V4UsingIPs = float64(len(v4UsingIPs))
subnet.Status.V6UsingIPs = float64(len(v6UsingIPs))

subnet.Status.V4UsingIPs = usingIPs
subnet.Status.V6UsingIPs = usingIPs
bytes, err := subnet.Status.Bytes()
if err != nil {
return err
Expand All @@ -1438,46 +1422,33 @@ func calcSubnetStatusIP(subnet *kubeovnv1.Subnet, c *Controller) error {
}
// gateway always in excludeIPs
toSubIPs := util.ExpandExcludeIPs(subnet.Spec.ExcludeIps, subnet.Spec.CIDRBlock)
for _, podUsedIP := range podUsedIPs.Items {
toSubIPs = append(toSubIPs, podUsedIP.Spec.IPAddress)
}
availableIPs := util.AddressCount(cidr) - util.CountIpNums(toSubIPs)
usingIPs := float64(len(podUsedIPs.Items))
vips, err := c.config.KubeOvnClient.KubeovnV1().Vips().List(context.Background(), metav1.ListOptions{
LabelSelector: fields.OneTermEqualSelector(util.SubnetNameLabel, subnet.Name).String(),
})
if err != nil {
return err
}
if len(vips.Items) > 0 {
usingIPs += float64(len(vips.Items))
for _, vip := range vips.Items {
// TODO:// support v6 vip
toSubIPs = append(toSubIPs, vip.Spec.V4ip)
}
}
usingIPs += float64(len(vips.Items))
if subnet.Name == util.VpcExternalNet {
eips, err := c.config.KubeOvnClient.KubeovnV1().IptablesEIPs().List(context.Background(), metav1.ListOptions{
LabelSelector: fields.OneTermEqualSelector(util.SubnetNameLabel, subnet.Name).String(),
})
if err != nil {
return err
}
if len(eips.Items) > 0 {
usingIPs += float64(len(eips.Items))
for _, eip := range eips.Items {
// TODO:// support v6 eip
toSubIPs = append(toSubIPs, eip.Spec.V4ip)
}
}
usingIPs += float64(len(eips.Items))
}
availableIPs := util.AddressCount(cidr) - util.CountIpNums(toSubIPs)

availableIPs = availableIPs - usingIPs
if availableIPs < 0 {
availableIPs = 0
}
if util.CheckProtocol(subnet.Spec.CIDRBlock) == kubeovnv1.ProtocolIPv4 {
if subnet.Spec.Protocol == kubeovnv1.ProtocolIPv4 {
subnet.Status.V4AvailableIPs = availableIPs
subnet.Status.V4UsingIPs = usingIPs
} else if util.CheckProtocol(subnet.Spec.CIDRBlock) == kubeovnv1.ProtocolIPv6 {
} else {
subnet.Status.V6AvailableIPs = availableIPs
subnet.Status.V6UsingIPs = usingIPs
}
Expand Down
23 changes: 14 additions & 9 deletions pkg/controller/vip.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ func (c *Controller) handleAddVirtualIp(key string) error {
}
return err
}
if cachedVip.Spec.MacAddress != "" {
if cachedVip.Status.Mac != "" {
// already ok
return nil
}
Expand Down Expand Up @@ -240,8 +240,9 @@ func (c *Controller) handleUpdateVirtualIp(key string) error {
if !vip.DeletionTimestamp.IsZero() {
// TODO:// clean vip in its parent port aap list
// klog.V(3).Infof("todo:// remove this vip '%s' from its parent port aap list", key)

if err = c.patchVipStatus(key, "", false); err != nil {
v4ip := ""
ready := false
if err = c.patchVipStatus(key, v4ip, ready); err != nil {
return err
}
vip.Status.Ready = false
Expand All @@ -263,7 +264,8 @@ func (c *Controller) handleUpdateVirtualIp(key string) error {
vip.Spec.ParentV4ip, vip.Spec.ParentV6ip, vip.Spec.MacAddress); err != nil {
return err
}
if err = c.patchVipStatus(key, vip.Spec.V4ip, true); err != nil {
ready := true
if err = c.patchVipStatus(key, vip.Spec.V4ip, ready); err != nil {
return err
}
}
Expand Down Expand Up @@ -301,26 +303,29 @@ func (c *Controller) acquireStaticVirtualAddress(subnetName, name, nicName, ip s

func (c *Controller) acquireVirtualAddress(subnetName, name, nicName string) (string, string, string, error) {
var skippedAddrs []string
var v4ip, v6ip, mac string
checkConflict := false
var err error
for {
ipv4, ipv6, mac, err := c.ipam.GetRandomAddress(name, nicName, "", subnetName, skippedAddrs, false)
v4ip, v6ip, mac, err = c.ipam.GetRandomAddress(name, nicName, mac, subnetName, skippedAddrs, checkConflict)
if err != nil {
return "", "", "", err
}

ipv4OK, ipv6OK, err := c.validatePodIP(name, subnetName, ipv4, ipv6)
ipv4OK, ipv6OK, err := c.validatePodIP(name, subnetName, v4ip, v6ip)
if err != nil {
return "", "", "", err
}

if ipv4OK && ipv6OK {
return ipv4, ipv6, mac, nil
return v4ip, v6ip, mac, nil
}

if !ipv4OK {
skippedAddrs = append(skippedAddrs, ipv4)
skippedAddrs = append(skippedAddrs, v4ip)
}
if !ipv6OK {
skippedAddrs = append(skippedAddrs, ipv6)
skippedAddrs = append(skippedAddrs, v6ip)
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/controller/vpc_nat_gw_eip.go
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ func (c *Controller) deleteEipInPod(dp, v4Cidr string) error {
}

func (c *Controller) acquireStaticEip(name, namespace, nicName, ip string) (string, string, string, error) {
liveMigration := true
checkConflict := true
var v4ip, v6ip, mac string
var err error
for _, ipStr := range strings.Split(ip, ",") {
Expand All @@ -583,7 +583,7 @@ func (c *Controller) acquireStaticEip(name, namespace, nicName, ip string) (stri
}
}

if v4ip, v6ip, mac, err = c.ipam.GetStaticAddress(name, nicName, ip, mac, util.VpcExternalNet, !liveMigration); err != nil {
if v4ip, v6ip, mac, err = c.ipam.GetStaticAddress(name, nicName, ip, mac, util.VpcExternalNet, checkConflict); err != nil {
klog.Errorf("failed to get static ip %v, mac %v, subnet %v, err %v", ip, mac, util.VpcExternalNet, err)
return "", "", "", err
}
Expand Down

0 comments on commit f55e32b

Please sign in to comment.