diff --git a/cluster/mesos/docker/docker-compose.yml b/cluster/mesos/docker/docker-compose.yml index 6906664e315..32ca8259cc8 100644 --- a/cluster/mesos/docker/docker-compose.yml +++ b/cluster/mesos/docker/docker-compose.yml @@ -85,6 +85,7 @@ apiserver: --cloud-config=/opt/mesos-cloud.conf --tls-cert-file=/var/run/kubernetes/auth/apiserver.crt --tls-private-key-file=/var/run/kubernetes/auth/apiserver.key + --runtime-config=experimental/v1alpha1 --v=4 ports: [ "8888:8888", "6443:6443" ] environment: diff --git a/contrib/mesos/pkg/executor/executor.go b/contrib/mesos/pkg/executor/executor.go index 1577c3a7883..390b8310c53 100644 --- a/contrib/mesos/pkg/executor/executor.go +++ b/contrib/mesos/pkg/executor/executor.go @@ -36,6 +36,7 @@ import ( "k8s.io/kubernetes/contrib/mesos/pkg/node" "k8s.io/kubernetes/contrib/mesos/pkg/scheduler/meta" "k8s.io/kubernetes/pkg/api" + unversionedapi "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/client/cache" client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/controller/framework" @@ -376,21 +377,25 @@ func (k *KubernetesExecutor) handleChangedApiserverPod(pod *api.Pod) { oldPod := k.pods[task.podName] // terminating pod? - if oldPod != nil && oldPod.DeletionTimestamp == nil && - pod.DeletionTimestamp != nil && pod.Status.Phase == api.PodRunning && - pod.DeletionGracePeriodSeconds != nil && *pod.DeletionGracePeriodSeconds > 0 { + if oldPod != nil && pod.Status.Phase == api.PodRunning { + timeModified := differentTime(oldPod.DeletionTimestamp, pod.DeletionTimestamp) + graceModified := differentPeriod(oldPod.DeletionGracePeriodSeconds, pod.DeletionGracePeriodSeconds) + if timeModified || graceModified { + log.Infof("pod %s/%s is terminating at %v with %vs grace period, telling kubelet", pod.Namespace, pod.Name, *pod.DeletionTimestamp, *pod.DeletionGracePeriodSeconds) - log.Infof("pod %s/%s is terminating at %v with %vs grace period, telling kubelet", pod.Namespace, pod.Name, *pod.DeletionTimestamp, *pod.DeletionGracePeriodSeconds) + // modify the pod in our registry instead of sending the new pod. The later + // would allow that other changes bleed into the kubelet. For now we are + // very conservative changing this behaviour. + // TODO(sttts): check whether we can and should send all changes down to the kubelet + oldPod.DeletionTimestamp = pod.DeletionTimestamp + oldPod.DeletionGracePeriodSeconds = pod.DeletionGracePeriodSeconds - // modify pod in our registry to avoid that other changed bleed into the kubelet - oldPod.DeletionTimestamp = pod.DeletionTimestamp - oldPod.DeletionGracePeriodSeconds = pod.DeletionGracePeriodSeconds - - update := kubelet.PodUpdate{ - Op: kubelet.UPDATE, - Pods: []*api.Pod{oldPod}, + update := kubelet.PodUpdate{ + Op: kubelet.UPDATE, + Pods: []*api.Pod{oldPod}, + } + k.updateChan <- update } - k.updateChan <- update } } @@ -940,3 +945,11 @@ func (k *KubernetesExecutor) sendLoop() { } } } + +func differentTime(a, b *unversionedapi.Time) bool { + return (a == nil) != (b == nil) || (a != nil && b != nil && *a != *b) +} + +func differentPeriod(a, b *int64) bool { + return (a == nil) != (b == nil) || (a != nil && b != nil && *a != *b) +}