diff --git a/pkg/apis/etcd/v1beta2/cluster.go b/pkg/apis/etcd/v1beta2/cluster.go index 889534b6b..8d9aba915 100644 --- a/pkg/apis/etcd/v1beta2/cluster.go +++ b/pkg/apis/etcd/v1beta2/cluster.go @@ -162,6 +162,11 @@ type PodPolicy struct { // '.cluster.local'. // The default is to not set a cluster domain explicitly. ClusterDomain string `json:"ClusterDomain"` + + // Sets the 'emptyDir.medium' field for the etcd-data volume to "Memory". + // The default is to not use memory as the storage medium + // No effect if persistent volume is used + Tmpfs bool `json:"tmpfs,omitempty"` } // TODO: move this to initializer diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index fe4f297f4..1c66d5d26 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -377,9 +377,9 @@ func (c *Cluster) createPod(members etcdutil.MemberSet, m *etcdutil.Member, stat if err != nil { return fmt.Errorf("failed to create PVC for member (%s): %v", m.Name, err) } - k8sutil.AddEtcdVolumeToPod(pod, pvc) + k8sutil.AddEtcdVolumeToPod(pod, pvc, false) } else { - k8sutil.AddEtcdVolumeToPod(pod, nil) + k8sutil.AddEtcdVolumeToPod(pod, nil, c.cluster.Spec.Pod.Tmpfs) } _, err := c.config.KubeCli.CoreV1().Pods(c.cluster.Namespace).Create(pod) return err diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 8db36f18a..fe02742f7 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -247,7 +247,7 @@ func newEtcdServiceManifest(svcName, clusterName, clusterIP string, ports []v1.S } // AddEtcdVolumeToPod abstract the process of appending volume spec to pod spec -func AddEtcdVolumeToPod(pod *v1.Pod, pvc *v1.PersistentVolumeClaim) { +func AddEtcdVolumeToPod(pod *v1.Pod, pvc *v1.PersistentVolumeClaim, tmpfs bool) { vol := v1.Volume{Name: etcdVolumeName} if pvc != nil { vol.VolumeSource = v1.VolumeSource{ @@ -255,6 +255,9 @@ func AddEtcdVolumeToPod(pod *v1.Pod, pvc *v1.PersistentVolumeClaim) { } } else { vol.VolumeSource = v1.VolumeSource{EmptyDir: &v1.EmptyDirVolumeSource{}} + if tmpfs { + vol.VolumeSource.EmptyDir.Medium = v1.StorageMediumMemory + } } pod.Spec.Volumes = append(pod.Spec.Volumes, vol) } @@ -274,7 +277,7 @@ func NewSeedMemberPod(clusterName string, ms etcdutil.MemberSet, m *etcdutil.Mem token := uuid.New() pod := newEtcdPod(m, ms.PeerURLPairs(), clusterName, "new", token, cs) // TODO: PVC datadir support for restore process - AddEtcdVolumeToPod(pod, nil) + AddEtcdVolumeToPod(pod, nil, cs.Pod.Tmpfs) if backupURL != nil { addRecoveryToPod(pod, token, m, cs, backupURL) }