mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 18:28:13 +00:00 
			
		
		
		
	cmd/kube-controller-manager
This commit is contained in:
		| @@ -29,8 +29,10 @@ import ( | ||||
| 	"k8s.io/kubernetes/pkg/api/annotations" | ||||
| 	"k8s.io/kubernetes/pkg/api/meta" | ||||
| 	"k8s.io/kubernetes/pkg/api/unversioned" | ||||
| 	"k8s.io/kubernetes/pkg/apis/extensions" | ||||
| 	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" | ||||
| 	"k8s.io/kubernetes/pkg/api/v1" | ||||
| 	internalextensions "k8s.io/kubernetes/pkg/apis/extensions" | ||||
| 	extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" | ||||
| 	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" | ||||
| 	"k8s.io/kubernetes/pkg/controller" | ||||
| 	"k8s.io/kubernetes/pkg/labels" | ||||
| 	"k8s.io/kubernetes/pkg/runtime" | ||||
| @@ -108,7 +110,7 @@ const ( | ||||
| ) | ||||
|  | ||||
| // NewDeploymentCondition creates a new deployment condition. | ||||
| func NewDeploymentCondition(condType extensions.DeploymentConditionType, status api.ConditionStatus, reason, message string) *extensions.DeploymentCondition { | ||||
| func NewDeploymentCondition(condType extensions.DeploymentConditionType, status v1.ConditionStatus, reason, message string) *extensions.DeploymentCondition { | ||||
| 	return &extensions.DeploymentCondition{ | ||||
| 		Type:               condType, | ||||
| 		Status:             status, | ||||
| @@ -266,7 +268,7 @@ func SetNewReplicaSetAnnotations(deployment *extensions.Deployment, newRS *exten | ||||
| 		} | ||||
| 	} | ||||
| 	// If the new replica set is about to be created, we need to add replica annotations to it. | ||||
| 	if !exists && SetReplicasAnnotations(newRS, deployment.Spec.Replicas, deployment.Spec.Replicas+MaxSurge(*deployment)) { | ||||
| 	if !exists && SetReplicasAnnotations(newRS, *(deployment.Spec.Replicas), *(deployment.Spec.Replicas)+MaxSurge(*deployment)) { | ||||
| 		annotationChanged = true | ||||
| 	} | ||||
| 	return annotationChanged | ||||
| @@ -404,7 +406,7 @@ func MaxUnavailable(deployment extensions.Deployment) int32 { | ||||
| 		return int32(0) | ||||
| 	} | ||||
| 	// Error caught by validation | ||||
| 	_, maxUnavailable, _ := ResolveFenceposts(&deployment.Spec.Strategy.RollingUpdate.MaxSurge, &deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, deployment.Spec.Replicas) | ||||
| 	_, maxUnavailable, _ := ResolveFenceposts(deployment.Spec.Strategy.RollingUpdate.MaxSurge, deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, *(deployment.Spec.Replicas)) | ||||
| 	return maxUnavailable | ||||
| } | ||||
|  | ||||
| @@ -413,7 +415,7 @@ func MinAvailable(deployment *extensions.Deployment) int32 { | ||||
| 	if !IsRollingUpdate(deployment) { | ||||
| 		return int32(0) | ||||
| 	} | ||||
| 	return deployment.Spec.Replicas - MaxUnavailable(*deployment) | ||||
| 	return *(deployment.Spec.Replicas) - MaxUnavailable(*deployment) | ||||
| } | ||||
|  | ||||
| // MaxSurge returns the maximum surge pods a rolling deployment can take. | ||||
| @@ -422,7 +424,7 @@ func MaxSurge(deployment extensions.Deployment) int32 { | ||||
| 		return int32(0) | ||||
| 	} | ||||
| 	// Error caught by validation | ||||
| 	maxSurge, _, _ := ResolveFenceposts(&deployment.Spec.Strategy.RollingUpdate.MaxSurge, &deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, deployment.Spec.Replicas) | ||||
| 	maxSurge, _, _ := ResolveFenceposts(deployment.Spec.Strategy.RollingUpdate.MaxSurge, deployment.Spec.Strategy.RollingUpdate.MaxUnavailable, *(deployment.Spec.Replicas)) | ||||
| 	return maxSurge | ||||
| } | ||||
|  | ||||
| @@ -430,7 +432,7 @@ func MaxSurge(deployment extensions.Deployment) int32 { | ||||
| // of the parent deployment, 2. the replica count that needs be added on the replica sets of the | ||||
| // deployment, and 3. the total replicas added in the replica sets of the deployment so far. | ||||
| func GetProportion(rs *extensions.ReplicaSet, d extensions.Deployment, deploymentReplicasToAdd, deploymentReplicasAdded int32) int32 { | ||||
| 	if rs == nil || rs.Spec.Replicas == 0 || deploymentReplicasToAdd == 0 || deploymentReplicasToAdd == deploymentReplicasAdded { | ||||
| 	if rs == nil || *(rs.Spec.Replicas) == 0 || deploymentReplicasToAdd == 0 || deploymentReplicasToAdd == deploymentReplicasAdded { | ||||
| 		return int32(0) | ||||
| 	} | ||||
|  | ||||
| @@ -453,11 +455,11 @@ func GetProportion(rs *extensions.ReplicaSet, d extensions.Deployment, deploymen | ||||
| // 1. a scaling event during a rollout or 2. when scaling a paused deployment. | ||||
| func getReplicaSetFraction(rs extensions.ReplicaSet, d extensions.Deployment) int32 { | ||||
| 	// If we are scaling down to zero then the fraction of this replica set is its whole size (negative) | ||||
| 	if d.Spec.Replicas == int32(0) { | ||||
| 		return -rs.Spec.Replicas | ||||
| 	if *(d.Spec.Replicas) == int32(0) { | ||||
| 		return -*(rs.Spec.Replicas) | ||||
| 	} | ||||
|  | ||||
| 	deploymentReplicas := d.Spec.Replicas + MaxSurge(d) | ||||
| 	deploymentReplicas := *(d.Spec.Replicas) + MaxSurge(d) | ||||
| 	annotatedReplicas, ok := getMaxReplicasAnnotation(&rs) | ||||
| 	if !ok { | ||||
| 		// If we cannot find the annotation then fallback to the current deployment size. Note that this | ||||
| @@ -469,8 +471,8 @@ func getReplicaSetFraction(rs extensions.ReplicaSet, d extensions.Deployment) in | ||||
|  | ||||
| 	// We should never proportionally scale up from zero which means rs.spec.replicas and annotatedReplicas | ||||
| 	// will never be zero here. | ||||
| 	newRSsize := (float64(rs.Spec.Replicas * deploymentReplicas)) / float64(annotatedReplicas) | ||||
| 	return integer.RoundToInt32(newRSsize) - rs.Spec.Replicas | ||||
| 	newRSsize := (float64(*(rs.Spec.Replicas) * deploymentReplicas)) / float64(annotatedReplicas) | ||||
| 	return integer.RoundToInt32(newRSsize) - *(rs.Spec.Replicas) | ||||
| } | ||||
|  | ||||
| // GetAllReplicaSets returns the old and new replica sets targeted by the given Deployment. It gets PodList and ReplicaSetList from client interface. | ||||
| @@ -523,7 +525,7 @@ func GetNewReplicaSet(deployment *extensions.Deployment, c clientset.Interface) | ||||
| // listReplicaSets lists all RSes the given deployment targets with the given client interface. | ||||
| func listReplicaSets(deployment *extensions.Deployment, c clientset.Interface) ([]*extensions.ReplicaSet, error) { | ||||
| 	return ListReplicaSets(deployment, | ||||
| 		func(namespace string, options api.ListOptions) ([]*extensions.ReplicaSet, error) { | ||||
| 		func(namespace string, options v1.ListOptions) ([]*extensions.ReplicaSet, error) { | ||||
| 			rsList, err := c.Extensions().ReplicaSets(namespace).List(options) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| @@ -537,16 +539,16 @@ func listReplicaSets(deployment *extensions.Deployment, c clientset.Interface) ( | ||||
| } | ||||
|  | ||||
| // listReplicaSets lists all Pods the given deployment targets with the given client interface. | ||||
| func listPods(deployment *extensions.Deployment, c clientset.Interface) (*api.PodList, error) { | ||||
| func listPods(deployment *extensions.Deployment, c clientset.Interface) (*v1.PodList, error) { | ||||
| 	return ListPods(deployment, | ||||
| 		func(namespace string, options api.ListOptions) (*api.PodList, error) { | ||||
| 		func(namespace string, options v1.ListOptions) (*v1.PodList, error) { | ||||
| 			return c.Core().Pods(namespace).List(options) | ||||
| 		}) | ||||
| } | ||||
|  | ||||
| // TODO: switch this to full namespacers | ||||
| type rsListFunc func(string, api.ListOptions) ([]*extensions.ReplicaSet, error) | ||||
| type podListFunc func(string, api.ListOptions) (*api.PodList, error) | ||||
| type rsListFunc func(string, v1.ListOptions) ([]*extensions.ReplicaSet, error) | ||||
| type podListFunc func(string, v1.ListOptions) (*v1.PodList, error) | ||||
|  | ||||
| // ListReplicaSets returns a slice of RSes the given deployment targets. | ||||
| func ListReplicaSets(deployment *extensions.Deployment, getRSList rsListFunc) ([]*extensions.ReplicaSet, error) { | ||||
| @@ -558,18 +560,18 @@ func ListReplicaSets(deployment *extensions.Deployment, getRSList rsListFunc) ([ | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	options := api.ListOptions{LabelSelector: selector} | ||||
| 	options := v1.ListOptions{LabelSelector: selector.String()} | ||||
| 	return getRSList(namespace, options) | ||||
| } | ||||
|  | ||||
| // ListPods returns a list of pods the given deployment targets. | ||||
| func ListPods(deployment *extensions.Deployment, getPodList podListFunc) (*api.PodList, error) { | ||||
| func ListPods(deployment *extensions.Deployment, getPodList podListFunc) (*v1.PodList, error) { | ||||
| 	namespace := deployment.Namespace | ||||
| 	selector, err := unversioned.LabelSelectorAsSelector(deployment.Spec.Selector) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	options := api.ListOptions{LabelSelector: selector} | ||||
| 	options := v1.ListOptions{LabelSelector: selector.String()} | ||||
| 	return getPodList(namespace, options) | ||||
| } | ||||
|  | ||||
| @@ -577,7 +579,7 @@ func ListPods(deployment *extensions.Deployment, getPodList podListFunc) (*api.P | ||||
| // We ignore pod-template-hash because the hash result would be different upon podTemplateSpec API changes | ||||
| // (e.g. the addition of a new field will cause the hash code to change) | ||||
| // Note that we assume input podTemplateSpecs contain non-empty labels | ||||
| func equalIgnoreHash(template1, template2 api.PodTemplateSpec) (bool, error) { | ||||
| func equalIgnoreHash(template1, template2 v1.PodTemplateSpec) (bool, error) { | ||||
| 	// First, compare template.Labels (ignoring hash) | ||||
| 	labels1, labels2 := template1.Labels, template2.Labels | ||||
| 	// The podTemplateSpec must have a non-empty label so that label selectors can find them. | ||||
| @@ -597,7 +599,7 @@ func equalIgnoreHash(template1, template2 api.PodTemplateSpec) (bool, error) { | ||||
|  | ||||
| 	// Then, compare the templates without comparing their labels | ||||
| 	template1.Labels, template2.Labels = nil, nil | ||||
| 	result := api.Semantic.DeepEqual(template1, template2) | ||||
| 	result := v1.Semantic.DeepEqual(template1, template2) | ||||
| 	return result, nil | ||||
| } | ||||
|  | ||||
| @@ -620,7 +622,7 @@ func FindNewReplicaSet(deployment *extensions.Deployment, rsList []*extensions.R | ||||
|  | ||||
| // FindOldReplicaSets returns the old replica sets targeted by the given Deployment, with the given PodList and slice of RSes. | ||||
| // Note that the first set of old replica sets doesn't include the ones with no pods, and the second set of old replica sets include all old replica sets. | ||||
| func FindOldReplicaSets(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet, podList *api.PodList) ([]*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { | ||||
| func FindOldReplicaSets(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet, podList *v1.PodList) ([]*extensions.ReplicaSet, []*extensions.ReplicaSet, error) { | ||||
| 	// Find all pods whose labels match deployment.Spec.Selector, and corresponding replica sets for pods in podList. | ||||
| 	// All pods and replica sets are labeled with pod-template-hash to prevent overlapping | ||||
| 	oldRSs := map[string]*extensions.ReplicaSet{} | ||||
| @@ -679,19 +681,19 @@ func WaitForPodsHashPopulated(c clientset.Interface, desiredGeneration int64, na | ||||
| 			return false, err | ||||
| 		} | ||||
| 		return rs.Status.ObservedGeneration >= desiredGeneration && | ||||
| 			rs.Status.FullyLabeledReplicas == rs.Spec.Replicas, nil | ||||
| 			rs.Status.FullyLabeledReplicas == *(rs.Spec.Replicas), nil | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // LabelPodsWithHash labels all pods in the given podList with the new hash label. | ||||
| // The returned bool value can be used to tell if all pods are actually labeled. | ||||
| func LabelPodsWithHash(podList *api.PodList, rs *extensions.ReplicaSet, c clientset.Interface, namespace, hash string) (bool, error) { | ||||
| func LabelPodsWithHash(podList *v1.PodList, rs *extensions.ReplicaSet, c clientset.Interface, namespace, hash string) (bool, error) { | ||||
| 	allPodsLabeled := true | ||||
| 	for _, pod := range podList.Items { | ||||
| 		// Only label the pod that doesn't already have the new hash | ||||
| 		if pod.Labels[extensions.DefaultDeploymentUniqueLabelKey] != hash { | ||||
| 			if _, podUpdated, err := podutil.UpdatePodWithRetries(c.Core().Pods(namespace), &pod, | ||||
| 				func(podToUpdate *api.Pod) error { | ||||
| 				func(podToUpdate *v1.Pod) error { | ||||
| 					// Precondition: the pod doesn't contain the new hash in its label. | ||||
| 					if podToUpdate.Labels[extensions.DefaultDeploymentUniqueLabelKey] == hash { | ||||
| 						return errors.ErrPreconditionViolated | ||||
| @@ -713,9 +715,9 @@ func LabelPodsWithHash(podList *api.PodList, rs *extensions.ReplicaSet, c client | ||||
| } | ||||
|  | ||||
| // GetNewReplicaSetTemplate returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet. | ||||
| func GetNewReplicaSetTemplate(deployment *extensions.Deployment) api.PodTemplateSpec { | ||||
| func GetNewReplicaSetTemplate(deployment *extensions.Deployment) v1.PodTemplateSpec { | ||||
| 	// newRS will have the same template as in deployment spec, plus a unique label in some cases. | ||||
| 	newRSTemplate := api.PodTemplateSpec{ | ||||
| 	newRSTemplate := v1.PodTemplateSpec{ | ||||
| 		ObjectMeta: deployment.Spec.Template.ObjectMeta, | ||||
| 		Spec:       deployment.Spec.Template.Spec, | ||||
| 	} | ||||
| @@ -726,8 +728,23 @@ func GetNewReplicaSetTemplate(deployment *extensions.Deployment) api.PodTemplate | ||||
| 	return newRSTemplate | ||||
| } | ||||
|  | ||||
| // TODO: remove the duplicate | ||||
| // GetNewInternalReplicaSetTemplate returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet. | ||||
| func GetNewInternalReplicaSetTemplate(deployment *internalextensions.Deployment) api.PodTemplateSpec { | ||||
| 	// newRS will have the same template as in deployment spec, plus a unique label in some cases. | ||||
| 	newRSTemplate := api.PodTemplateSpec{ | ||||
| 		ObjectMeta: deployment.Spec.Template.ObjectMeta, | ||||
| 		Spec:       deployment.Spec.Template.Spec, | ||||
| 	} | ||||
| 	newRSTemplate.ObjectMeta.Labels = labelsutil.CloneAndAddLabel( | ||||
| 		deployment.Spec.Template.ObjectMeta.Labels, | ||||
| 		internalextensions.DefaultDeploymentUniqueLabelKey, | ||||
| 		podutil.GetInternalPodTemplateSpecHash(newRSTemplate)) | ||||
| 	return newRSTemplate | ||||
| } | ||||
|  | ||||
| // SetFromReplicaSetTemplate sets the desired PodTemplateSpec from a replica set template to the given deployment. | ||||
| func SetFromReplicaSetTemplate(deployment *extensions.Deployment, template api.PodTemplateSpec) *extensions.Deployment { | ||||
| func SetFromReplicaSetTemplate(deployment *extensions.Deployment, template v1.PodTemplateSpec) *extensions.Deployment { | ||||
| 	deployment.Spec.Template.ObjectMeta = template.ObjectMeta | ||||
| 	deployment.Spec.Template.Spec = template.Spec | ||||
| 	deployment.Spec.Template.ObjectMeta.Labels = labelsutil.CloneAndRemoveLabel( | ||||
| @@ -741,7 +758,7 @@ func GetReplicaCountForReplicaSets(replicaSets []*extensions.ReplicaSet) int32 { | ||||
| 	totalReplicas := int32(0) | ||||
| 	for _, rs := range replicaSets { | ||||
| 		if rs != nil { | ||||
| 			totalReplicas += rs.Spec.Replicas | ||||
| 			totalReplicas += *(rs.Spec.Replicas) | ||||
| 		} | ||||
| 	} | ||||
| 	return totalReplicas | ||||
| @@ -772,7 +789,7 @@ func GetAvailableReplicaCountForReplicaSets(replicaSets []*extensions.ReplicaSet | ||||
| // IsPodAvailable return true if the pod is available. | ||||
| // TODO: Remove this once we start using replica set status for calculating available pods | ||||
| // for a deployment. | ||||
| func IsPodAvailable(pod *api.Pod, minReadySeconds int32, now time.Time) bool { | ||||
| func IsPodAvailable(pod *v1.Pod, minReadySeconds int32, now time.Time) bool { | ||||
| 	if !controller.IsPodActive(pod) { | ||||
| 		return false | ||||
| 	} | ||||
| @@ -780,7 +797,7 @@ func IsPodAvailable(pod *api.Pod, minReadySeconds int32, now time.Time) bool { | ||||
| 	// If so, this pod is ready | ||||
| 	for _, c := range pod.Status.Conditions { | ||||
| 		// we only care about pod ready conditions | ||||
| 		if c.Type == api.PodReady && c.Status == api.ConditionTrue { | ||||
| 		if c.Type == v1.PodReady && c.Status == v1.ConditionTrue { | ||||
| 			glog.V(4).Infof("Comparing pod %s/%s ready condition last transition time %s + minReadySeconds %d with now %s.", pod.Namespace, pod.Name, c.LastTransitionTime.String(), minReadySeconds, now.String()) | ||||
| 			// 2 cases that this ready condition is valid (passed minReadySeconds, i.e. the pod is available): | ||||
| 			// 1. minReadySeconds == 0, or | ||||
| @@ -802,8 +819,8 @@ func IsRollingUpdate(deployment *extensions.Deployment) bool { | ||||
| // DeploymentComplete considers a deployment to be complete once its desired replicas equals its | ||||
| // updatedReplicas and it doesn't violate minimum availability. | ||||
| func DeploymentComplete(deployment *extensions.Deployment, newStatus *extensions.DeploymentStatus) bool { | ||||
| 	return newStatus.UpdatedReplicas == deployment.Spec.Replicas && | ||||
| 		newStatus.AvailableReplicas >= deployment.Spec.Replicas-MaxUnavailable(*deployment) | ||||
| 	return newStatus.UpdatedReplicas == *(deployment.Spec.Replicas) && | ||||
| 		newStatus.AvailableReplicas >= *(deployment.Spec.Replicas)-MaxUnavailable(*deployment) | ||||
| } | ||||
|  | ||||
| // DeploymentProgressing reports progress for a deployment. Progress is estimated by comparing the | ||||
| @@ -857,24 +874,24 @@ func NewRSNewReplicas(deployment *extensions.Deployment, allRSs []*extensions.Re | ||||
| 	switch deployment.Spec.Strategy.Type { | ||||
| 	case extensions.RollingUpdateDeploymentStrategyType: | ||||
| 		// Check if we can scale up. | ||||
| 		maxSurge, err := intstrutil.GetValueFromIntOrPercent(&deployment.Spec.Strategy.RollingUpdate.MaxSurge, int(deployment.Spec.Replicas), true) | ||||
| 		maxSurge, err := intstrutil.GetValueFromIntOrPercent(deployment.Spec.Strategy.RollingUpdate.MaxSurge, int(*(deployment.Spec.Replicas)), true) | ||||
| 		if err != nil { | ||||
| 			return 0, err | ||||
| 		} | ||||
| 		// Find the total number of pods | ||||
| 		currentPodCount := GetReplicaCountForReplicaSets(allRSs) | ||||
| 		maxTotalPods := deployment.Spec.Replicas + int32(maxSurge) | ||||
| 		maxTotalPods := *(deployment.Spec.Replicas) + int32(maxSurge) | ||||
| 		if currentPodCount >= maxTotalPods { | ||||
| 			// Cannot scale up. | ||||
| 			return newRS.Spec.Replicas, nil | ||||
| 			return *(newRS.Spec.Replicas), nil | ||||
| 		} | ||||
| 		// Scale up. | ||||
| 		scaleUpCount := maxTotalPods - currentPodCount | ||||
| 		// Do not exceed the number of desired replicas. | ||||
| 		scaleUpCount = int32(integer.IntMin(int(scaleUpCount), int(deployment.Spec.Replicas-newRS.Spec.Replicas))) | ||||
| 		return newRS.Spec.Replicas + scaleUpCount, nil | ||||
| 		scaleUpCount = int32(integer.IntMin(int(scaleUpCount), int(*(deployment.Spec.Replicas)-*(newRS.Spec.Replicas)))) | ||||
| 		return *(newRS.Spec.Replicas) + scaleUpCount, nil | ||||
| 	case extensions.RecreateDeploymentStrategyType: | ||||
| 		return deployment.Spec.Replicas, nil | ||||
| 		return *(deployment.Spec.Replicas), nil | ||||
| 	default: | ||||
| 		return 0, fmt.Errorf("deployment type %v isn't supported", deployment.Spec.Strategy.Type) | ||||
| 	} | ||||
| @@ -892,7 +909,7 @@ func IsSaturated(deployment *extensions.Deployment, rs *extensions.ReplicaSet) b | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return rs.Spec.Replicas == deployment.Spec.Replicas && int32(desired) == deployment.Spec.Replicas | ||||
| 	return *(rs.Spec.Replicas) == *(deployment.Spec.Replicas) && int32(desired) == *(deployment.Spec.Replicas) | ||||
| } | ||||
|  | ||||
| // WaitForObservedDeployment polls for deployment to be updated so that deployment.Status.ObservedGeneration >= desiredGeneration. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Chao Xu
					Chao Xu