1
0
mirror of https://github.com/rancher/rke.git synced 2025-04-28 03:31:24 +00:00

Support node taint configuration

**Problem:**
We can not set node taints in RKE node config.

**Solution:**
Sync taints from config in `SyncLabelsAndTaints` function
This commit is contained in:
orangedeng 2019-08-01 22:18:20 +08:00 committed by Alena Prokharchyk
parent 0a92b0604f
commit 0ef3c0849a
2 changed files with 77 additions and 0 deletions

View File

@ -363,6 +363,9 @@ func (c *Cluster) SyncLabelsAndTaints(ctx context.Context, currentCluster *Clust
}
}
// sync node taints. Add or remove taints from hosts
syncTaints(ctx, currentCluster, c)
if len(c.ControlPlaneHosts) > 0 {
log.Infof(ctx, "[sync] Syncing nodes Labels and Taints")
k8sClient, err := k8s.NewClient(c.LocalKubeConfigPath, c.K8sWrapTransport)

View File

@ -21,6 +21,9 @@ const (
unschedulableEtcdTaint = "node-role.kubernetes.io/etcd=true:NoExecute"
unschedulableControlTaint = "node-role.kubernetes.io/controlplane=true:NoSchedule"
unschedulableEtcdTaintKey = "node-role.kubernetes.io/etcd=:NoExecute"
unschedulableControlTaintKey = "node-role.kubernetes.io/controlplane=:NoSchedule"
EtcdPlaneNodesReplacedErr = "Etcd plane nodes are replaced. Stopping provisioning. Please restore your cluster from backup."
)
@ -405,3 +408,74 @@ func isEtcdPlaneReplaced(ctx context.Context, currentCluster, kubeCluster *Clust
}
return false
}
func syncTaints(ctx context.Context, currentCluster, kubeCluster *Cluster) {
var currentHosts, expectedHosts []*hosts.Host
var currentTaints, expectedTaints map[string]map[string]string
// handling taints in configuration
if currentCluster != nil {
currentHosts = hosts.GetUniqueHostList(currentCluster.EtcdHosts, currentCluster.ControlPlaneHosts, currentCluster.WorkerHosts)
currentTaints = getHostsTaintsMap(currentHosts)
}
expectedHosts = hosts.GetUniqueHostList(kubeCluster.EtcdHosts, kubeCluster.ControlPlaneHosts, kubeCluster.WorkerHosts)
expectedTaints = getHostsTaintsMap(expectedHosts)
for _, host := range expectedHosts {
var toAddTaints, toDelTaints []string
currentSet := currentTaints[host.Address]
expectedSet := expectedTaints[host.Address]
for key, expected := range expectedSet {
current, ok := currentSet[key]
// create or update taints in host.
// by deleting the old taint and creating the new taint to do the update logic.
if expected != current {
toAddTaints = append(toAddTaints, expected)
if ok { // if found but the values are different, the current taint will be deleted.
toDelTaints = append(toDelTaints, current)
}
}
}
for key, current := range currentSet {
_, ok := expectedSet[key]
if !ok { // remove the taints which can't be found in the expected taints
toDelTaints = append(toDelTaints, current)
}
}
host.ToAddTaints = append(host.ToAddTaints, toAddTaints...)
host.ToDelTaints = append(host.ToDelTaints, toDelTaints...)
}
}
//getHostsTaintsMap return the taint set with unique key & effect for each host
func getHostsTaintsMap(list []*hosts.Host) map[string]map[string]string {
rtn := make(map[string]map[string]string)
for _, item := range list {
set := make(map[string]string)
for _, taint := range item.RKEConfigNode.Taints {
key := getTaintKey(taint)
value := getTaintValue(taint)
if key == unschedulableEtcdTaintKey ||
key == unschedulableControlTaintKey {
logrus.Warnf("taint %s is reserved, ignore this taint", value)
continue
}
if _, ok := set[key]; ok {
logrus.Warnf("duplicated taint %s in host %s, ignore this taint", value, item.Address)
continue
}
set[key] = value
}
if len(set) > 0 {
rtn[item.Address] = set
}
}
return rtn
}
func getTaintKey(taint v3.RKETaint) string {
return fmt.Sprintf("%s=:%s", taint.Key, taint.Effect)
}
func getTaintValue(taint v3.RKETaint) string {
return fmt.Sprintf("%s=%s:%s", taint.Key, taint.Value, taint.Effect)
}