Skip to content

Commit

Permalink
Merge pull request #17 from jensfr/compact-cluster-support
Browse files Browse the repository at this point in the history
add support for master/worker combined nodes
  • Loading branch information
jensfr committed Oct 21, 2020
2 parents 37263ec + d73e5f8 commit 723d90e
Showing 1 changed file with 72 additions and 17 deletions.
89 changes: 72 additions & 17 deletions pkg/controller/kataconfig/openshift_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ func (r *ReconcileKataConfigOpenShift) newMCPforCR() *mcfgv1.MachineConfigPool {
return mcp
}

func (r *ReconcileKataConfigOpenShift) newMCForCR() (*mcfgv1.MachineConfig, error) {
func (r *ReconcileKataConfigOpenShift) newMCForCR(machinePool string) (*mcfgv1.MachineConfig, error) {
isenabled := true
name := "kata-osbuilder-generate.service"
content := `
Expand All @@ -289,12 +289,18 @@ ExecRestart=/usr/libexec/kata-containers/osbuilder/kata-osbuilder.sh
WantedBy=multi-user.target
`

var workerRole string
kataOC, err := r.kataOcExists()
if err != nil {
return nil, err
}

if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/worker"]; ok {
workerRole = "worker"
if kataOC {
machinePool = "kata-oc"
} else if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/"+machinePool]; ok {
r.kataLogger.Info("in newMCforCR machinePool" + machinePool)
} else {
workerRole = "kata-oc"
r.kataLogger.Error(err, "no valid role for mc found")
return nil, err
}

mc := *&mcfgv1.MachineConfig{
Expand All @@ -305,7 +311,7 @@ WantedBy=multi-user.target
ObjectMeta: metav1.ObjectMeta{
Name: "50-kata-crio-dropin",
Labels: map[string]string{
"machineconfiguration.openshift.io/role": workerRole,
"machineconfiguration.openshift.io/role": machinePool,
"app": r.kataConfig.Name,
},
Namespace: "kata-operator",
Expand Down Expand Up @@ -405,22 +411,61 @@ func (r *ReconcileKataConfigOpenShift) listKataPods() error {
return nil
}

func (r *ReconcileKataConfigOpenShift) kataOcExists() (bool, error) {
kataOcMcp := &mcfgv1.MachineConfigPool{}
err := r.client.Get(context.TODO(), types.NamespacedName{Name: "kata-oc"}, kataOcMcp)
if err != nil && errors.IsNotFound(err) {
r.kataLogger.Error(err, "No kata-oc machine config pool found!")
return false, nil
} else if err != nil {
r.kataLogger.Error(err, "Could not get the kata-oc machine config pool!")
return false, err
}

return true, nil
}

func (r *ReconcileKataConfigOpenShift) workerOrMaster() (string, error) {
var role string
workerMcp := &mcfgv1.MachineConfigPool{}
err := r.client.Get(context.TODO(), types.NamespacedName{Name: "worker"}, workerMcp)
if err != nil && errors.IsNotFound(err) {
r.kataLogger.Error(err, "No worker machine config pool found!")
return "", err
} else if err != nil {
r.kataLogger.Error(err, "Could not get the worker machine config pool!")
return "", err
}

if workerMcp.Status.MachineCount > 0 {
role = "worker"
} else {
role = "master"
}
return role, nil
}

func (r *ReconcileKataConfigOpenShift) processKataConfigInstallRequest() (reconcile.Result, error) {
if r.kataConfig.Status.TotalNodesCount == 0 {

nodesList := &corev1.NodeList{}

/* This could be the case in a compact cluster where master and workers are on the same node */
machinePool, err := r.workerOrMaster()
if err != nil {
return reconcile.Result{}, err
}
if r.kataConfig.Spec.KataConfigPoolSelector == nil {
r.kataConfig.Spec.KataConfigPoolSelector = &metav1.LabelSelector{
MatchLabels: map[string]string{"node-role.kubernetes.io/worker": ""},
MatchLabels: map[string]string{"node-role.kubernetes.io/" + machinePool: ""},
}
}

listOpts := []client.ListOption{
client.MatchingLabels(r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels),
}

err := r.client.List(context.TODO(), nodesList, listOpts...)
err = r.client.List(context.TODO(), nodesList, listOpts...)
if err != nil {
return reconcile.Result{}, err
}
Expand Down Expand Up @@ -524,6 +569,10 @@ func (r *ReconcileKataConfigOpenShift) setRuntimeClass() (reconcile.Result, erro

func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconcile.Result, error) {
r.kataLogger.Info("KataConfig deletion in progress: ")
machinePool, err := r.workerOrMaster()
if err != nil {
return reconcile.Result{Requeue: true, RequeueAfter: 15 * time.Second}, err
}
if contains(r.kataConfig.GetFinalizers(), kataConfigFinalizer) {
// Get the list of pods that might be running using kata runtime
err := r.listKataPods()
Expand Down Expand Up @@ -564,7 +613,7 @@ func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconci
continue
}

if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/worker"]; !ok {
if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/"+machinePool]; !ok {
r.kataLogger.Info("Removing the kata pool selector label from the node", "node name ", nodeName)
node, err := r.clientset.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{})
if err != nil {
Expand All @@ -588,9 +637,9 @@ func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconci
}
}

r.kataLogger.Info("Making sure parent MCP is synced properly")
if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/worker"]; ok {
mc, err := r.newMCForCR()
r.kataLogger.Info("Making sure parent MCP is synced properly, KataNodeRole=" + machinePool)
if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/"+machinePool]; ok {
mc, err := r.newMCForCR(machinePool)
var isMcDeleted bool

err = r.client.Get(context.TODO(), types.NamespacedName{Name: mc.Name}, mc)
Expand All @@ -613,7 +662,7 @@ func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconci
}

workreMcp := &mcfgv1.MachineConfigPool{}
err = r.client.Get(context.TODO(), types.NamespacedName{Name: "worker"}, workreMcp)
err = r.client.Get(context.TODO(), types.NamespacedName{Name: "master"}, workreMcp)
if err != nil {
return reconcile.Result{}, err
}
Expand All @@ -630,7 +679,7 @@ func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconci

parentMcp := &mcfgv1.MachineConfigPool{}

err := r.client.Get(context.TODO(), types.NamespacedName{Name: "worker"}, parentMcp)
err := r.client.Get(context.TODO(), types.NamespacedName{Name: "master"}, parentMcp)
if err != nil && errors.IsNotFound(err) {
return reconcile.Result{Requeue: true, RequeueAfter: 15 * time.Second}, fmt.Errorf("Not able to find parent pool %s", parentMcp.GetName())
} else if err != nil {
Expand All @@ -651,7 +700,7 @@ func (r *ReconcileKataConfigOpenShift) processKataConfigDeleteRequest() (reconci
"mcp", mcp.Name, "error", err)
}

mc, err := r.newMCForCR()
mc, err := r.newMCForCR(machinePool)
err = r.client.Delete(context.TODO(), mc)
if err != nil {
// error during removing mc, don't block the uninstall. Just log the error and move on.
Expand Down Expand Up @@ -718,8 +767,13 @@ func (r *ReconcileKataConfigOpenShift) deleteKataDaemonset(operation DaemonOpera

func (r *ReconcileKataConfigOpenShift) monitorKataConfigInstallation() (reconcile.Result, error) {
r.kataLogger.Info("installation is complete on targetted nodes, now dropping in crio config using MCO")
machinePool, err := r.workerOrMaster()
if err != nil {
return reconcile.Result{}, err
}

if _, ok := r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/worker"]; !ok {
if _, ok := (r.kataConfig.Spec.KataConfigPoolSelector.MatchLabels["node-role.kubernetes.io/"+machinePool]); !ok {
r.kataLogger.Info("creating new Mcp")
mcp := r.newMCPforCR()

founcMcp := &mcfgv1.MachineConfigPool{}
Expand Down Expand Up @@ -747,7 +801,8 @@ func (r *ReconcileKataConfigOpenShift) monitorKataConfigInstallation() (reconcil
}
}

mc, err := r.newMCForCR()
r.kataLogger.Info("KataNodeRole is: " + machinePool)
mc, err := r.newMCForCR(machinePool)
if err != nil {
return reconcile.Result{}, err
}
Expand Down

0 comments on commit 723d90e

Please sign in to comment.