mirror of https://github.com/k3s-io/k3s
Merge pull request #77423 from apelisse/rollout-restart-other-workloads
Implement rollout restart for statefulset and daemonsetk3s-v1.15.3
commit
6dfc996156
|
@ -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",
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue