diff --git a/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/controller-manager/4.11-endpointslice-controller.md b/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/controller-manager/4.11-endpointslice-controller.md index d625a3a..80f46b5 100644 --- a/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/controller-manager/4.11-endpointslice-controller.md +++ b/k8s-yuan-ma-ren-cai-fu-hua-xun-lian-ying/controller-manager/4.11-endpointslice-controller.md @@ -358,11 +358,77 @@ func (c *Controller) syncService(logger klog.Logger, key string) error { **c.reconciler.reconcile()** -存放切片的变量:数组 slicesToDelete , map slicesByAddressType +声明了两个切片 slicesToDelete , map slicesByAddressType 1. 检查 endpointSlice 的 AddressType ,没匹配到类型的加入到 slicesToDelete 数组等待删除。匹配到响应的地址类型的 endpointSlice 加入到 slicesByAddressType 数组。 2. 不同地址类型的 endpointSlice 都会调用 r.reconcileByAddressType() 函数去调谐,传的参数里面就包含了地址类型。 +```go +// Reconcile takes a set of pods currently matching a service selector and +// compares them with the endpoints already present in any existing endpoint +// slices for the given service. It creates, updates, or deletes endpoint slices +// to ensure the desired set of pods are represented by endpoint slices. +func (r *Reconciler) Reconcile(logger klog.Logger, service *corev1.Service, pods []*corev1.Pod, existingSlices []*discovery.EndpointSlice, triggerTime time.Time) error { + slicesToDelete := []*discovery.EndpointSlice{} // slices that are no longer matching any address the service has + errs := []error{} // all errors generated in the process of reconciling + slicesByAddressType := make(map[discovery.AddressType][]*discovery.EndpointSlice) // slices by address type + + // addresses that this service supports [o(1) find] + serviceSupportedAddressesTypes := getAddressTypesForService(logger, service) + + // loop through slices identifying their address type. + // slices that no longer match address type supported by services + // go to delete, other slices goes to the Reconciler machinery + // for further adjustment + for _, existingSlice := range existingSlices { + // service no longer supports that address type, add it to deleted slices + if !serviceSupportedAddressesTypes.Has(existingSlice.AddressType) { + if r.topologyCache != nil { + svcKey, err := ServiceControllerKey(existingSlice) + if err != nil { + logger.Info("Couldn't get key to remove EndpointSlice from topology cache", "existingSlice", existingSlice, "err", err) + } else { + r.topologyCache.RemoveHints(svcKey, existingSlice.AddressType) + } + } + + slicesToDelete = append(slicesToDelete, existingSlice) + continue + } + + // add list if it is not on our map + if _, ok := slicesByAddressType[existingSlice.AddressType]; !ok { + slicesByAddressType[existingSlice.AddressType] = make([]*discovery.EndpointSlice, 0, 1) + } + + slicesByAddressType[existingSlice.AddressType] = append(slicesByAddressType[existingSlice.AddressType], existingSlice) + } + + // reconcile for existing. + for addressType := range serviceSupportedAddressesTypes { + existingSlices := slicesByAddressType[addressType] + err := r.reconcileByAddressType(logger, service, pods, existingSlices, triggerTime, addressType) + if err != nil { + errs = append(errs, err) + } + } + + // delete those which are of addressType that is no longer supported + // by the service + for _, sliceToDelete := range slicesToDelete { + err := r.client.DiscoveryV1().EndpointSlices(service.Namespace).Delete(context.TODO(), sliceToDelete.Name, metav1.DeleteOptions{}) + if err != nil { + errs = append(errs, fmt.Errorf("error deleting %s EndpointSlice for Service %s/%s: %w", sliceToDelete.Name, service.Namespace, service.Name, err)) + } else { + r.endpointSliceTracker.ExpectDeletion(sliceToDelete) + metrics.EndpointSliceChanges.WithLabelValues("delete").Inc() + } + } + + return utilerrors.NewAggregate(errs) +} +``` + **r.reconcileByAddressType()** 1. 数组 slicesToCreate 、 slicesToUpdate 、 slicesToDelete 。