From 57d446ec6f151747d5de8ae618fca12bb7c8a4e9 Mon Sep 17 00:00:00 2001 From: travisn Date: Thu, 19 Sep 2019 16:00:56 -0600 Subject: [PATCH] ceph: osds to always use hostname for node selector The node selector for running OSDs on PVCs was using the node name rather than the node's hostname. In clusters where the node name is different from the hostname this would cause the osd daemons to be in pending state indefinitely. Now the node selector will use the hostname as expected. Signed-off-by: travisn --- pkg/operator/ceph/cluster/osd/osd.go | 7 ++++++- pkg/operator/k8sutil/node.go | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pkg/operator/ceph/cluster/osd/osd.go b/pkg/operator/ceph/cluster/osd/osd.go index b362a4a6a..fcf1778f4 100644 --- a/pkg/operator/ceph/cluster/osd/osd.go +++ b/pkg/operator/ceph/cluster/osd/osd.go @@ -765,7 +765,12 @@ func (c *Cluster) getPVCHostName(pvcName string) (string, error) { return "", err } for _, pod := range podList.Items { - return pod.Spec.NodeName, nil + name, err := k8sutil.GetNodeHostName(c.context.Clientset, pod.Spec.NodeName) + if err != nil { + logger.Warningf("falling back to node name %s since hostname not found for node", pod.Spec.NodeName) + name = pod.Spec.NodeName + } + return name, nil } return "", err } diff --git a/pkg/operator/k8sutil/node.go b/pkg/operator/k8sutil/node.go index 08cfa73f6..243b0099b 100644 --- a/pkg/operator/k8sutil/node.go +++ b/pkg/operator/k8sutil/node.go @@ -108,6 +108,19 @@ func GetNodeNameFromHostname(clientset kubernetes.Interface, hostName string) (s return hostName, fmt.Errorf("node not found") } +// GetNodeHostName returns the hostname label given the node name. +func GetNodeHostName(clientset kubernetes.Interface, nodeName string) (string, error) { + node, err := clientset.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) + if err != nil { + return "", err + } + hostname, ok := node.Labels[v1.LabelHostname] + if !ok { + return "", fmt.Errorf("hostname not found on the node") + } + return hostname, nil +} + // GetNodeHostNames returns the name of the node resource mapped to their hostname label. // Typically these will be the same name, but sometimes they are not such as when nodes have a longer // dns name, but the hostname is short.