Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion pkg/master/master.go
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,46 @@ func (m *Master) InstallSwaggerAPI() {
swagger.RegisterSwaggerService(swaggerConfig, m.handlerContainer)
}

// Picks the best available address for an internal health check
// TODO: Create utility function, combining this an GetHostIP in kubelet.go?
func pickAddress(node *api.Node) string {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A loop with a score function is scary to me. What do you think about building a map and expressing priority based on execution order? Something similar to GetHostIP() in the kubelet.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this code should be functionally identical to that code, but without the temporary map.

GetHostIP is much clearer, so I can do that. It sounds like maybe we are going to remove this check entirely though, depending on when #7092 lands. (Some initial discussion in #7115)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah #7092 has some interesting implications. Does #7182 unbreak AWS for now?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would generally assume that #7092 is aspirational until someone is signed up to work on it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#7182 does/should unbreak AWS for now - it would be good to get that merged!

AWS needs this and #7115 if I wanted to change the node name to the EC2 instance id, which would be great to do long-term. In #7182 I put out the fire, so this can wait until #7092 is implemented.

I don't suppose there's a different reason to merge this and/or #7115? @cjcullen you mentioned you were also looking at this (for a different reason, I guess)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar reason... It would be nice to remove the requirement that the master must have DNS cname record entries for nodes that match their k8s names (or the value passed in with --hostname_override). We have that Addresses field on the nodes which I think was added for exactly this type of thing.

I'm interested to see where #7092 goes, but as long as we have Master->Kubelet communication, I think it would be useful to get this change in. It'll make this use case cleaner, and hopefully guide new code away from using Node.Name as a resolvable address.

// Scores an address type; higher is preferrred
scoreAddressType := func(t api.NodeAddressType) int {
// We really want to favor InternalIP; the others are mostly arbitrary
switch t {
case api.NodeInternalIP:
return 4
case api.NodeHostName:
return 3
case api.NodeExternalIP:
return 2
case api.NodeLegacyHostIP:
return 1
default:
glog.Info("Unknown NodeAddressType ", t)
return -1
}
}

var bestAddress *api.NodeAddress
var bestScore int
for i := range node.Status.Addresses {
a := &node.Status.Addresses[i]
score := scoreAddressType(a.Type)
if bestAddress == nil || bestScore < score {
bestAddress = a
bestScore = score
}
}

if bestAddress != nil {
return bestAddress.Address
}

glog.Info("Unable to find address for node ", node.Name, " falling back to Name")
return node.Name
}

func (m *Master) getServersToValidate(c *Config) map[string]apiserver.Server {
serversToValidate := map[string]apiserver.Server{
"controller-manager": {Addr: "127.0.0.1", Port: ports.ControllerManagerPort, Path: "/healthz"},
Expand Down Expand Up @@ -581,7 +621,7 @@ func (m *Master) getServersToValidate(c *Config) map[string]apiserver.Server {
glog.Errorf("Failed to list minions: %v", err)
}
for ix, node := range nodes.Items {
serversToValidate[fmt.Sprintf("node-%d", ix)] = apiserver.Server{Addr: node.Name, Port: ports.KubeletPort, Path: "/healthz", EnableHTTPS: true}
serversToValidate[fmt.Sprintf("node-%d", ix)] = apiserver.Server{Addr: pickAddress(&node), Port: ports.KubeletPort, Path: "/healthz", EnableHTTPS: true}
}
return serversToValidate
}
Expand Down