Skip to content

Commit fc28045

Browse files
author
Matthew Wong
committed
Fix cloud reported hostname being overridden if nodeIP set
1 parent 5993ec5 commit fc28045

File tree

2 files changed

+72
-14
lines changed

2 files changed

+72
-14
lines changed

pkg/kubelet/nodestatus/setters.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,40 +84,52 @@ func NodeAddress(nodeIP net.IP, // typically Kubelet.nodeIP
8484
return nil
8585
}
8686
if cloud != nil {
87-
nodeAddresses, err := nodeAddressesFunc()
87+
cloudNodeAddresses, err := nodeAddressesFunc()
8888
if err != nil {
8989
return err
9090
}
91+
92+
var nodeAddresses []v1.NodeAddress
93+
94+
// For every address supplied by the cloud provider that matches nodeIP, nodeIP is the enforced node address for
95+
// that address Type (like InternalIP and ExternalIP), meaning other addresses of the same Type are discarded.
96+
// See #61921 for more information: some cloud providers may supply secondary IPs, so nodeIP serves as a way to
97+
// ensure that the correct IPs show up on a Node object.
9198
if nodeIP != nil {
9299
enforcedNodeAddresses := []v1.NodeAddress{}
93100

94101
nodeIPTypes := make(map[v1.NodeAddressType]bool)
95-
for _, nodeAddress := range nodeAddresses {
102+
for _, nodeAddress := range cloudNodeAddresses {
96103
if nodeAddress.Address == nodeIP.String() {
97104
enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: nodeAddress.Type, Address: nodeAddress.Address})
98105
nodeIPTypes[nodeAddress.Type] = true
99106
}
100107
}
101-
if len(enforcedNodeAddresses) > 0 {
102-
for _, nodeAddress := range nodeAddresses {
103-
if !nodeIPTypes[nodeAddress.Type] && nodeAddress.Type != v1.NodeHostName {
104-
enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: nodeAddress.Type, Address: nodeAddress.Address})
105-
}
106-
}
107108

108-
enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
109-
node.Status.Addresses = enforcedNodeAddresses
110-
return nil
109+
// nodeIP must be among the addresses supplied by the cloud provider
110+
if len(enforcedNodeAddresses) == 0 {
111+
return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", nodeIP)
112+
}
113+
114+
// nodeIP was found, now use all other addresses supplied by the cloud provider NOT of the same Type as nodeIP.
115+
for _, nodeAddress := range cloudNodeAddresses {
116+
if !nodeIPTypes[nodeAddress.Type] {
117+
enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: nodeAddress.Type, Address: nodeAddress.Address})
118+
}
111119
}
112-
return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", nodeIP)
120+
121+
nodeAddresses = enforcedNodeAddresses
122+
} else {
123+
// If nodeIP is unset, just use the addresses provided by the cloud provider as-is
124+
nodeAddresses = cloudNodeAddresses
113125
}
114126

115127
switch {
116-
case len(nodeAddresses) == 0:
128+
case len(cloudNodeAddresses) == 0:
117129
// the cloud provider didn't specify any addresses
118130
nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
119131

120-
case !hasAddressType(nodeAddresses, v1.NodeHostName) && hasAddressValue(nodeAddresses, hostname):
132+
case !hasAddressType(cloudNodeAddresses, v1.NodeHostName) && hasAddressValue(cloudNodeAddresses, hostname):
121133
// the cloud provider didn't specify an address of type Hostname,
122134
// but the auto-detected hostname matched an address reported by the cloud provider,
123135
// so we can add it and count on the value being verifiable via cloud provider metadata

pkg/kubelet/nodestatus/setters_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,21 @@ func TestNodeAddress(t *testing.T) {
177177
},
178178
shouldError: false,
179179
},
180+
{
181+
name: "cloud reports hostname, nodeIP is set, no override",
182+
nodeIP: net.ParseIP("10.1.1.1"),
183+
nodeAddresses: []v1.NodeAddress{
184+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
185+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
186+
{Type: v1.NodeHostName, Address: "cloud-host"},
187+
},
188+
expectedAddresses: []v1.NodeAddress{
189+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
190+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
191+
{Type: v1.NodeHostName, Address: "cloud-host"}, // cloud-reported hostname wins over detected hostname
192+
},
193+
shouldError: false,
194+
},
180195
{
181196
name: "cloud reports hostname, overridden",
182197
nodeAddresses: []v1.NodeAddress{
@@ -220,6 +235,37 @@ func TestNodeAddress(t *testing.T) {
220235
},
221236
shouldError: false,
222237
},
238+
{
239+
name: "cloud doesn't report hostname, nodeIP is set, no override, detected hostname match",
240+
nodeIP: net.ParseIP("10.1.1.1"),
241+
nodeAddresses: []v1.NodeAddress{
242+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
243+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
244+
{Type: v1.NodeExternalDNS, Address: testKubeletHostname}, // cloud-reported address value matches detected hostname
245+
},
246+
expectedAddresses: []v1.NodeAddress{
247+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
248+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
249+
{Type: v1.NodeExternalDNS, Address: testKubeletHostname},
250+
{Type: v1.NodeHostName, Address: testKubeletHostname}, // detected hostname gets auto-added
251+
},
252+
shouldError: false,
253+
},
254+
{
255+
name: "cloud doesn't report hostname, nodeIP is set, no override, detected hostname match with same type as nodeIP",
256+
nodeIP: net.ParseIP("10.1.1.1"),
257+
nodeAddresses: []v1.NodeAddress{
258+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
259+
{Type: v1.NodeInternalIP, Address: testKubeletHostname}, // cloud-reported address value matches detected hostname
260+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
261+
},
262+
expectedAddresses: []v1.NodeAddress{
263+
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
264+
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
265+
{Type: v1.NodeHostName, Address: testKubeletHostname}, // detected hostname gets auto-added
266+
},
267+
shouldError: false,
268+
},
223269
{
224270
name: "cloud doesn't report hostname, hostname override, hostname mismatch",
225271
nodeAddresses: []v1.NodeAddress{

0 commit comments

Comments
 (0)