Test more static pods during cluster validation

This commit is contained in:
John Gardiner Myers 2020-05-02 21:43:29 -07:00
parent 388d16a7e3
commit c524290f9e
2 changed files with 45 additions and 25 deletions

View File

@ -199,13 +199,22 @@ func (v *ValidationCluster) collectComponentFailures(ctx context.Context, client
return nil
}
var masterStaticPods = []string{
"kube-apiserver",
"kube-controller-manager",
"kube-scheduler",
}
func (v *ValidationCluster) collectPodFailures(ctx context.Context, client kubernetes.Interface, nodes []v1.Node) error {
masterWithoutManager := map[string]bool{}
masterWithoutPod := map[string]map[string]bool{}
nodeByAddress := map[string]string{}
for _, node := range nodes {
labels := node.GetLabels()
if labels != nil && labels["kubernetes.io/role"] == "master" {
masterWithoutManager[node.Name] = true
masterWithoutPod[node.Name] = map[string]bool{}
for _, pod := range masterStaticPods {
masterWithoutPod[node.Name][pod] = true
}
}
for _, nodeAddress := range node.Status.Addresses {
nodeByAddress[nodeAddress.Address] = node.Name
@ -254,9 +263,9 @@ func (v *ValidationCluster) collectPodFailures(ctx context.Context, client kuber
}
labels := pod.GetLabels()
if pod.Namespace == "kube-system" && labels != nil && labels["k8s-app"] == "kube-controller-manager" {
delete(masterWithoutManager, nodeByAddress[pod.Status.HostIP])
app := pod.GetLabels()["k8s-app"]
if pod.Namespace == "kube-system" && masterWithoutPod[nodeByAddress[pod.Status.HostIP]][app] {
delete(masterWithoutPod[nodeByAddress[pod.Status.HostIP]], app)
}
return nil
})
@ -264,13 +273,15 @@ func (v *ValidationCluster) collectPodFailures(ctx context.Context, client kuber
return fmt.Errorf("error listing Pods: %v", err)
}
for node := range masterWithoutManager {
for node, nodeMap := range masterWithoutPod {
for app := range nodeMap {
v.addError(&ValidationError{
Kind: "Node",
Name: node,
Message: fmt.Sprintf("master %q is missing kube-controller-manager pod", node),
Message: fmt.Sprintf("master %q is missing %s pod", node, app),
})
}
}
return nil
}

View File

@ -374,7 +374,7 @@ func Test_ValidateMasterNotReady(t *testing.T) {
}
}
func Test_ValidateMasterNoKubeControllerManager(t *testing.T) {
func Test_ValidateMasterStaticPods(t *testing.T) {
groups := make(map[string]*cloudinstances.CloudInstanceGroup)
groups["node-1"] = &cloudinstances.CloudInstanceGroup{
InstanceGroup: &kopsapi.InstanceGroup{
@ -430,34 +430,43 @@ func Test_ValidateMasterNoKubeControllerManager(t *testing.T) {
},
}
v, err := testValidate(t, groups, makePodList(
[]map[string]string{
var podList []map[string]string
var expectedFailures []*ValidationError
for i, pod := range []string{
"kube-apiserver",
"kube-controller-manager",
"kube-scheduler",
} {
podList = append(podList, []map[string]string{
{
"name": "pod1",
"name": fmt.Sprintf("pod-a-%d", i),
"ready": "true",
"k8s-app": "kube-controller-manager",
"k8s-app": pod,
"phase": string(v1.PodRunning),
"priorityClassName": "system-cluster-critical",
"hostip": "1.2.3.4",
},
{
"name": "pod2",
"name": fmt.Sprintf("pod-b-%d", i),
"namespace": "other",
"ready": "true",
"k8s-app": "kube-controller-manager",
"k8s-app": pod,
"phase": string(v1.PodRunning),
"priorityClassName": "system-cluster-critical",
"hostip": "5.6.7.8",
},
},
))
require.NoError(t, err)
if !assert.Len(t, v.Failures, 1) ||
!assert.Equal(t, &ValidationError{
}...)
expectedFailures = append(expectedFailures, &ValidationError{
Kind: "Node",
Name: "master-1b",
Message: "master \"master-1b\" is missing kube-controller-manager pod",
}, v.Failures[0]) {
Message: "master \"master-1b\" is missing " + pod + " pod",
})
}
v, err := testValidate(t, groups, makePodList(podList))
require.NoError(t, err)
if !assert.ElementsMatch(t, v.Failures, expectedFailures) {
printDebug(t, v)
}
}