kube-proxy dual-stack infers IP family from ClusterIP

when dual-stack kube-proxy infers the service IP family from
the ClusterIP because ipFamily field is going to be deprecated.

Since kube-proxy skip headless and externalname services we
can safely obtain the IPFamily from the ClusterIP field

Signed-off-by: Antonio Ojea <antonio.ojea.garcia@gmail.com>
This commit is contained in:
Antonio Ojea 2020-05-22 10:58:04 +02:00
parent a46e1f0613
commit c7a29774c9
2 changed files with 22 additions and 12 deletions

View File

@ -9,6 +9,7 @@ go_library(
deps = [ deps = [
"//pkg/proxy:go_default_library", "//pkg/proxy:go_default_library",
"//pkg/proxy/config:go_default_library", "//pkg/proxy/config:go_default_library",
"//pkg/proxy/util:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library",

View File

@ -19,10 +19,11 @@ package metaproxier
import ( import (
"fmt" "fmt"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy"
"k8s.io/kubernetes/pkg/proxy/config" "k8s.io/kubernetes/pkg/proxy/config"
utilproxy "k8s.io/kubernetes/pkg/proxy/util"
utilnet "k8s.io/utils/net" utilnet "k8s.io/utils/net"
@ -62,33 +63,41 @@ func (proxier *metaProxier) SyncLoop() {
// OnServiceAdd is called whenever creation of new service object is observed. // OnServiceAdd is called whenever creation of new service object is observed.
func (proxier *metaProxier) OnServiceAdd(service *v1.Service) { func (proxier *metaProxier) OnServiceAdd(service *v1.Service) {
if *(service.Spec.IPFamily) == v1.IPv4Protocol { if utilproxy.ShouldSkipService(service) {
proxier.ipv4Proxier.OnServiceAdd(service)
return return
} }
if utilnet.IsIPv6String(service.Spec.ClusterIP) {
proxier.ipv6Proxier.OnServiceAdd(service) proxier.ipv6Proxier.OnServiceAdd(service)
} else {
proxier.ipv4Proxier.OnServiceAdd(service)
}
} }
// OnServiceUpdate is called whenever modification of an existing // OnServiceUpdate is called whenever modification of an existing
// service object is observed. // service object is observed.
func (proxier *metaProxier) OnServiceUpdate(oldService, service *v1.Service) { func (proxier *metaProxier) OnServiceUpdate(oldService, service *v1.Service) {
// IPFamily is immutable, hence we only need to check on the new service if utilproxy.ShouldSkipService(service) {
if *(service.Spec.IPFamily) == v1.IPv4Protocol {
proxier.ipv4Proxier.OnServiceUpdate(oldService, service)
return return
} }
// IPFamily is immutable, hence we only need to check on the new service
if utilnet.IsIPv6String(service.Spec.ClusterIP) {
proxier.ipv6Proxier.OnServiceUpdate(oldService, service) proxier.ipv6Proxier.OnServiceUpdate(oldService, service)
} else {
proxier.ipv4Proxier.OnServiceUpdate(oldService, service)
}
} }
// OnServiceDelete is called whenever deletion of an existing service // OnServiceDelete is called whenever deletion of an existing service
// object is observed. // object is observed.
func (proxier *metaProxier) OnServiceDelete(service *v1.Service) { func (proxier *metaProxier) OnServiceDelete(service *v1.Service) {
if *(service.Spec.IPFamily) == v1.IPv4Protocol { if utilproxy.ShouldSkipService(service) {
proxier.ipv4Proxier.OnServiceDelete(service)
return return
} }
if utilnet.IsIPv6String(service.Spec.ClusterIP) {
proxier.ipv6Proxier.OnServiceDelete(service) proxier.ipv6Proxier.OnServiceDelete(service)
} else {
proxier.ipv4Proxier.OnServiceDelete(service)
}
} }
// OnServiceSynced is called once all the initial event handlers were // OnServiceSynced is called once all the initial event handlers were