diff --git a/cluster-autoscaler/cloudprovider/gce/cache.go b/cluster-autoscaler/cloudprovider/gce/cache.go
index 075aa2343f4f8a177da9a7d940c7a735cbd799f1..1f2d38e1d1dc3f4ecea3a5006227766f35c13d4c 100644
--- a/cluster-autoscaler/cloudprovider/gce/cache.go
+++ b/cluster-autoscaler/cloudprovider/gce/cache.go
@@ -432,6 +432,25 @@ func (gc *GceCache) InvalidateAllMigInstanceTemplates() {
 	gc.instanceTemplatesCache = map[GceRef]*gce.InstanceTemplate{}
 }
 
+// DropInstanceTemplatesForMissingMigs clears the instance template
+// cache intended MIGs which are no longer present in the cluster
+func (gc *GceCache) DropInstanceTemplatesForMissingMigs(currentMigs []Mig) {
+	gc.cacheMutex.Lock()
+	defer gc.cacheMutex.Unlock()
+
+	requiredKeys := make(map[GceRef]struct{}, len(currentMigs))
+	for _, mig := range currentMigs {
+		requiredKeys[mig.GceRef()] = struct{}{}
+	}
+
+	klog.V(5).Infof("Instance template cache partially invalidated")
+	for key := range gc.instanceTemplatesCache {
+		if _, exists := requiredKeys[key]; !exists {
+			delete(gc.instanceTemplatesCache, key)
+		}
+	}
+}
+
 // GetMigKubeEnv returns the cached KubeEnv for a mig GceRef
 func (gc *GceCache) GetMigKubeEnv(ref GceRef) (KubeEnv, bool) {
 	gc.cacheMutex.Lock()
diff --git a/cluster-autoscaler/cloudprovider/gce/gce_manager.go b/cluster-autoscaler/cloudprovider/gce/gce_manager.go
index 11cebc26aa0c52b1bdeab5b5305194eee822fb06..9457b2953680313824ba418c03e15473c2a590aa 100644
--- a/cluster-autoscaler/cloudprovider/gce/gce_manager.go
+++ b/cluster-autoscaler/cloudprovider/gce/gce_manager.go
@@ -306,7 +306,14 @@ func (m *gceManagerImpl) Refresh() error {
 	if m.lastRefresh.Add(refreshInterval).After(time.Now()) {
 		return nil
 	}
-	return m.forceRefresh()
+
+	if err := m.forceRefresh(); err != nil {
+		return err
+	}
+
+	migs := m.migLister.GetMigs()
+	m.cache.DropInstanceTemplatesForMissingMigs(migs)
+	return nil
 }
 
 func (m *gceManagerImpl) CreateInstances(mig Mig, delta int64) error {