Skip to content

Commit 22f3ce5

Browse files
authored
Merge pull request kubernetes#124820 from SataQiu/feat-kubeadm-20240511
kubeadm: add support for patching a corednsdeployment target
2 parents b8c4e12 + 1329935 commit 22f3ce5

File tree

10 files changed

+62
-22
lines changed

10 files changed

+62
-22
lines changed

cmd/kubeadm/app/apis/kubeadm/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ type HostPathMount struct {
468468
type Patches struct {
469469
// Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension".
470470
// For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of
471-
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration".
471+
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration", "corednsdeployment".
472472
// "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl.
473473
// The default "patchtype" is "strategic". "extension" must be either "json" or "yaml".
474474
// "suffix" is an optional string that can be used to determine which patches are applied

cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ type HostPathMount struct {
438438
type Patches struct {
439439
// Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension".
440440
// For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of
441-
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration".
441+
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration", "corednsdeployment".
442442
// "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl.
443443
// The default "patchtype" is "strategic". "extension" must be either "json" or "yaml".
444444
// "suffix" is an optional string that can be used to determine which patches are applied

cmd/kubeadm/app/apis/kubeadm/v1beta4/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ type HostPathMount struct {
487487
type Patches struct {
488488
// Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension".
489489
// For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of
490-
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration".
490+
// "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration", "corednsdeployment".
491491
// "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl.
492492
// The default "patchtype" is "strategic". "extension" must be either "json" or "yaml".
493493
// "suffix" is an optional string that can be used to determine which patches are applied

cmd/kubeadm/app/cmd/options/generic.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func AddPatchesFlag(fs *pflag.FlagSet, patchesDir *string) {
9999
const usage = `Path to a directory that contains files named ` +
100100
`"target[suffix][+patchtype].extension". For example, ` +
101101
`"kube-apiserver0+merge.yaml" or just "etcd.json". ` +
102-
`"target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration". ` +
102+
`"target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd", "kubeletconfiguration", "corednsdeployment". ` +
103103
`"patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats ` +
104104
`supported by kubectl. The default "patchtype" is "strategic". "extension" must be either ` +
105105
`"json" or "yaml". "suffix" is an optional string that can be used to determine ` +

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,37 +84,38 @@ func NewAddonPhase() workflow.Phase {
8484
}
8585
}
8686

87-
func getInitData(c workflow.RunData) (*kubeadmapi.InitConfiguration, clientset.Interface, io.Writer, error) {
87+
func getInitData(c workflow.RunData) (*kubeadmapi.InitConfiguration, clientset.Interface, string, io.Writer, error) {
8888
data, ok := c.(InitData)
8989
if !ok {
90-
return nil, nil, nil, errors.New("addon phase invoked with an invalid data struct")
90+
return nil, nil, "", nil, errors.New("addon phase invoked with an invalid data struct")
9191
}
9292
cfg := data.Cfg()
9393
var client clientset.Interface
9494
var err error
9595
if !printManifest {
9696
client, err = data.Client()
9797
if err != nil {
98-
return nil, nil, nil, err
98+
return nil, nil, "", nil, err
9999
}
100100
}
101101

102102
out := data.OutputWriter()
103-
return cfg, client, out, err
103+
patchesDir := data.PatchesDir()
104+
return cfg, client, patchesDir, out, err
104105
}
105106

106107
// runCoreDNSAddon installs CoreDNS addon to a Kubernetes cluster
107108
func runCoreDNSAddon(c workflow.RunData) error {
108-
cfg, client, out, err := getInitData(c)
109+
cfg, client, patchesDir, out, err := getInitData(c)
109110
if err != nil {
110111
return err
111112
}
112-
return dnsaddon.EnsureDNSAddon(&cfg.ClusterConfiguration, client, out, printManifest)
113+
return dnsaddon.EnsureDNSAddon(&cfg.ClusterConfiguration, client, patchesDir, out, printManifest)
113114
}
114115

115116
// runKubeProxyAddon installs KubeProxy addon to a Kubernetes cluster
116117
func runKubeProxyAddon(c workflow.RunData) error {
117-
cfg, client, out, err := getInitData(c)
118+
cfg, client, _, out, err := getInitData(c)
118119
if err != nil {
119120
return err
120121
}

cmd/kubeadm/app/cmd/phases/upgrade/node/controlplane.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func runControlPlane() func(c workflow.RunData) error {
7878
return errors.Wrap(err, "couldn't complete the static pod upgrade")
7979
}
8080

81-
if err := upgrade.PerformAddonsUpgrade(client, cfg, data.OutputWriter()); err != nil {
81+
if err := upgrade.PerformAddonsUpgrade(client, cfg, data.PatchesDir(), data.OutputWriter()); err != nil {
8282
return errors.Wrap(err, "failed to perform addons upgrade")
8383
}
8484

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ import (
3535
clientset "k8s.io/client-go/kubernetes"
3636
clientsetscheme "k8s.io/client-go/kubernetes/scheme"
3737
"k8s.io/klog/v2"
38+
"sigs.k8s.io/yaml"
3839

3940
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
4041
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
4142
"k8s.io/kubernetes/cmd/kubeadm/app/images"
4243
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
4344
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
4445
"k8s.io/kubernetes/cmd/kubeadm/app/util/image"
46+
"k8s.io/kubernetes/cmd/kubeadm/app/util/patches"
4547
)
4648

4749
const (
@@ -85,7 +87,7 @@ func deployedDNSReplicas(client clientset.Interface, replicas int32) (*int32, er
8587
}
8688

8789
// EnsureDNSAddon creates the CoreDNS addon
88-
func EnsureDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Interface, out io.Writer, printManifest bool) error {
90+
func EnsureDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Interface, patchesDir string, out io.Writer, printManifest bool) error {
8991
var replicas *int32
9092
var err error
9193
if !printManifest {
@@ -97,10 +99,10 @@ func EnsureDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Inter
9799
var defaultReplicas int32 = coreDNSReplicas
98100
replicas = &defaultReplicas
99101
}
100-
return coreDNSAddon(cfg, client, replicas, out, printManifest)
102+
return coreDNSAddon(cfg, client, replicas, patchesDir, out, printManifest)
101103
}
102104

103-
func coreDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Interface, replicas *int32, out io.Writer, printManifest bool) error {
105+
func coreDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Interface, replicas *int32, patchesDir string, out io.Writer, printManifest bool) error {
104106
// Get the YAML manifest
105107
coreDNSDeploymentBytes, err := kubeadmutil.ParseTemplate(CoreDNSDeployment, struct {
106108
DeploymentName, Image, ControlPlaneTaintKey string
@@ -115,6 +117,14 @@ func coreDNSAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset.Interfa
115117
return errors.Wrap(err, "error when parsing CoreDNS deployment template")
116118
}
117119

120+
// Apply patches to the CoreDNS Deployment
121+
if len(patchesDir) != 0 {
122+
coreDNSDeploymentBytes, err = applyCoreDNSDeploymentPatches(coreDNSDeploymentBytes, patchesDir, out)
123+
if err != nil {
124+
return errors.Wrap(err, "could not apply patches to the CoreDNS Deployment")
125+
}
126+
}
127+
118128
// Get the config file for CoreDNS
119129
coreDNSConfigMapBytes, err := kubeadmutil.ParseTemplate(CoreDNSConfigMap, struct{ DNSDomain, UpstreamNameserver, StubDomain string }{
120130
DNSDomain: cfg.Networking.DNSDomain,
@@ -377,3 +387,27 @@ func setCorefile(client clientset.Interface, coreDNSCorefileName string) error {
377387
}
378388
return nil
379389
}
390+
391+
// applyCoreDNSDeploymentPatches reads patches from a directory and applies them over the input coreDNSDeploymentBytes
392+
func applyCoreDNSDeploymentPatches(coreDNSDeploymentBytes []byte, patchesDir string, output io.Writer) ([]byte, error) {
393+
patchManager, err := patches.GetPatchManagerForPath(patchesDir, patches.KnownTargets(), output)
394+
if err != nil {
395+
return nil, err
396+
}
397+
398+
patchTarget := &patches.PatchTarget{
399+
Name: patches.CoreDNSDeployment,
400+
StrategicMergePatchObject: apps.Deployment{},
401+
Data: coreDNSDeploymentBytes,
402+
}
403+
if err := patchManager.ApplyPatchesToTarget(patchTarget); err != nil {
404+
return nil, err
405+
}
406+
407+
coreDNSDeploymentBytes, err = yaml.JSONToYAML(patchTarget.Data)
408+
if err != nil {
409+
return nil, err
410+
}
411+
412+
return coreDNSDeploymentBytes, nil
413+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ metadata:
865865
t.Run(tt.name, func(t *testing.T) {
866866
out := &bytes.Buffer{}
867867
var replicas int32 = 3
868-
if err := coreDNSAddon(tt.args.cfg, tt.args.client, &replicas, out, tt.args.printManifest); (err != nil) != tt.wantErr {
868+
if err := coreDNSAddon(tt.args.cfg, tt.args.client, &replicas, "", out, tt.args.printManifest); (err != nil) != tt.wantErr {
869869
t.Errorf("coreDNSAddon() error = %v, wantErr %v", err, tt.wantErr)
870870
return
871871
}
@@ -1148,7 +1148,7 @@ metadata:
11481148
for _, tt := range tests {
11491149
t.Run(tt.name, func(t *testing.T) {
11501150
out := &bytes.Buffer{}
1151-
if err := EnsureDNSAddon(tt.args.cfg, tt.args.client, out, tt.args.printManifest); (err != nil) != tt.wantErr {
1151+
if err := EnsureDNSAddon(tt.args.cfg, tt.args.client, "", out, tt.args.printManifest); (err != nil) != tt.wantErr {
11521152
t.Errorf("EnsureDNSAddon() error = %v, wantErr %v", err, tt.wantErr)
11531153
return
11541154
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ func PerformPostUpgradeTasks(client clientset.Interface, cfg *kubeadmapi.InitCon
105105
errs = append(errs, err)
106106
}
107107

108-
if err := PerformAddonsUpgrade(client, cfg, out); err != nil {
108+
if err := PerformAddonsUpgrade(client, cfg, patchesDir, out); err != nil {
109109
errs = append(errs, err)
110110
}
111111

112112
return errorsutil.NewAggregate(errs)
113113
}
114114

115115
// PerformAddonsUpgrade performs the upgrade of the coredns and kube-proxy addons.
116-
func PerformAddonsUpgrade(client clientset.Interface, cfg *kubeadmapi.InitConfiguration, out io.Writer) error {
116+
func PerformAddonsUpgrade(client clientset.Interface, cfg *kubeadmapi.InitConfiguration, patchesDir string, out io.Writer) error {
117117
unupgradedControlPlanes, err := unupgradedControlPlaneInstances(client, cfg.NodeRegistration.Name)
118118
if err != nil {
119119
return errors.Wrapf(err, "failed to determine whether all the control plane instances have been upgraded")
@@ -147,7 +147,7 @@ func PerformAddonsUpgrade(client clientset.Interface, cfg *kubeadmapi.InitConfig
147147
metav1.NamespaceSystem)
148148
} else {
149149
// Upgrade CoreDNS
150-
if err := dns.EnsureDNSAddon(&cfg.ClusterConfiguration, client, out, false); err != nil {
150+
if err := dns.EnsureDNSAddon(&cfg.ClusterConfiguration, client, patchesDir, out, false); err != nil {
151151
errs = append(errs, err)
152152
}
153153
}

cmd/kubeadm/app/util/patches/patches.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,12 @@ func (ps *patchSet) String() string {
7575
)
7676
}
7777

78-
// KubeletConfiguration defines the kubeletconfiguration patch target.
79-
const KubeletConfiguration = "kubeletconfiguration"
78+
const (
79+
// KubeletConfiguration defines the kubeletconfiguration patch target.
80+
KubeletConfiguration = "kubeletconfiguration"
81+
// CoreDNSDeployment defines the corednsdeployment patch target.
82+
CoreDNSDeployment = "corednsdeployment"
83+
)
8084

8185
var (
8286
pathLock = &sync.RWMutex{}
@@ -100,6 +104,7 @@ var (
100104
kubeadmconstants.KubeControllerManager,
101105
kubeadmconstants.KubeScheduler,
102106
KubeletConfiguration,
107+
CoreDNSDeployment,
103108
}
104109
)
105110

0 commit comments

Comments
 (0)