Skip to content

Commit

Permalink
subnet support config mtu (#3367)
Browse files Browse the repository at this point in the history
* subnet support config mtu

Signed-off-by: changluyi <clyi@alauda.io>

* gofmtpt

Signed-off-by: Changlu Yi <clyi@alauda.io>

* fix

Signed-off-by: Changlu Yi <clyi@alauda.io>

* include config vm mtu by dhcp option

Signed-off-by: Changlu Yi <clyi@alauda.io>

* fix

Signed-off-by: Changlu Yi <clyi@alauda.io>

---------

Signed-off-by: changluyi <clyi@alauda.io>
Signed-off-by: Changlu Yi <clyi@alauda.io>
  • Loading branch information
changluyi committed Nov 9, 2023
1 parent 005b92b commit 6d6eef4
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 30 deletions.
4 changes: 4 additions & 0 deletions charts/templates/kube-ovn-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1714,6 +1714,10 @@ spec:
- 253 # default
- 254 # main
- 255 # local
mtu:
type: integer
minimum: 68
maximum: 65535
private:
type: boolean
vlan:
Expand Down
4 changes: 4 additions & 0 deletions dist/images/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2254,6 +2254,10 @@ spec:
- 253 # default
- 254 # main
- 255 # local
mtu:
type: integer
minimum: 68
maximum: 65535
private:
type: boolean
vlan:
Expand Down
1 change: 1 addition & 0 deletions pkg/apis/kubeovn/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ type SubnetSpec struct {
ExternalEgressGateway string `json:"externalEgressGateway,omitempty"`
PolicyRoutingPriority uint32 `json:"policyRoutingPriority,omitempty"`
PolicyRoutingTableID uint32 `json:"policyRoutingTableID,omitempty"`
Mtu uint32 `json:"mtu,omitempty"`

Private bool `json:"private"`
AllowSubnets []string `json:"allowSubnets,omitempty"`
Expand Down
33 changes: 19 additions & 14 deletions pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -620,20 +620,25 @@ func (c *Controller) checkSubnetConflict(subnet *kubeovnv1.Subnet) error {
}

func (c *Controller) updateSubnetDHCPOption(subnet *kubeovnv1.Subnet, needRouter bool) error {
mtu := util.DefaultMTU
if subnet.Spec.Vlan == "" {
switch c.config.NetworkType {
case util.NetworkTypeVlan:
// default to geneve
fallthrough
case util.NetworkTypeGeneve:
mtu -= util.GeneveHeaderLength
case util.NetworkTypeVxlan:
mtu -= util.VxlanHeaderLength
case util.NetworkTypeStt:
mtu -= util.SttHeaderLength
default:
return fmt.Errorf("invalid network type: %s", c.config.NetworkType)
var mtu int
if subnet.Spec.Mtu > 0 {
mtu = int(subnet.Spec.Mtu)
} else {
mtu = util.DefaultMTU
if subnet.Spec.Vlan == "" {
switch c.config.NetworkType {
case util.NetworkTypeVlan:
// default to geneve
fallthrough
case util.NetworkTypeGeneve:
mtu -= util.GeneveHeaderLength
case util.NetworkTypeVxlan:
mtu -= util.VxlanHeaderLength
case util.NetworkTypeStt:
mtu -= util.SttHeaderLength
default:
return fmt.Errorf("invalid network type: %s", c.config.NetworkType)
}
}
}

Expand Down
36 changes: 20 additions & 16 deletions pkg/daemon/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,29 +255,33 @@ func (csh cniServerHandler) handleAdd(req *restful.Request, resp *restful.Respon
}

var mtu int
if providerNetwork != "" && !podSubnet.Spec.LogicalGateway && !podSubnet.Spec.U2OInterconnection {
node, err := csh.Controller.nodesLister.Get(csh.Config.NodeName)
if err != nil {
errMsg := fmt.Errorf("failed to get node %s: %v", csh.Config.NodeName, err)
klog.Error(errMsg)
if err = resp.WriteHeaderAndEntity(http.StatusInternalServerError, request.CniResponse{Err: errMsg.Error()}); err != nil {
klog.Errorf("failed to write response: %v", err)
}
return
}
mtuStr := node.Labels[fmt.Sprintf(util.ProviderNetworkMtuTemplate, providerNetwork)]
if mtuStr != "" {
if mtu, err = strconv.Atoi(mtuStr); err != nil || mtu <= 0 {
errMsg := fmt.Errorf("failed to parse provider network MTU %s: %v", mtuStr, err)
if podSubnet.Spec.Mtu > 0 {
mtu = int(podSubnet.Spec.Mtu)
} else {
if providerNetwork != "" && !podSubnet.Spec.LogicalGateway && !podSubnet.Spec.U2OInterconnection {
node, err := csh.Controller.nodesLister.Get(csh.Config.NodeName)
if err != nil {
errMsg := fmt.Errorf("failed to get node %s: %v", csh.Config.NodeName, err)
klog.Error(errMsg)
if err = resp.WriteHeaderAndEntity(http.StatusInternalServerError, request.CniResponse{Err: errMsg.Error()}); err != nil {
klog.Errorf("failed to write response: %v", err)
}
return
}
mtuStr := node.Labels[fmt.Sprintf(util.ProviderNetworkMtuTemplate, providerNetwork)]
if mtuStr != "" {
if mtu, err = strconv.Atoi(mtuStr); err != nil || mtu <= 0 {
errMsg := fmt.Errorf("failed to parse provider network MTU %s: %v", mtuStr, err)
klog.Error(errMsg)
if err = resp.WriteHeaderAndEntity(http.StatusInternalServerError, request.CniResponse{Err: errMsg.Error()}); err != nil {
klog.Errorf("failed to write response: %v", err)
}
return
}
}
} else {
mtu = csh.Config.MTU
}
} else {
mtu = csh.Config.MTU
}

routes = append(podRequest.Routes, routes...)
Expand Down
23 changes: 23 additions & 0 deletions test/e2e/kube-ovn/subnet/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -1245,6 +1245,29 @@ var _ = framework.Describe("[group:subnet]", func() {
checkNatPolicyRules(f, cs, fakeSubnet, fakeCidrV4, fakeCidrV6, false)
checkNatPolicyIPsets(f, cs, fakeSubnet, fakeCidrV4, fakeCidrV6, false)
})

framework.ConformanceIt("should support customize mtu of all pods in subnet", func() {
ginkgo.By("Creating subnet " + subnetName)
subnet = framework.MakeSubnet(subnetName, "", cidr, "", "", "", nil, nil, nil)
subnet.Spec.Mtu = 1600
subnet = subnetClient.CreateSync(subnet)

ginkgo.By("Creating pod " + podName)
annotations := map[string]string{
util.LogicalSwitchAnnotation: subnetName,
}

pod := framework.MakePod(namespaceName, podName, nil, annotations, framework.AgnhostImage, nil, nil)
_ = podClient.CreateSync(pod)

ginkgo.By("Validating pod MTU")
links, err := iproute.AddressShow("eth0", func(cmd ...string) ([]byte, []byte, error) {
return framework.KubectlExec(namespaceName, podName, cmd...)
})
framework.ExpectNoError(err)
framework.ExpectHaveLen(links, 1, "should get eth0 information")
framework.ExpectEqual(links[0].Mtu, int(subnet.Spec.Mtu))
})
})

func checkNatPolicyIPsets(f *framework.Framework, cs clientset.Interface, subnet *apiv1.Subnet, cidrV4, cidrV6 string, shouldExist bool) {
Expand Down
4 changes: 4 additions & 0 deletions yamls/crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2025,6 +2025,10 @@ spec:
- 253 # default
- 254 # main
- 255 # local
mtu:
type: integer
minimum: 68
maximum: 65535
private:
type: boolean
vlan:
Expand Down

0 comments on commit 6d6eef4

Please sign in to comment.