mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 01:06:27 +00:00
Honor --hostname-override, report compatible hostname addresses with cloud provider
This commit is contained in:
parent
0e31372b2f
commit
2857de73ce
@ -476,6 +476,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||||||
|
|
||||||
klet := &Kubelet{
|
klet := &Kubelet{
|
||||||
hostname: hostname,
|
hostname: hostname,
|
||||||
|
hostnameOverridden: len(hostnameOverride) > 0,
|
||||||
nodeName: nodeName,
|
nodeName: nodeName,
|
||||||
kubeClient: kubeDeps.KubeClient,
|
kubeClient: kubeDeps.KubeClient,
|
||||||
heartbeatClient: kubeDeps.HeartbeatClient,
|
heartbeatClient: kubeDeps.HeartbeatClient,
|
||||||
@ -855,7 +856,11 @@ type serviceLister interface {
|
|||||||
type Kubelet struct {
|
type Kubelet struct {
|
||||||
kubeletConfiguration kubeletconfiginternal.KubeletConfiguration
|
kubeletConfiguration kubeletconfiginternal.KubeletConfiguration
|
||||||
|
|
||||||
hostname string
|
// hostname is the hostname the kubelet detected or was given via flag/config
|
||||||
|
hostname string
|
||||||
|
// hostnameOverridden indicates the hostname was overridden via flag/config
|
||||||
|
hostnameOverridden bool
|
||||||
|
|
||||||
nodeName types.NodeName
|
nodeName types.NodeName
|
||||||
runtimeCache kubecontainer.RuntimeCache
|
runtimeCache kubecontainer.RuntimeCache
|
||||||
kubeClient clientset.Interface
|
kubeClient clientset.Interface
|
||||||
|
@ -485,7 +485,7 @@ func (kl *Kubelet) defaultNodeStatusFuncs() []func(*v1.Node) error {
|
|||||||
}
|
}
|
||||||
var setters []func(n *v1.Node) error
|
var setters []func(n *v1.Node) error
|
||||||
setters = append(setters,
|
setters = append(setters,
|
||||||
nodestatus.NodeAddress(kl.nodeIP, kl.nodeIPValidator, kl.hostname, kl.externalCloudProvider, kl.cloud, nodeAddressesFunc),
|
nodestatus.NodeAddress(kl.nodeIP, kl.nodeIPValidator, kl.hostname, kl.hostnameOverridden, kl.externalCloudProvider, kl.cloud, nodeAddressesFunc),
|
||||||
nodestatus.MachineInfo(string(kl.nodeName), kl.maxPods, kl.podsPerCore, kl.GetCachedMachineInfo, kl.containerManager.GetCapacity,
|
nodestatus.MachineInfo(string(kl.nodeName), kl.maxPods, kl.podsPerCore, kl.GetCachedMachineInfo, kl.containerManager.GetCapacity,
|
||||||
kl.containerManager.GetDevicePluginResourceCapacity, kl.containerManager.GetNodeAllocatableReservation, kl.recordEvent),
|
kl.containerManager.GetDevicePluginResourceCapacity, kl.containerManager.GetNodeAllocatableReservation, kl.recordEvent),
|
||||||
nodestatus.VersionInfo(kl.cadvisor.VersionInfo, kl.containerRuntime.Type, kl.containerRuntime.Version),
|
nodestatus.VersionInfo(kl.cadvisor.VersionInfo, kl.containerRuntime.Type, kl.containerRuntime.Version),
|
||||||
|
@ -59,6 +59,7 @@ type Setter func(node *v1.Node) error
|
|||||||
func NodeAddress(nodeIP net.IP, // typically Kubelet.nodeIP
|
func NodeAddress(nodeIP net.IP, // typically Kubelet.nodeIP
|
||||||
validateNodeIPFunc func(net.IP) error, // typically Kubelet.nodeIPValidator
|
validateNodeIPFunc func(net.IP) error, // typically Kubelet.nodeIPValidator
|
||||||
hostname string, // typically Kubelet.hostname
|
hostname string, // typically Kubelet.hostname
|
||||||
|
hostnameOverridden bool, // was the hostname force set?
|
||||||
externalCloudProvider bool, // typically Kubelet.externalCloudProvider
|
externalCloudProvider bool, // typically Kubelet.externalCloudProvider
|
||||||
cloud cloudprovider.Interface, // typically Kubelet.cloud
|
cloud cloudprovider.Interface, // typically Kubelet.cloud
|
||||||
nodeAddressesFunc func() ([]v1.NodeAddress, error), // typically Kubelet.cloudResourceSyncManager.NodeAddresses
|
nodeAddressesFunc func() ([]v1.NodeAddress, error), // typically Kubelet.cloudResourceSyncManager.NodeAddresses
|
||||||
@ -111,10 +112,38 @@ func NodeAddress(nodeIP net.IP, // typically Kubelet.nodeIP
|
|||||||
return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", nodeIP)
|
return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", nodeIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only add a NodeHostName address if the cloudprovider did not specify any addresses.
|
switch {
|
||||||
// (we assume the cloudprovider is authoritative if it specifies any addresses)
|
case len(nodeAddresses) == 0:
|
||||||
if len(nodeAddresses) == 0 {
|
// the cloud provider didn't specify any addresses
|
||||||
nodeAddresses = []v1.NodeAddress{{Type: v1.NodeHostName, Address: hostname}}
|
nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
|
||||||
|
|
||||||
|
case !hasAddressType(nodeAddresses, v1.NodeHostName) && hasAddressValue(nodeAddresses, hostname):
|
||||||
|
// the cloud provider didn't specify an address of type Hostname,
|
||||||
|
// but the auto-detected hostname matched an address reported by the cloud provider,
|
||||||
|
// so we can add it and count on the value being verifiable via cloud provider metadata
|
||||||
|
nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
|
||||||
|
|
||||||
|
case hostnameOverridden:
|
||||||
|
// the hostname was force-set via flag/config.
|
||||||
|
// this means the hostname might not be able to be validated via cloud provider metadata,
|
||||||
|
// but was a choice by the kubelet deployer we should honor
|
||||||
|
var existingHostnameAddress *v1.NodeAddress
|
||||||
|
for i := range nodeAddresses {
|
||||||
|
if nodeAddresses[i].Type == v1.NodeHostName {
|
||||||
|
existingHostnameAddress = &nodeAddresses[i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if existingHostnameAddress == nil {
|
||||||
|
// no existing Hostname address found, add it
|
||||||
|
glog.Warningf("adding overridden hostname of %v to cloudprovider-reported addresses", hostname)
|
||||||
|
nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
|
||||||
|
} else {
|
||||||
|
// override the Hostname address reported by the cloud provider
|
||||||
|
glog.Warningf("replacing cloudprovider-reported hostname of %v with overridden hostname of %v", existingHostnameAddress.Address, hostname)
|
||||||
|
existingHostnameAddress.Address = hostname
|
||||||
|
}
|
||||||
}
|
}
|
||||||
node.Status.Addresses = nodeAddresses
|
node.Status.Addresses = nodeAddresses
|
||||||
} else {
|
} else {
|
||||||
@ -163,6 +192,23 @@ func NodeAddress(nodeIP net.IP, // typically Kubelet.nodeIP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasAddressType(addresses []v1.NodeAddress, addressType v1.NodeAddressType) bool {
|
||||||
|
for _, address := range addresses {
|
||||||
|
if address.Type == addressType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func hasAddressValue(addresses []v1.NodeAddress, addressValue string) bool {
|
||||||
|
for _, address := range addresses {
|
||||||
|
if address.Address == addressValue {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// MachineInfo returns a Setter that updates machine-related information on the node.
|
// MachineInfo returns a Setter that updates machine-related information on the node.
|
||||||
func MachineInfo(nodeName string,
|
func MachineInfo(nodeName string,
|
||||||
maxPods int,
|
maxPods int,
|
||||||
|
@ -55,6 +55,7 @@ const (
|
|||||||
func TestNodeAddress(t *testing.T) {
|
func TestNodeAddress(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
name string
|
name string
|
||||||
|
hostnameOverride bool
|
||||||
nodeIP net.IP
|
nodeIP net.IP
|
||||||
nodeAddresses []v1.NodeAddress
|
nodeAddresses []v1.NodeAddress
|
||||||
expectedAddresses []v1.NodeAddress
|
expectedAddresses []v1.NodeAddress
|
||||||
@ -151,6 +152,85 @@ func TestNodeAddress(t *testing.T) {
|
|||||||
expectedAddresses: nil,
|
expectedAddresses: nil,
|
||||||
shouldError: true,
|
shouldError: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "no cloud reported hostnames",
|
||||||
|
nodeAddresses: []v1.NodeAddress{},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeHostName, Address: testKubeletHostname}, // detected hostname is auto-added in the absence of cloud-reported hostnames
|
||||||
|
},
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cloud reports hostname, no override",
|
||||||
|
nodeAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
{Type: v1.NodeHostName, Address: "cloud-host"},
|
||||||
|
},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
{Type: v1.NodeHostName, Address: "cloud-host"}, // cloud-reported hostname wins over detected hostname
|
||||||
|
},
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cloud reports hostname, overridden",
|
||||||
|
nodeAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeHostName, Address: "cloud-host"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeHostName, Address: testKubeletHostname}, // hostname-override wins over cloud-reported hostname
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
},
|
||||||
|
hostnameOverride: true,
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cloud doesn't report hostname, no override, detected hostname mismatch",
|
||||||
|
nodeAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
// detected hostname is not auto-added if it doesn't match any cloud-reported addresses
|
||||||
|
},
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cloud doesn't report hostname, no override, detected hostname match",
|
||||||
|
nodeAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
{Type: v1.NodeExternalDNS, Address: testKubeletHostname}, // cloud-reported address value matches detected hostname
|
||||||
|
},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
{Type: v1.NodeExternalDNS, Address: testKubeletHostname},
|
||||||
|
{Type: v1.NodeHostName, Address: testKubeletHostname}, // detected hostname gets auto-added
|
||||||
|
},
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cloud doesn't report hostname, hostname override, hostname mismatch",
|
||||||
|
nodeAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
},
|
||||||
|
expectedAddresses: []v1.NodeAddress{
|
||||||
|
{Type: v1.NodeInternalIP, Address: "10.1.1.1"},
|
||||||
|
{Type: v1.NodeExternalIP, Address: "55.55.55.55"},
|
||||||
|
{Type: v1.NodeHostName, Address: testKubeletHostname}, // overridden hostname gets auto-added
|
||||||
|
},
|
||||||
|
hostnameOverride: true,
|
||||||
|
shouldError: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, testCase := range cases {
|
for _, testCase := range cases {
|
||||||
t.Run(testCase.name, func(t *testing.T) {
|
t.Run(testCase.name, func(t *testing.T) {
|
||||||
@ -178,6 +258,7 @@ func TestNodeAddress(t *testing.T) {
|
|||||||
setter := NodeAddress(nodeIP,
|
setter := NodeAddress(nodeIP,
|
||||||
nodeIPValidator,
|
nodeIPValidator,
|
||||||
hostname,
|
hostname,
|
||||||
|
testCase.hostnameOverride,
|
||||||
externalCloudProvider,
|
externalCloudProvider,
|
||||||
cloud,
|
cloud,
|
||||||
nodeAddressesFunc)
|
nodeAddressesFunc)
|
||||||
|
Loading…
Reference in New Issue
Block a user