
Deployments get cleaned up only when they are paused, they get scaled up/down, or when the strategy that drives rollouts completes. This means that stuck deployments that fall into none of the above categories will not get cleaned up. Since cleanup is already safe by itself (we only delete old replica sets that are synced by the replica set controller and have no replicas) we can execute it for every deployment when there is no intention to rollback.
106 lines
3.2 KiB
Go
106 lines
3.2 KiB
Go
/*
|
|
Copyright 2016 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package deployment
|
|
|
|
import (
|
|
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
|
"k8s.io/kubernetes/pkg/controller"
|
|
)
|
|
|
|
// rolloutRecreate implements the logic for recreating a replica set.
|
|
func (dc *DeploymentController) rolloutRecreate(deployment *extensions.Deployment) error {
|
|
// Don't create a new RS if not already existed, so that we avoid scaling up before scaling down
|
|
newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(deployment, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
allRSs := append(oldRSs, newRS)
|
|
activeOldRSs := controller.FilterActiveReplicaSets(oldRSs)
|
|
|
|
// scale down old replica sets
|
|
scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(activeOldRSs, deployment)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if scaledDown {
|
|
// Update DeploymentStatus
|
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
|
}
|
|
|
|
newStatus := calculateStatus(allRSs, newRS, deployment)
|
|
// Do not process a deployment when it has old pods running.
|
|
if newStatus.UpdatedReplicas == 0 {
|
|
podList, err := dc.listPods(deployment)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(podList.Items) > 0 {
|
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
|
}
|
|
}
|
|
|
|
// If we need to create a new RS, create it now
|
|
// TODO: Create a new RS without re-listing all RSs.
|
|
if newRS == nil {
|
|
newRS, oldRSs, err = dc.getAllReplicaSetsAndSyncRevision(deployment, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
allRSs = append(oldRSs, newRS)
|
|
}
|
|
|
|
// scale up new replica set
|
|
scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, deployment)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if scaledUp {
|
|
// Update DeploymentStatus
|
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
|
}
|
|
|
|
// Sync deployment status
|
|
return dc.syncRolloutStatus(allRSs, newRS, deployment)
|
|
}
|
|
|
|
// scaleDownOldReplicaSetsForRecreate scales down old replica sets when deployment strategy is "Recreate"
|
|
func (dc *DeploymentController) scaleDownOldReplicaSetsForRecreate(oldRSs []*extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) {
|
|
scaled := false
|
|
for i := range oldRSs {
|
|
rs := oldRSs[i]
|
|
// Scaling not required.
|
|
if *(rs.Spec.Replicas) == 0 {
|
|
continue
|
|
}
|
|
scaledRS, updatedRS, err := dc.scaleReplicaSetAndRecordEvent(rs, 0, deployment)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if scaledRS {
|
|
oldRSs[i] = updatedRS
|
|
scaled = true
|
|
}
|
|
}
|
|
return scaled, nil
|
|
}
|
|
|
|
// scaleUpNewReplicaSetForRecreate scales up new replica set when deployment strategy is "Recreate"
|
|
func (dc *DeploymentController) scaleUpNewReplicaSetForRecreate(newRS *extensions.ReplicaSet, deployment *extensions.Deployment) (bool, error) {
|
|
scaled, _, err := dc.scaleReplicaSetAndRecordEvent(newRS, *(deployment.Spec.Replicas), deployment)
|
|
return scaled, err
|
|
}
|