
Although Deployment already applied its ControllerRef to adopt matching ReplicaSets, it actually still used label selectors to list objects that it controls. That meant it didn't actually follow the rules of ControllerRef, so it could still fight with other controller types. This should mean that the special handling for overlapping Deployments is no longer necessary, since each Deployment will only see objects that it owns (via ControllerRef).
106 lines
3.3 KiB
Go
106 lines
3.3 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 (
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"k8s.io/kubernetes/pkg/api/v1"
|
|
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(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) 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(d, rsList, podMap, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
allRSs := append(oldRSs, newRS)
|
|
activeOldRSs := controller.FilterActiveReplicaSets(oldRSs)
|
|
|
|
// scale down old replica sets
|
|
scaledDown, err := dc.scaleDownOldReplicaSetsForRecreate(activeOldRSs, d)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if scaledDown {
|
|
// Update DeploymentStatus
|
|
return dc.syncRolloutStatus(allRSs, newRS, d)
|
|
}
|
|
|
|
newStatus := calculateStatus(allRSs, newRS, d)
|
|
// Do not process a deployment when it has old pods running.
|
|
if newStatus.UpdatedReplicas == 0 {
|
|
for _, podList := range podMap {
|
|
if len(podList.Items) > 0 {
|
|
return dc.syncRolloutStatus(allRSs, newRS, d)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 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(d, rsList, podMap, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
allRSs = append(oldRSs, newRS)
|
|
}
|
|
|
|
// scale up new replica set
|
|
scaledUp, err := dc.scaleUpNewReplicaSetForRecreate(newRS, d)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if scaledUp {
|
|
// Update DeploymentStatus
|
|
return dc.syncRolloutStatus(allRSs, newRS, d)
|
|
}
|
|
|
|
// Sync deployment status
|
|
return dc.syncRolloutStatus(allRSs, newRS, d)
|
|
}
|
|
|
|
// 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
|
|
}
|