From ee8a7e4555db7990b65f5dbf5780670c58876e25 Mon Sep 17 00:00:00 2001 From: Pulkit Jain Date: Fri, 1 Dec 2023 18:14:52 +0530 Subject: [PATCH] Improve Egress API visibility Record event when Egress is assigned to a node. Signed-off-by: Pulkit Jain --- .../antrea/templates/agent/clusterrole.yaml | 6 +++++ cmd/antrea-agent/agent.go | 2 +- .../controller/egress/egress_controller.go | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/build/charts/antrea/templates/agent/clusterrole.yaml b/build/charts/antrea/templates/agent/clusterrole.yaml index 7db11aebb8e..5b4f526af5f 100644 --- a/build/charts/antrea/templates/agent/clusterrole.yaml +++ b/build/charts/antrea/templates/agent/clusterrole.yaml @@ -219,3 +219,9 @@ rules: - get - list - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create diff --git a/cmd/antrea-agent/agent.go b/cmd/antrea-agent/agent.go index 92b7ae82710..dd17631e5cf 100644 --- a/cmd/antrea-agent/agent.go +++ b/cmd/antrea-agent/agent.go @@ -512,7 +512,7 @@ func run(o *Options) error { } if o.enableEgress { egressController, err = egress.NewEgressController( - ofClient, antreaClientProvider, crdClient, ifaceStore, routeClient, nodeConfig.Name, nodeConfig.NodeTransportInterfaceName, + k8sClient, ofClient, antreaClientProvider, crdClient, ifaceStore, routeClient, nodeConfig.Name, nodeConfig.NodeTransportInterfaceName, memberlistCluster, egressInformer, nodeInformer, podUpdateChannel, serviceCIDRProvider, o.config.Egress.MaxEgressIPsPerNode, features.DefaultFeatureGate.Enabled(features.EgressTrafficShaping), ) diff --git a/pkg/agent/controller/egress/egress_controller.go b/pkg/agent/controller/egress/egress_controller.go index 00d50d668af..b55699d51ca 100644 --- a/pkg/agent/controller/egress/egress_controller.go +++ b/pkg/agent/controller/egress/egress_controller.go @@ -29,15 +29,21 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" coreinformers "k8s.io/client-go/informers/core/v1" + "k8s.io/client-go/kubernetes" + scheme2 "k8s.io/client-go/kubernetes/scheme" + v1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" "k8s.io/client-go/util/retry" "k8s.io/client-go/util/workqueue" "k8s.io/klog/v2" + "antrea.io/antrea/multicluster/pkg/client/clientset/versioned/scheme" "antrea.io/antrea/pkg/agent" "antrea.io/antrea/pkg/agent/interfacestore" "antrea.io/antrea/pkg/agent/ipassigner" @@ -175,9 +181,12 @@ type EgressController struct { serviceCIDRUpdateRetryDelay time.Duration trafficShapingEnabled bool + + record record.EventRecorder } func NewEgressController( + client kubernetes.Interface, ofClient openflow.Client, antreaClientGetter agent.AntreaClientProvider, crdClient clientsetversioned.Interface, @@ -196,6 +205,18 @@ func NewEgressController( if trafficShapingEnabled && !openflow.OVSMetersAreSupported() { klog.Info("EgressTrafficShaping feature gate is enabled, but it is ignored because OVS meters are not supported.") } + + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartStructuredLogging(0) + runtime.Must(scheme.AddToScheme(scheme2.Scheme)) + eventBroadcaster.StartRecordingToSink(&v1.EventSinkImpl{ + Interface: client.CoreV1().Events(""), + }) + recorder := eventBroadcaster.NewRecorder( + scheme2.Scheme, + corev1.EventSource{Component: "antrea-agent"}, + ) + c := &EgressController{ ofClient: ofClient, routeClient: routeClient, @@ -220,6 +241,8 @@ func NewEgressController( serviceCIDRUpdateRetryDelay: 10 * time.Second, trafficShapingEnabled: openflow.OVSMetersAreSupported() && trafficShapingEnabled, + + record: recorder, } ipAssigner, err := newIPAssigner(nodeTransportInterface, egressDummyDevice) if err != nil { @@ -851,6 +874,7 @@ func (c *EgressController) syncEgress(egressName string) error { if err := c.ipAssigner.AssignIP(desiredEgressIP, egress.Status.EgressNode != c.nodeName); err != nil { return err } + c.record.Eventf(egress, corev1.EventTypeNormal, "IPAssigned", "Assigned %s to %s", egress.Name, desiredNode) } else { // Unassign the Egress IP from the local Node if it was assigned by the agent. if err := c.ipAssigner.UnassignIP(desiredEgressIP); err != nil {