Add falg to report node internal IP address in ingress status

This commit is contained in:
Manuel de Brito Fontes 2017-10-08 14:29:19 -03:00
parent 4479b54953
commit 284448f8d9
5 changed files with 34 additions and 20 deletions

View file

@ -135,9 +135,11 @@ type Configuration struct {
Backend ingress.Controller Backend ingress.Controller
UpdateStatus bool UpdateStatus bool
UseNodeInternalIP bool
ElectionID string ElectionID string
UpdateStatusOnShutdown bool UpdateStatusOnShutdown bool
SortBackends bool
SortBackends bool
} }
// newIngressController creates an Ingress controller // newIngressController creates an Ingress controller
@ -174,6 +176,7 @@ func newIngressController(config *Configuration) *GenericController {
DefaultIngressClass: config.DefaultIngressClass, DefaultIngressClass: config.DefaultIngressClass,
UpdateStatusOnShutdown: config.UpdateStatusOnShutdown, UpdateStatusOnShutdown: config.UpdateStatusOnShutdown,
CustomIngressStatus: ic.cfg.Backend.UpdateIngressStatus, CustomIngressStatus: ic.cfg.Backend.UpdateIngressStatus,
UseNodeInternalIP: ic.cfg.UseNodeInternalIP,
}) })
} else { } else {
glog.Warning("Update of ingress status is disabled (flag --update-status=false was specified)") glog.Warning("Update of ingress status is disabled (flag --update-status=false was specified)")

View file

@ -101,6 +101,9 @@ func NewIngressController(backend ingress.Controller) *GenericController {
sortBackends = flags.Bool("sort-backends", false, sortBackends = flags.Bool("sort-backends", false,
`Defines if backends and it's endpoints should be sorted`) `Defines if backends and it's endpoints should be sorted`)
useNodeInternalIP = flags.Bool("report-node-internal-ip-address", false,
`Defines if the nodes IP address to be returned in the ingress status should be the internal instead of the external IP address`)
) )
flags.AddGoFlagSet(flag.CommandLine) flags.AddGoFlagSet(flag.CommandLine)
@ -198,6 +201,7 @@ func NewIngressController(backend ingress.Controller) *GenericController {
DisableNodeList: *disableNodeList, DisableNodeList: *disableNodeList,
UpdateStatusOnShutdown: *updateStatusOnShutdown, UpdateStatusOnShutdown: *updateStatusOnShutdown,
SortBackends: *sortBackends, SortBackends: *sortBackends,
UseNodeInternalIP: *useNodeInternalIP,
} }
ic := newIngressController(config) ic := newIngressController(config)

View file

@ -66,6 +66,8 @@ type Config struct {
UpdateStatusOnShutdown bool UpdateStatusOnShutdown bool
UseNodeInternalIP bool
IngressLister store.IngressLister IngressLister store.IngressLister
DefaultIngressClass string DefaultIngressClass string
@ -267,7 +269,7 @@ func (s *statusSync) runningAddresses() ([]string, error) {
addrs := []string{} addrs := []string{}
for _, pod := range pods.Items { for _, pod := range pods.Items {
name := k8s.GetNodeIP(s.Client, pod.Spec.NodeName) name := k8s.GetNodeIP(s.Client, pod.Spec.NodeName, s.UseNodeInternalIP)
if !sliceutils.StringInSlice(name, addrs) { if !sliceutils.StringInSlice(name, addrs) {
addrs = append(addrs, name) addrs = append(addrs, name)
} }

View file

@ -37,26 +37,30 @@ func ParseNameNS(input string) (string, string, error) {
} }
// GetNodeIP returns the IP address of a node in the cluster // GetNodeIP returns the IP address of a node in the cluster
func GetNodeIP(kubeClient clientset.Interface, name string) string { func GetNodeIP(kubeClient clientset.Interface, name string, useInternalIP bool) string {
var externalIP string
node, err := kubeClient.Core().Nodes().Get(name, metav1.GetOptions{}) node, err := kubeClient.Core().Nodes().Get(name, metav1.GetOptions{})
if err != nil { if err != nil {
return externalIP return ""
} }
for _, address := range node.Status.Addresses { for _, address := range node.Status.Addresses {
if address.Type == apiv1.NodeExternalIP { if useInternalIP {
if address.Address != "" { if address.Type == apiv1.NodeInternalIP {
externalIP = address.Address if address.Address != "" {
break return address.Address
}
} }
continue
} }
if externalIP == "" && address.Type == apiv1.NodeInternalIP { if address.Type == apiv1.NodeExternalIP {
externalIP = address.Address if address.Address != "" {
return address.Address
}
} }
} }
return externalIP
return ""
} }
// PodInfo contains runtime information about the pod running the Ingres controller // PodInfo contains runtime information about the pod running the Ingres controller
@ -87,7 +91,7 @@ func GetPodDetails(kubeClient clientset.Interface) (*PodInfo, error) {
return &PodInfo{ return &PodInfo{
Name: podName, Name: podName,
Namespace: podNs, Namespace: podNs,
NodeIP: GetNodeIP(kubeClient, pod.Spec.NodeName), NodeIP: GetNodeIP(kubeClient, pod.Spec.NodeName, true),
Labels: pod.GetLabels(), Labels: pod.GetLabels(),
}, nil }, nil
} }

View file

@ -61,9 +61,10 @@ func TestGetNodeIP(t *testing.T) {
cs *testclient.Clientset cs *testclient.Clientset
n string n string
ea string ea string
i bool
}{ }{
// empty node list // empty node list
{testclient.NewSimpleClientset(), "demo", ""}, {testclient.NewSimpleClientset(), "demo", "", true},
// node not exist // node not exist
{testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{ {testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{
@ -78,7 +79,7 @@ func TestGetNodeIP(t *testing.T) {
}, },
}, },
}, },
}}}), "notexistnode", ""}, }}}), "notexistnode", "", true},
// node exist // node exist
{testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{ {testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{
@ -93,7 +94,7 @@ func TestGetNodeIP(t *testing.T) {
}, },
}, },
}, },
}}}), "demo", "10.0.0.1"}, }}}), "demo", "10.0.0.1", true},
// search the correct node // search the correct node
{testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{ {testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{
@ -123,7 +124,7 @@ func TestGetNodeIP(t *testing.T) {
}, },
}, },
}, },
}}), "demo2", "10.0.0.2"}, }}), "demo2", "10.0.0.2", true},
// get NodeExternalIP // get NodeExternalIP
{testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{ {testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{
@ -141,7 +142,7 @@ func TestGetNodeIP(t *testing.T) {
}, },
}, },
}, },
}}}), "demo", "10.0.0.2"}, }}}), "demo", "10.0.0.2", false},
// get NodeInternalIP // get NodeInternalIP
{testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{ {testclient.NewSimpleClientset(&apiv1.NodeList{Items: []apiv1.Node{{
@ -159,11 +160,11 @@ func TestGetNodeIP(t *testing.T) {
}, },
}, },
}, },
}}}), "demo", "10.0.0.2"}, }}}), "demo", "10.0.0.2", true},
} }
for _, fk := range fKNodes { for _, fk := range fKNodes {
address := GetNodeIP(fk.cs, fk.n) address := GetNodeIP(fk.cs, fk.n, fk.i)
if address != fk.ea { if address != fk.ea {
t.Errorf("expected %s, but returned %s", fk.ea, address) t.Errorf("expected %s, but returned %s", fk.ea, address)
} }