Skip to content

Commit

Permalink
Auto discovery mtu
Browse files Browse the repository at this point in the history
Discover mtu of primary interface if defaultMTU param is not
set in the antrea.yaml
  • Loading branch information
Rahul Jain committed Jul 10, 2020
1 parent 412587d commit 1cdc739
Show file tree
Hide file tree
Showing 20 changed files with 120 additions and 131 deletions.
12 changes: 6 additions & 6 deletions build/yamls/antrea-eks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,9 +548,9 @@ data:
# - stt
#tunnelType: geneve
# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450
# Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported
Expand Down Expand Up @@ -625,7 +625,7 @@ metadata:
annotations: {}
labels:
app: antrea
name: antrea-config-56mbbtb474
name: antrea-config-82h8ftch67
namespace: kube-system
---
apiVersion: v1
Expand Down Expand Up @@ -731,7 +731,7 @@ spec:
key: node-role.kubernetes.io/master
volumes:
- configMap:
name: antrea-config-56mbbtb474
name: antrea-config-82h8ftch67
name: antrea-config
- name: antrea-controller-tls
secret:
Expand Down Expand Up @@ -948,7 +948,7 @@ spec:
operator: Exists
volumes:
- configMap:
name: antrea-config-56mbbtb474
name: antrea-config-82h8ftch67
name: antrea-config
- hostPath:
path: /etc/cni/net.d
Expand Down
12 changes: 6 additions & 6 deletions build/yamls/antrea-gke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,9 +548,9 @@ data:
# - stt
#tunnelType: geneve
# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450
# Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported
Expand Down Expand Up @@ -625,7 +625,7 @@ metadata:
annotations: {}
labels:
app: antrea
name: antrea-config-96mc77fdk8
name: antrea-config-h6tm7hccc8
namespace: kube-system
---
apiVersion: v1
Expand Down Expand Up @@ -731,7 +731,7 @@ spec:
key: node-role.kubernetes.io/master
volumes:
- configMap:
name: antrea-config-96mc77fdk8
name: antrea-config-h6tm7hccc8
name: antrea-config
- name: antrea-controller-tls
secret:
Expand Down Expand Up @@ -946,7 +946,7 @@ spec:
operator: Exists
volumes:
- configMap:
name: antrea-config-96mc77fdk8
name: antrea-config-h6tm7hccc8
name: antrea-config
- hostPath:
path: /etc/cni/net.d
Expand Down
12 changes: 6 additions & 6 deletions build/yamls/antrea-ipsec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,9 +548,9 @@ data:
# - stt
tunnelType: gre
# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450
# Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported
Expand Down Expand Up @@ -625,7 +625,7 @@ metadata:
annotations: {}
labels:
app: antrea
name: antrea-config-tkd7g2g7d4
name: antrea-config-7f4722ckk5
namespace: kube-system
---
apiVersion: v1
Expand Down Expand Up @@ -740,7 +740,7 @@ spec:
key: node-role.kubernetes.io/master
volumes:
- configMap:
name: antrea-config-tkd7g2g7d4
name: antrea-config-7f4722ckk5
name: antrea-config
- name: antrea-controller-tls
secret:
Expand Down Expand Up @@ -990,7 +990,7 @@ spec:
operator: Exists
volumes:
- configMap:
name: antrea-config-tkd7g2g7d4
name: antrea-config-7f4722ckk5
name: antrea-config
- hostPath:
path: /etc/cni/net.d
Expand Down
10 changes: 5 additions & 5 deletions build/yamls/antrea-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ data:
# - stt
#tunnelType: geneve
# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead.
#defaultMTU: 1450
# CIDR Range for services in cluster. It's required to support egress network policy, should
Expand Down Expand Up @@ -69,7 +69,7 @@ kind: ConfigMap
metadata:
labels:
app: antrea
name: antrea-windows-config-2b4h888dt2
name: antrea-windows-config-g69kk2hk28
namespace: kube-system
---
apiVersion: apps/v1
Expand Down Expand Up @@ -157,7 +157,7 @@ spec:
operator: Exists
volumes:
- configMap:
name: antrea-windows-config-2b4h888dt2
name: antrea-windows-config-g69kk2hk28
name: antrea-windows-config
- configMap:
defaultMode: 420
Expand Down
12 changes: 6 additions & 6 deletions build/yamls/antrea.yml
Original file line number Diff line number Diff line change
Expand Up @@ -548,9 +548,9 @@ data:
# - stt
#tunnelType: geneve
# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450
# Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported
Expand Down Expand Up @@ -625,7 +625,7 @@ metadata:
annotations: {}
labels:
app: antrea
name: antrea-config-5g4h62mc5t
name: antrea-config-fg88m7g644
namespace: kube-system
---
apiVersion: v1
Expand Down Expand Up @@ -731,7 +731,7 @@ spec:
key: node-role.kubernetes.io/master
volumes:
- configMap:
name: antrea-config-5g4h62mc5t
name: antrea-config-fg88m7g644
name: antrea-config
- name: antrea-controller-tls
secret:
Expand Down Expand Up @@ -946,7 +946,7 @@ spec:
operator: Exists
volumes:
- configMap:
name: antrea-config-5g4h62mc5t
name: antrea-config-fg88m7g644
name: antrea-config
- hostPath:
path: /etc/cni/net.d
Expand Down
6 changes: 3 additions & 3 deletions build/yamls/base/conf/antrea-agent.conf
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ featureGates:
# - stt
#tunnelType: geneve

# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450

# Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported
Expand Down
6 changes: 3 additions & 3 deletions build/yamls/windows/base/conf/antrea-agent.conf
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ featureGates:
# - stt
#tunnelType: geneve

# Default MTU to use for the host gateway interface and the network interface of each Pod. If
# omitted, antrea-agent will default this value to 1450 to accommodate for tunnel encapsulate
# overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface and
# also adjust MTU to accommodate for tunnel encapsulate overhead.
#defaultMTU: 1450

# CIDR Range for services in cluster. It's required to support egress network policy, should
Expand Down
1 change: 0 additions & 1 deletion cmd/antrea-agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ func run(o *Options) error {
cniServer := cniserver.New(
o.config.CNISocket,
o.config.HostProcPathPrefix,
o.config.DefaultMTU,
nodeConfig,
k8sClient,
podUpdates,
Expand Down
28 changes: 0 additions & 28 deletions cmd/antrea-agent/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,6 @@ const (
defaultHostProcPathPrefix = "/host"
defaultServiceCIDR = "10.96.0.0/12"
defaultTunnelType = ovsconfig.GeneveTunnel
defaultMTUGeneve = 1450
defaultMTUVXLAN = 1450
defaultMTUGRE = 1462
defaultMTUSTT = 1500
defaultMTU = 1500
// IPsec ESP can add a maximum of 38 bytes to the packet including the ESP
// header and trailer.
ipsecESPOverhead = 38
)

type Options struct {
Expand Down Expand Up @@ -148,26 +140,6 @@ func (o *Options) setDefaults() {
if o.config.TrafficEncapMode == "" {
o.config.TrafficEncapMode = config.TrafficEncapModeEncap.String()
}

if o.config.DefaultMTU == 0 {
ok, encapMode := config.GetTrafficEncapModeFromStr(o.config.TrafficEncapMode)
if ok && !encapMode.SupportsEncap() {
o.config.DefaultMTU = defaultMTU
} else if o.config.TunnelType == ovsconfig.VXLANTunnel {
o.config.DefaultMTU = defaultMTUVXLAN
} else if o.config.TunnelType == ovsconfig.GeneveTunnel {
o.config.DefaultMTU = defaultMTUGeneve
} else if o.config.TunnelType == ovsconfig.GRETunnel {
o.config.DefaultMTU = defaultMTUGRE
} else if o.config.TunnelType == ovsconfig.STTTunnel {
o.config.DefaultMTU = defaultMTUSTT
}

if o.config.EnableIPSecTunnel {
o.config.DefaultMTU -= ipsecESPOverhead
}
}

if o.config.APIPort == 0 {
o.config.APIPort = apis.AntreaAgentAPIPort
}
Expand Down
6 changes: 3 additions & 3 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ Use `antrea-agent -h` to see complete options.
# for the GRE tunnel type.
#enableIPSecTunnel: false

# Default MTU to use for the host gateway interface and the network interface of
# each Pod. If omitted, antrea-agent will default this value to 1450 to accommodate
# for tunnel encapsulate overhead.
# Default MTU to use for the host gateway interface and the network interface of each Pod.
# If omitted, antrea-agent will discover the MTU of the Node's primary interface
# also adjust MTU to accommodate for tunnel encapsulate overhead (if applicable).
#defaultMTU: 1450

# CIDR Range for services in cluster. It's required to support egress network policy, should
Expand Down
5 changes: 2 additions & 3 deletions docs/eks-installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ deployment yaml at:
https://raw.githubusercontent.com/vmware-tanzu/antrea/master/build/yamls/antrea-eks.yml
```

Based on EKS worker Node MTU size and Kubernetes service cluster IP range, adjust
``defaultMTU`` and ``serviceCIDR`` values of antrea-agent.conf in antrea-eks.yml
accordingly, and apply antrea-eks.yml to the EKS cluster.
Based on Kubernetes service cluster IP range, adjust ``serviceCIDR`` values of antrea-agent.conf
in antrea-eks.yml accordingly, and apply antrea-eks.yml to the EKS cluster.

```bash
kubectl apply -f antrea-eks.yaml
Expand Down
4 changes: 2 additions & 2 deletions docs/gke-installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ For any given release `<TAG>` (e.g. `v0.5.0`), get the Antrea GKE deployment yam
https://raw.githubusercontent.com/vmware-tanzu/antrea/master/build/yamls/antrea-gke.yml
````

Update ``defaultMTU`` (default is 1500) and ``serviceCIDR`` value of antrea-agent.conf in antrea-gke.yml with
GKE_SERVICE_CIDR selected at the time of deploying GKE cluster.
Update ``serviceCIDR`` value of antrea-agent.conf in antrea-gke.yml with GKE_SERVICE_CIDR selected at the time of
deploying GKE cluster.

3. Deploy Antrea

Expand Down
41 changes: 36 additions & 5 deletions pkg/agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ type Initializer struct {
routeClient route.Interface
ifaceStore interfacestore.InterfaceStore
ovsBridge string
hostGateway string // name of gateway port on the OVS bridge
mtu int // Pod network interface MTU
hostGateway string // name of gateway port on the OVS bridge
mtu int
serviceCIDR *net.IPNet // K8s Service ClusterIP CIDR
networkConfig *config.NetworkConfig
nodeConfig *config.NodeConfig
Expand Down Expand Up @@ -412,9 +412,9 @@ func (i *Initializer) setupGatewayInterface() error {
// Idempotent operation to set the gateway's MTU: we perform this operation regardless of
// whether or not the gateway interface already exists, as the desired MTU may change across
// restarts.
klog.V(4).Infof("Setting gateway interface %s MTU to %d", i.hostGateway, i.mtu)
klog.V(4).Infof("Setting gateway interface %s MTU to %d", i.hostGateway, i.nodeConfig.NodeMTU)

i.ovsBridgeClient.SetInterfaceMTU(i.hostGateway, i.mtu)
i.ovsBridgeClient.SetInterfaceMTU(i.hostGateway, i.nodeConfig.NodeMTU)
if err := i.configureGatewayInterface(gatewayIface); err != nil {
return err
}
Expand Down Expand Up @@ -543,16 +543,23 @@ func (i *Initializer) initNodeLocalConfig() error {
if err != nil {
return fmt.Errorf("failed to obtain local IP address from k8s: %w", err)
}
localAddr, _, err := util.GetIPNetDeviceFromIP(ipAddr)
localAddr, localIntf, err := util.GetIPNetDeviceFromIP(ipAddr)
if err != nil {
return fmt.Errorf("failed to get local IPNet: %v", err)
}

mtu, err := i.getNodeMTU(localIntf)
if err != nil {
return err
}
klog.Infof("Setting Node MTU=%d", mtu)

i.nodeConfig = &config.NodeConfig{
Name: nodeName,
OVSBridge: i.ovsBridge,
DefaultTunName: defaultTunInterfaceName,
NodeIPAddr: localAddr,
NodeMTU: mtu,
UplinkNetConfig: new(config.AdapterNetConfig)}

if i.networkConfig.TrafficEncapMode.IsNetworkPolicyOnly() {
Expand Down Expand Up @@ -641,3 +648,27 @@ func getRoundInfo(bridgeClient ovsconfig.OVSBridgeClient) types.RoundInfo {

return roundInfo
}

func (i *Initializer) getNodeMTU(localIntf *net.Interface) (int, error) {
if i.mtu != 0 {
return i.mtu, nil
}
mtu := localIntf.MTU
// Make sure mtu is set on the interface.
if mtu <= 0 {
return 0, fmt.Errorf("Failed to fetch node mtu : %v", mtu)
}
if i.networkConfig.TrafficEncapMode.SupportsEncap() {
if i.networkConfig.TunnelType == ovsconfig.VXLANTunnel {
mtu -= config.VXLANOverhead
} else if i.networkConfig.TunnelType == ovsconfig.GeneveTunnel {
mtu -= config.GeneveOverhead
} else if i.networkConfig.TunnelType == ovsconfig.GRETunnel {
mtu -= config.GREOverhead
}
}
if i.networkConfig.EnableIPSecTunnel {
mtu -= config.IpsecESPOverhead
}
return mtu, nil
}
Loading

0 comments on commit 1cdc739

Please sign in to comment.