Skip to content

Commit ab1b374

Browse files
authored
Merge pull request kubernetes#84523 from rajansandeep/skipmigration
Retain CoreDNS corefile when migration fails in kubeadm
2 parents ae15368 + 16191db commit ab1b374

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

cmd/kubeadm/app/phases/addons/dns/dns.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,17 @@ func createCoreDNSAddon(deploymentBytes, serviceBytes, configBytes []byte, clien
236236
if err != nil {
237237
return errors.Wrap(err, "unable to fetch CoreDNS current installed version and ConfigMap.")
238238
}
239+
240+
var hasCoreDNSMigrationFailed bool
239241
if IsCoreDNSConfigMapMigrationRequired(corefile) {
240242
if err := migrateCoreDNSCorefile(client, coreDNSConfigMap, corefile, currentInstalledCoreDNSVersion); err != nil {
241-
return err
243+
// Errors in Corefile Migration is verified during preflight checks. This part will be executed when a user has chosen
244+
// to ignore preflight check errors.
245+
hasCoreDNSMigrationFailed = true
246+
klog.Warningf("the CoreDNS Configuration was not migrated: %v. The existing CoreDNS Corefile configuration has been retained.", err)
247+
if err := apiclient.CreateOrRetainConfigMap(client, coreDNSConfigMap, kubeadmconstants.CoreDNSConfigMap); err != nil {
248+
return err
249+
}
242250
}
243251
} else {
244252
if err := apiclient.CreateOrUpdateConfigMap(client, coreDNSConfigMap); err != nil {
@@ -281,9 +289,16 @@ func createCoreDNSAddon(deploymentBytes, serviceBytes, configBytes []byte, clien
281289
return errors.Wrapf(err, "%s Deployment", unableToDecodeCoreDNS)
282290
}
283291

284-
// Create the Deployment for CoreDNS or update it in case it already exists
285-
if err := apiclient.CreateOrUpdateDeployment(client, coreDNSDeployment); err != nil {
286-
return err
292+
// Create the deployment for CoreDNS or retain it in case the CoreDNS migration has failed during upgrade
293+
if hasCoreDNSMigrationFailed {
294+
if err := apiclient.CreateOrRetainDeployment(client, coreDNSDeployment, kubeadmconstants.CoreDNSDeploymentName); err != nil {
295+
return err
296+
}
297+
} else {
298+
// Create the Deployment for CoreDNS or update it in case it already exists
299+
if err := apiclient.CreateOrUpdateDeployment(client, coreDNSDeployment); err != nil {
300+
return err
301+
}
287302
}
288303

289304
coreDNSService := &v1.Service{}

cmd/kubeadm/app/phases/upgrade/preflight.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func checkMigration(client clientset.Interface) error {
108108

109109
_, err = migration.Migrate(currentInstalledCoreDNSversion, kubeadmconstants.CoreDNSVersion, corefile, false)
110110
if err != nil {
111-
return err
111+
return errors.Wrap(err, "CoreDNS will not be upgraded")
112112
}
113113
return nil
114114
}

cmd/kubeadm/app/util/apiclient/idempotency.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,21 @@ func CreateOrUpdateDeployment(client clientset.Interface, deploy *apps.Deploymen
147147
return nil
148148
}
149149

150+
// CreateOrRetainDeployment creates a Deployment if the target resource doesn't exist. If the resource exists already, this function will retain the resource instead.
151+
func CreateOrRetainDeployment(client clientset.Interface, deploy *apps.Deployment, deployName string) error {
152+
if _, err := client.AppsV1().Deployments(deploy.ObjectMeta.Namespace).Get(deployName, metav1.GetOptions{}); err != nil {
153+
if !apierrors.IsNotFound(err) {
154+
return nil
155+
}
156+
if _, err := client.AppsV1().Deployments(deploy.ObjectMeta.Namespace).Create(deploy); err != nil {
157+
if !apierrors.IsAlreadyExists(err) {
158+
return errors.Wrap(err, "unable to create deployment")
159+
}
160+
}
161+
}
162+
return nil
163+
}
164+
150165
// CreateOrUpdateDaemonSet creates a DaemonSet if the target resource doesn't exist. If the resource exists already, this function will update the resource instead.
151166
func CreateOrUpdateDaemonSet(client clientset.Interface, ds *apps.DaemonSet) error {
152167
if _, err := client.AppsV1().DaemonSets(ds.ObjectMeta.Namespace).Create(ds); err != nil {

0 commit comments

Comments
 (0)