filter.NewDiscoveryNamespacesFilter(c.nsInformer.Lister(), options.MeshWatcher.Mesh().DiscoverySelectors)
// handle discovery namespace membership changes triggered by namespace events,
c.initDiscoveryHandlers(kubeClient, options.EndpointMode, options.MeshWatcher, c.discoveryNamespacesFilter)-->
c.initDiscoveryNamespaceHandlers(kubeClient, endpointMode, discoveryNamespacesFilter)-->
c.handleSelectedNamespace()-->
// list each service/pod/ep/epslice in the namespace and process add event
c.onServiceEvent(svc, model.EventAdd)
c.pods.onEvent(pod, model.EventAdd)
c.endpoints.onEvent(ep, model.EventAdd)
// handle discovery namespace membership changes triggered by changes to meshConfig's discovery selectors
c.initMeshWatcherHandler(kubeClient, endpointMode, meshWatcher, discoveryNamespacesFilter)
**registerHandlers(c.serviceInformer, c.queue, "Services", c.onServiceEvent, nil)-->**
q.Push()
//============= onServiceEvent is handler for service event
onServiceEvent()-->
kube.ConvertService()// convert k8s service, persist lbAddr
needsFullPush := extractGatewaysFromService()// extract gateway for LB type service which selector gateways, TODO: need to check performance impact when there are thousands of gw services
extractGatewaysInner()-->
getGatewayDetails()// get cross network port(networking.istio.io/gatewayPort 15443) and network(topology.istio.io/network), return empty result when network is not specified
if gwPort == 0 || network == "" {return false} // important, if has such settings, service change will trigger fullPush
if gwPort changed or network changed {return true}
if needsFullPush {
c.xdsUpdater.ConfigUpdate(&model.PushRequest{Full: true, Reason: []model.TriggerReason{model.NetworksTrigger}})
}
c.endpoints.buildIstioEndpointsWithService(svc.Name, svc.Namespace, svcConv.Hostname)-->
buildIstioEndpoints()--》
NewEndpointBuilder(e.c, pod)
builder.buildIstioEndpoint(ea.IP, port.Port, port.Name)
c.xdsUpdater.EDSCacheUpdate(c.clusterID, string(svcConv.Hostname), svc.Namespace, endpoints)
c.xdsUpdater.SvcUpdate(c.clusterID, string(svcConv.Hostname), svc.Namespace, event)
// Notify service handlers.
for _, f := range c.serviceHandlers {
f(svcConv, event)// m.XDSUpdater.ConfigUpdate(req)
}
//==============
newEndpointsController()-->
**registerHandlers(informer, c.queue, "Endpoints", out.onEvent, endpointsEqual)**
//================out.onEvent()
// processEndpointEvent triggers the config update.
processEndpointEvent()-->
updateEDS(c, epc, ep, event)-->
c.xdsUpdater.EDSUpdate(c.clusterID, string(host), ns, endpoints)
//================
newEndpointSliceController()
**registerHandlers(c.nodeInformer, c.queue, "Nodes", c.onNodeEvent, nil)**
//================c.onNodeEvent()
// no nodePort gateway service found, no update
//================
**registerHandlers(c.pods.informer, c.queue, "Pods", c.pods.onEvent, nil)**
//================c.pods.onEvent()
// add to cache if the pod is running or pending
pc.update(ip, key)
// find all related services and update CDS
// handler is registerred in pilot/pkg/serviceregistry/kube/controller/controller.go:WorkloadInstanceHandler
WorkloadInstanceHandler()
//================