Skip to content

Commit 6ca629d

Browse files
authored
Merge pull request kubernetes#126769 from Sakuralbj/headless-service-kubeproxy
don't watch headless services on kube-proxy
2 parents ad6ed13 + 9064bfb commit 6ca629d

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

cmd/kube-proxy/app/server.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,13 @@ func (s *ProxyServer) Run(ctx context.Context) error {
537537
// Note: RegisterHandler() calls need to happen before creation of Sources because sources
538538
// only notify on changes, and the initial update (on process start) may be lost if no handlers
539539
// are registered yet.
540-
serviceConfig := config.NewServiceConfig(ctx, informerFactory.Core().V1().Services(), s.Config.ConfigSyncPeriod.Duration)
540+
// don't watch headless services for kube-proxy, they are proxied by DNS.
541+
serviceInformerFactory := informers.NewSharedInformerFactoryWithOptions(s.Client, s.Config.ConfigSyncPeriod.Duration,
542+
informers.WithTweakListOptions(func(options *metav1.ListOptions) {
543+
options.LabelSelector = labelSelector.String()
544+
options.FieldSelector = fields.OneTermNotEqualSelector("spec.clusterIP", v1.ClusterIPNone).String()
545+
}))
546+
serviceConfig := config.NewServiceConfig(ctx, serviceInformerFactory.Core().V1().Services(), s.Config.ConfigSyncPeriod.Duration)
541547
serviceConfig.RegisterEventHandler(s.Proxier)
542548
go serviceConfig.Run(ctx.Done())
543549

@@ -553,6 +559,7 @@ func (s *ProxyServer) Run(ctx context.Context) error {
553559
// This has to start after the calls to NewServiceConfig because that
554560
// function must configure its shared informer event handlers first.
555561
informerFactory.Start(wait.NeverStop)
562+
serviceInformerFactory.Start(wait.NeverStop)
556563

557564
// Make an informer that selects for our nodename.
558565
currentNodeInformerFactory := informers.NewSharedInformerFactoryWithOptions(s.Client, s.Config.ConfigSyncPeriod.Duration,

pkg/registry/core/service/strategy_test.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ import (
2121
"testing"
2222

2323
"github.com/google/go-cmp/cmp"
24+
v1 "k8s.io/api/core/v1"
2425
"k8s.io/apimachinery/pkg/api/errors"
2526
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627
"k8s.io/apimachinery/pkg/fields"
2728
"k8s.io/apimachinery/pkg/labels"
29+
"k8s.io/apimachinery/pkg/selection"
2830
"k8s.io/apimachinery/pkg/util/intstr"
2931
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
3032
"k8s.io/apiserver/pkg/registry/rest"
@@ -789,10 +791,16 @@ func TestDropTypeDependentFields(t *testing.T) {
789791
}
790792

791793
func TestMatchService(t *testing.T) {
794+
noHeadlessServiceRequirement, err := labels.NewRequirement(v1.IsHeadlessService, selection.DoesNotExist, nil)
795+
if err != nil {
796+
t.Fatalf("Error creating no headless service requirement: %v", err)
797+
}
798+
noHeadlessServiceLabelSelector := labels.NewSelector().Add(*noHeadlessServiceRequirement)
792799
testCases := []struct {
793800
name string
794801
in *api.Service
795802
fieldSelector fields.Selector
803+
labelSelector labels.Selector
796804
expectMatch bool
797805
}{
798806
{
@@ -805,6 +813,7 @@ func TestMatchService(t *testing.T) {
805813
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
806814
},
807815
fieldSelector: fields.ParseSelectorOrDie("metadata.name=test"),
816+
labelSelector: labels.Everything(),
808817
expectMatch: true,
809818
},
810819
{
@@ -817,6 +826,7 @@ func TestMatchService(t *testing.T) {
817826
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
818827
},
819828
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=testns"),
829+
labelSelector: labels.Everything(),
820830
expectMatch: true,
821831
},
822832
{
@@ -829,6 +839,7 @@ func TestMatchService(t *testing.T) {
829839
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
830840
},
831841
fieldSelector: fields.ParseSelectorOrDie("metadata.name=nomatch"),
842+
labelSelector: labels.Everything(),
832843
expectMatch: false,
833844
},
834845
{
@@ -841,6 +852,7 @@ func TestMatchService(t *testing.T) {
841852
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
842853
},
843854
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=nomatch"),
855+
labelSelector: labels.Everything(),
844856
expectMatch: false,
845857
},
846858
{
@@ -849,6 +861,7 @@ func TestMatchService(t *testing.T) {
849861
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
850862
},
851863
fieldSelector: fields.ParseSelectorOrDie("spec.type=LoadBalancer"),
864+
labelSelector: labels.Everything(),
852865
expectMatch: true,
853866
},
854867
{
@@ -857,6 +870,7 @@ func TestMatchService(t *testing.T) {
857870
Spec: api.ServiceSpec{Type: api.ServiceTypeNodePort},
858871
},
859872
fieldSelector: fields.ParseSelectorOrDie("spec.type=LoadBalancer"),
873+
labelSelector: labels.Everything(),
860874
expectMatch: false,
861875
},
862876
{
@@ -865,6 +879,7 @@ func TestMatchService(t *testing.T) {
865879
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
866880
},
867881
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=None"),
882+
labelSelector: labels.Everything(),
868883
expectMatch: true,
869884
},
870885
{
@@ -873,6 +888,7 @@ func TestMatchService(t *testing.T) {
873888
Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"},
874889
},
875890
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=None"),
891+
labelSelector: labels.Everything(),
876892
expectMatch: false,
877893
},
878894
{
@@ -881,6 +897,7 @@ func TestMatchService(t *testing.T) {
881897
Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"},
882898
},
883899
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=192.168.1.1"),
900+
labelSelector: labels.Everything(),
884901
expectMatch: true,
885902
},
886903
{
@@ -889,6 +906,7 @@ func TestMatchService(t *testing.T) {
889906
Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"},
890907
},
891908
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP!=None"),
909+
labelSelector: labels.Everything(),
892910
expectMatch: true,
893911
},
894912
{
@@ -897,6 +915,7 @@ func TestMatchService(t *testing.T) {
897915
Spec: api.ServiceSpec{ClusterIP: "192.168.1.1"},
898916
},
899917
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP!=\"\""),
918+
labelSelector: labels.Everything(),
900919
expectMatch: true,
901920
},
902921
{
@@ -905,6 +924,7 @@ func TestMatchService(t *testing.T) {
905924
Spec: api.ServiceSpec{ClusterIP: "2001:db2::1"},
906925
},
907926
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=2001:db2::1"),
927+
labelSelector: labels.Everything(),
908928
expectMatch: true,
909929
},
910930
{
@@ -913,6 +933,7 @@ func TestMatchService(t *testing.T) {
913933
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
914934
},
915935
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=192.168.1.1"),
936+
labelSelector: labels.Everything(),
916937
expectMatch: false,
917938
},
918939
{
@@ -921,18 +942,49 @@ func TestMatchService(t *testing.T) {
921942
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
922943
},
923944
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=2001:db2::1"),
945+
labelSelector: labels.Everything(),
924946
expectMatch: false,
925947
},
926948
{
927949
name: "no match on empty service",
928950
in: &api.Service{},
929951
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP=None"),
952+
labelSelector: labels.Everything(),
953+
expectMatch: false,
954+
},
955+
{
956+
name: "no match on headless service",
957+
in: &api.Service{
958+
ObjectMeta: metav1.ObjectMeta{
959+
Labels: map[string]string{
960+
v1.IsHeadlessService: "",
961+
},
962+
},
963+
},
964+
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP!=None"),
965+
labelSelector: noHeadlessServiceLabelSelector,
966+
expectMatch: false,
967+
},
968+
{
969+
name: "no match on headless service",
970+
in: &api.Service{
971+
Spec: api.ServiceSpec{ClusterIP: api.ClusterIPNone},
972+
},
973+
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP!=None"),
974+
labelSelector: noHeadlessServiceLabelSelector,
930975
expectMatch: false,
931976
},
977+
{
978+
name: "match on empty service",
979+
in: &api.Service{},
980+
fieldSelector: fields.ParseSelectorOrDie("spec.clusterIP!=None"),
981+
labelSelector: noHeadlessServiceLabelSelector,
982+
expectMatch: true,
983+
},
932984
}
933985
for _, testCase := range testCases {
934986
t.Run(testCase.name, func(t *testing.T) {
935-
m := Matcher(labels.Everything(), testCase.fieldSelector)
987+
m := Matcher(testCase.labelSelector, testCase.fieldSelector)
936988
result, err := m.Matches(testCase.in)
937989
if err != nil {
938990
t.Errorf("Unexpected error %v", err)

0 commit comments

Comments
 (0)