Skip to content

Commit

Permalink
l2: exclude common virtual interfaces for announce services
Browse files Browse the repository at this point in the history
In arp mode, Some common virtual interfaces should not be used to announce services, such as kube-ipvs0, docker0, etc. This PR will dispatch these common virtual interfaces.

Signed-off-by: cyclinder <qifeng.guo@daocloud.io>
  • Loading branch information
cyclinder committed Mar 14, 2023
1 parent 6a5ad67 commit 98eebdd
Show file tree
Hide file tree
Showing 14 changed files with 182 additions and 11 deletions.
1 change: 1 addition & 0 deletions charts/metallb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ Kubernetes: `>= 1.19.0-0`
| rbac.create | bool | `true` | |
| speaker.affinity | object | `{}` | |
| speaker.enabled | bool | `true` | |
| speaker.excludeInterfaces.enabled | bool | `true` | |
| speaker.frr.enabled | bool | `false` | |
| speaker.frr.image.pullPolicy | string | `nil` | |
| speaker.frr.image.repository | string | `"quay.io/frrouting/frr"` | |
Expand Down
22 changes: 22 additions & 0 deletions charts/metallb/templates/confgmap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{{- if .Values.speaker.excludeInterfaces.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: metallb-conf
data:
conf.yaml: |
announcedInterfacesToExclude:
- docker.*
- cbr.*
- dummy.*
- virbr.*
- lxcbr.*
- veth.*
- lo
- ^cali.*
- ^tunl.*
- flannel.*
- kube-ipvs.*
- cni.*
- ^nodelocaldns.*
{{- end }}
12 changes: 11 additions & 1 deletion charts/metallb/templates/speaker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ spec:
secretName: {{ include "metallb.secretName" . }}
defaultMode: 420
{{- end }}
{{- if .Values.speaker.excludeInterfaces.enabled }}
- name: metallb-conf
configMap:
defaultMode: 256
name: metallb-conf
{{- end }}
{{- if .Values.speaker.frr.enabled }}
- name: frr-sockets
emptyDir: {}
Expand Down Expand Up @@ -291,7 +297,7 @@ spec:
- ALL
add:
- NET_RAW
{{- if or .Values.speaker.frr.enabled .Values.speaker.memberlist.enabled }}
{{- if or .Values.speaker.frr.enabled .Values.speaker.memberlist.enabled .Values.speaker.excludeInterfaces.enabled }}
volumeMounts:
{{- if .Values.speaker.memberlist.enabled }}
- name: memberlist
Expand All @@ -301,6 +307,10 @@ spec:
- name: reloader
mountPath: /etc/frr_reloader
{{- end }}
{{- if .Values.speaker.excludeInterfaces.enabled }}
- name: metallb-conf
mountPath: /etc/metallb
{{- end }}
{{- end }}
{{- if .Values.speaker.frr.enabled }}
- name: frr
Expand Down
8 changes: 8 additions & 0 deletions charts/metallb/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,14 @@
}
}
},
"excludeInterfaces": {
"type": "object",
"properties": {
"configPath": {
"type": "boolean"
}
}
},
"updateStrategy": {
"type": "object",
"properties": {
Expand Down
2 changes: 2 additions & 0 deletions charts/metallb/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,8 @@ speaker:
enabled: true
mlBindPort: 7946
mlSecretKeyPath: "/etc/ml_secret_key"
excludeInterfaces:
enabled: true
image:
repository: quay.io/metallb/speaker
tag:
Expand Down
7 changes: 7 additions & 0 deletions config/controllers/speaker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ spec:
- mountPath: /etc/ml_secret_key
name: memberlist
readOnly: true
- mountPath: /etc/metallb
name: metallb-conf
readOnly: true
hostNetwork: true
nodeSelector:
kubernetes.io/os: linux
Expand All @@ -102,3 +105,7 @@ spec:
secret:
secretName: memberlist
defaultMode: 420
- name: metallb-conf
configMap:
defaultMode: 256
name: metallb-conf
16 changes: 16 additions & 0 deletions config/manifests/metallb-frr-prometheus.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1813,6 +1813,15 @@ metadata:
namespace: metallb-system
---
apiVersion: v1
data:
conf.yaml: |
announcedInterfacesToExclude: ["docker.*", "cbr.*", "dummy.*", "virbr.*", "lxcbr.*", "veth.*", "lo", "^cali.*", "^tunl.*", "flannel.*", "kube-ipvs.*", "cni.*", "^nodelocaldns.*"]
kind: ConfigMap
metadata:
name: metallb-conf
namespace: metallb-system
---
apiVersion: v1
kind: Secret
metadata:
name: webhook-server-cert
Expand Down Expand Up @@ -2194,6 +2203,9 @@ spec:
- mountPath: /etc/ml_secret_key
name: memberlist
readOnly: true
- mountPath: /etc/metallb
name: metallb-conf
readOnly: true
hostNetwork: true
initContainers:
- command:
Expand Down Expand Up @@ -2256,6 +2268,10 @@ spec:
secret:
defaultMode: 420
secretName: memberlist
- configMap:
defaultMode: 256
name: metallb-conf
name: metallb-conf
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
Expand Down
16 changes: 16 additions & 0 deletions config/manifests/metallb-frr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1758,6 +1758,15 @@ metadata:
namespace: metallb-system
---
apiVersion: v1
data:
conf.yaml: |
announcedInterfacesToExclude: ["docker.*", "cbr.*", "dummy.*", "virbr.*", "lxcbr.*", "veth.*", "lo", "^cali.*", "^tunl.*", "flannel.*", "kube-ipvs.*", "cni.*", "^nodelocaldns.*"]
kind: ConfigMap
metadata:
name: metallb-conf
namespace: metallb-system
---
apiVersion: v1
kind: Secret
metadata:
name: webhook-server-cert
Expand Down Expand Up @@ -2017,6 +2026,9 @@ spec:
- mountPath: /etc/ml_secret_key
name: memberlist
readOnly: true
- mountPath: /etc/metallb
name: metallb-conf
readOnly: true
hostNetwork: true
initContainers:
- command:
Expand Down Expand Up @@ -2079,6 +2091,10 @@ spec:
secret:
defaultMode: 420
secretName: memberlist
- configMap:
defaultMode: 256
name: metallb-conf
name: metallb-conf
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
Expand Down
16 changes: 16 additions & 0 deletions config/manifests/metallb-native-prometheus.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1715,6 +1715,15 @@ subjects:
namespace: metallb-system
---
apiVersion: v1
data:
conf.yaml: |
announcedInterfacesToExclude: ["docker.*", "cbr.*", "dummy.*", "virbr.*", "lxcbr.*", "veth.*", "lo", "^cali.*", "^tunl.*", "flannel.*", "kube-ipvs.*", "cni.*", "^nodelocaldns.*"]
kind: ConfigMap
metadata:
name: metallb-conf
namespace: metallb-system
---
apiVersion: v1
kind: Secret
metadata:
name: webhook-server-cert
Expand Down Expand Up @@ -1988,6 +1997,9 @@ spec:
- mountPath: /etc/ml_secret_key
name: memberlist
readOnly: true
- mountPath: /etc/metallb
name: metallb-conf
readOnly: true
hostNetwork: true
nodeSelector:
kubernetes.io/os: linux
Expand All @@ -2005,6 +2017,10 @@ spec:
secret:
defaultMode: 420
secretName: memberlist
- configMap:
defaultMode: 256
name: metallb-conf
name: metallb-conf
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
Expand Down
16 changes: 16 additions & 0 deletions config/manifests/metallb-native.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1660,6 +1660,15 @@ subjects:
namespace: metallb-system
---
apiVersion: v1
data:
conf.yaml: |
announcedInterfacesToExclude: ["docker.*", "cbr.*", "dummy.*", "virbr.*", "lxcbr.*", "veth.*", "lo", "^cali.*", "^tunl.*", "flannel.*", "kube-ipvs.*", "cni.*", "^nodelocaldns.*"]
kind: ConfigMap
metadata:
name: metallb-conf
namespace: metallb-system
---
apiVersion: v1
kind: Secret
metadata:
name: webhook-server-cert
Expand Down Expand Up @@ -1842,6 +1851,9 @@ spec:
- mountPath: /etc/ml_secret_key
name: memberlist
readOnly: true
- mountPath: /etc/metallb
name: metallb-conf
readOnly: true
hostNetwork: true
nodeSelector:
kubernetes.io/os: linux
Expand All @@ -1859,6 +1871,10 @@ spec:
secret:
defaultMode: 420
secretName: memberlist
- configMap:
defaultMode: 256
name: metallb-conf
name: metallb-conf
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
Expand Down
8 changes: 8 additions & 0 deletions config/native/configmap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: metallb-conf
namespace: metallb-system
data:
conf.yaml: |
announcedInterfacesToExclude: ["docker.*", "cbr.*", "dummy.*", "virbr.*", "lxcbr.*", "veth.*", "lo", "^cali.*", "^tunl.*", "flannel.*", "kube-ipvs.*", "cni.*", "^nodelocaldns.*"]
1 change: 1 addition & 0 deletions config/native/kustomization.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ns.yaml
- configmap.yaml
- ../crd
- ../rbac
- ../controllers
Expand Down
14 changes: 12 additions & 2 deletions internal/layer2/announcer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package layer2
import (
"net"
"os"
"regexp"
"strconv"
"sync"
"time"
Expand All @@ -26,11 +27,12 @@ type Announce struct {

// This channel can block - do not write to it while holding the mutex
// to avoid deadlocking.
spamCh chan IPAdvertisement
spamCh chan IPAdvertisement
excludeRegexp *regexp.Regexp
}

// New returns an initialized Announce.
func New(l log.Logger) (*Announce, error) {
func New(l log.Logger, excludeRegexp *regexp.Regexp) (*Announce, error) {
ret := &Announce{
logger: l,
nodeInterfaces: []string{},
Expand All @@ -39,7 +41,9 @@ func New(l log.Logger) (*Announce, error) {
ips: map[string][]IPAdvertisement{},
ipRefcnt: map[string]int{},
spamCh: make(chan IPAdvertisement, 1024),
excludeRegexp: excludeRegexp,
}

go ret.interfaceScan()
go ret.spamLoop()

Expand Down Expand Up @@ -67,6 +71,12 @@ func (a *Announce) updateInterfaces() {
curIfs := make([]string, 0, len(ifs))
for _, intf := range ifs {
ifi := intf

if (a.excludeRegexp != nil) && a.excludeRegexp.MatchString(ifi.Name) {
level.Info(a.logger).Log("event", "announced interface to exclude", "interface", ifi.Name)
continue
}

curIfs = append(curIfs, ifi.Name)
l := log.With(a.logger, "interface", ifi.Name)
addrs, err := ifi.Addrs()
Expand Down

0 comments on commit 98eebdd

Please sign in to comment.