Protect Pods from disruptions during upgrades (#2844)
Co-authored-by: Felix Kunde <felix-kunde@gmx.de>
This commit is contained in:
parent
a56ecaace7
commit
c8063eb78a
|
|
@ -106,6 +106,22 @@ func (c *Cluster) removeFailuresAnnotation() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Cluster) criticalOperationLabel(pods []v1.Pod, value *string) error {
|
||||||
|
metadataReq := map[string]map[string]map[string]*string{"metadata": {"labels": {"critical-operation": value}}}
|
||||||
|
|
||||||
|
patchReq, err := json.Marshal(metadataReq)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not marshal ObjectMeta: %v", err)
|
||||||
|
}
|
||||||
|
for _, pod := range pods {
|
||||||
|
_, err = c.KubeClient.Pods(c.Namespace).Patch(context.TODO(), pod.Name, types.StrategicMergePatchType, patchReq, metav1.PatchOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Execute upgrade when mode is set to manual or full or when the owning team is allowed for upgrade (and mode is "off").
|
Execute upgrade when mode is set to manual or full or when the owning team is allowed for upgrade (and mode is "off").
|
||||||
|
|
||||||
|
|
@ -224,6 +240,17 @@ func (c *Cluster) majorVersionUpgrade() error {
|
||||||
if allRunning && masterPod != nil {
|
if allRunning && masterPod != nil {
|
||||||
c.logger.Infof("healthy cluster ready to upgrade, current: %d desired: %d", c.currentMajorVersion, desiredVersion)
|
c.logger.Infof("healthy cluster ready to upgrade, current: %d desired: %d", c.currentMajorVersion, desiredVersion)
|
||||||
if c.currentMajorVersion < desiredVersion {
|
if c.currentMajorVersion < desiredVersion {
|
||||||
|
defer func() error {
|
||||||
|
if err = c.criticalOperationLabel(pods, nil); err != nil {
|
||||||
|
return fmt.Errorf("failed to remove critical-operation label: %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
val := "true"
|
||||||
|
if err = c.criticalOperationLabel(pods, &val); err != nil {
|
||||||
|
return fmt.Errorf("failed to assign critical-operation label: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
podName := &spec.NamespacedName{Namespace: masterPod.Namespace, Name: masterPod.Name}
|
podName := &spec.NamespacedName{Namespace: masterPod.Namespace, Name: masterPod.Name}
|
||||||
c.logger.Infof("triggering major version upgrade on pod %s of %d pods", masterPod.Name, numberOfPods)
|
c.logger.Infof("triggering major version upgrade on pod %s of %d pods", masterPod.Name, numberOfPods)
|
||||||
c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeNormal, "Major Version Upgrade", "starting major version upgrade on pod %s of %d pods", masterPod.Name, numberOfPods)
|
c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeNormal, "Major Version Upgrade", "starting major version upgrade on pod %s of %d pods", masterPod.Name, numberOfPods)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue