Merge pull request #77423 from apelisse/rollout-restart-other-workloads

Implement rollout restart for statefulset and daemonset
k3s-v1.15.3
Kubernetes Prow Robot 2019-05-16 16:27:06 -07:00 committed by GitHub
commit 6dfc996156
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 3 deletions

View File

@ -54,11 +54,14 @@ var (
restartLong = templates.LongDesc(` restartLong = templates.LongDesc(`
Restart a resource. Restart a resource.
A deployment with the "RolloutStrategy" will be rolling restarted.`) Resource will be rollout restarted.`)
restartExample = templates.Examples(` restartExample = templates.Examples(`
# Restart a deployment # Restart a deployment
kubectl rollout restart deployment/nginx`) kubectl rollout restart deployment/nginx
# Restart a daemonset
kubectl rollout restart daemonset/abc`)
) )
// NewRolloutRestartOptions returns an initialized RestartOptions instance // NewRolloutRestartOptions returns an initialized RestartOptions instance
@ -73,7 +76,7 @@ func NewRolloutRestartOptions(streams genericclioptions.IOStreams) *RestartOptio
func NewCmdRolloutRestart(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command { func NewCmdRolloutRestart(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
o := NewRolloutRestartOptions(streams) o := NewRolloutRestartOptions(streams)
validArgs := []string{"deployment"} validArgs := []string{"deployment", "daemonset", "statefulset"}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "restart RESOURCE", Use: "restart RESOURCE",

View File

@ -71,6 +71,48 @@ func defaultObjectRestarter(obj runtime.Object) ([]byte, error) {
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339) obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj) return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj)
case *extensionsv1beta1.DaemonSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(extensionsv1beta1.SchemeGroupVersion), obj)
case *appsv1.DaemonSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj)
case *appsv1beta2.DaemonSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj)
case *appsv1.StatefulSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1.SchemeGroupVersion), obj)
case *appsv1beta1.StatefulSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta1.SchemeGroupVersion), obj)
case *appsv1beta2.StatefulSet:
if obj.Spec.Template.ObjectMeta.Annotations == nil {
obj.Spec.Template.ObjectMeta.Annotations = make(map[string]string)
}
obj.Spec.Template.ObjectMeta.Annotations["kubectl.kubernetes.io/restartedAt"] = time.Now().Format(time.RFC3339)
return runtime.Encode(scheme.Codecs.LegacyCodec(appsv1beta2.SchemeGroupVersion), obj)
default: default:
return nil, fmt.Errorf("restarting is not supported") return nil, fmt.Errorf("restarting is not supported")
} }

View File

@ -43,6 +43,10 @@ run_daemonset_tests() {
kubectl set resources daemonsets/bind "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi kubectl set resources daemonsets/bind "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field:?}}}" '4' kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field:?}}}" '4'
# Rollout restart should change generation
kubectl rollout restart daemonset/bind "${kube_flags[@]}"
kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '5'
# Clean up # Clean up
kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}" kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
@ -488,6 +492,10 @@ run_stateful_set_tests() {
# TODO: test robust scaling in an e2e. # TODO: test robust scaling in an e2e.
wait-for-pods-with-label "app=nginx-statefulset" "nginx-0" wait-for-pods-with-label "app=nginx-statefulset" "nginx-0"
# Rollout restart should change generation
kubectl rollout restart statefulset nginx "${kube_flags[@]}"
kube::test::get_object_assert 'statefulset nginx' "{{$statefulset_observed_generation}}" '3'
### Clean up ### Clean up
kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]:?}" kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]:?}"
# Post-condition: no pods from statefulset controller # Post-condition: no pods from statefulset controller