Skip to content

Commit 487fa67

Browse files
committed
Add ability to disable creation of dns zone for unmanaged installs
Similar to managed installs, add ability to optionally create DNS zones for unmanged installs.
1 parent 2acf550 commit 487fa67

7 files changed

+190
-5
lines changed

api/v1beta1/azuremanagedcontrolplane_types.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,20 @@ import (
2121
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2222
)
2323

24+
// PrivateDNSZoneMode determines if the Private DNS Zone gets created.
25+
// It is created by default on a private cluster and can be skipped based on a configured value.
26+
type PrivateDNSZoneMode string
27+
2428
const (
2529
// ManagedClusterFinalizer allows Reconcile to clean up Azure resources associated with the AzureManagedControlPlane before
2630
// removing it from the apiserver.
2731
ManagedClusterFinalizer = "azuremanagedcontrolplane.infrastructure.cluster.x-k8s.io"
2832

2933
// PrivateDNSZoneModeSystem represents mode System for azuremanagedcontrolplane.
30-
PrivateDNSZoneModeSystem string = "System"
34+
PrivateDNSZoneModeSystem PrivateDNSZoneMode = "System"
3135

3236
// PrivateDNSZoneModeNone represents mode None for azuremanagedcontrolplane.
33-
PrivateDNSZoneModeNone string = "None"
37+
PrivateDNSZoneModeNone PrivateDNSZoneMode = "None"
3438
)
3539

3640
// UpgradeChannel determines the type of upgrade channel for automatically upgrading the cluster.

api/v1beta1/types_class.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,12 @@ type NetworkClassSpec struct {
459459
// +optional
460460
PrivateDNSZoneName string `json:"privateDNSZoneName,omitempty"`
461461

462+
// PrivateDNSZone enables private dns zone creation modes for a private cluster.
463+
// When unspecified, it defaults to PrivateDNSZoneModeSystem which creates a private DNS zone.
464+
// +kubebuilder:validation:Enum=System;None
465+
// +optional
466+
PrivateDNSZone *PrivateDNSZoneMode `json:"privateDNSZone,omitempty"`
467+
462468
// PrivateDNSZoneResourceGroup defines the resource group to be used for Azure Private DNS Zone.
463469
// If not specified, the resource group of the cluster will be used to create the Azure Private DNS Zone.
464470
// +optional

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 7 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

azure/scope/cluster.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ func (s *ClusterScope) VNetSpec() azure.ASOResourceSpecGetter[*asonetworkv1api20
559559

560560
// PrivateDNSSpec returns the private dns zone spec.
561561
func (s *ClusterScope) PrivateDNSSpec() (zoneSpec azure.ResourceSpecGetter, linkSpec, recordSpec []azure.ResourceSpecGetter) {
562-
if s.IsAPIServerPrivate() {
562+
if s.IsAPIServerPrivate() && s.PrivateDNSZoneMode() != infrav1.PrivateDNSZoneModeNone {
563563
resourceGroup := s.ResourceGroup()
564564
if s.AzureCluster.Spec.NetworkSpec.PrivateDNSZoneResourceGroup != "" {
565565
resourceGroup = s.AzureCluster.Spec.NetworkSpec.PrivateDNSZoneResourceGroup
@@ -1251,3 +1251,13 @@ func (s *ClusterScope) getLastAppliedSecurityRules(nsgName string) map[string]in
12511251
}
12521252
return lastAppliedSecurityRules
12531253
}
1254+
1255+
// PrivateDNSZoneMode returns the current Private DNS Zone mode.
1256+
// When unconfigured, the method returns the default.
1257+
// Returned value is used to determine if the Private DNS Zone should be created.
1258+
func (s *ClusterScope) PrivateDNSZoneMode() infrav1.PrivateDNSZoneMode {
1259+
if s.AzureCluster.Spec.NetworkSpec.PrivateDNSZone == nil {
1260+
return infrav1.PrivateDNSZoneModeSystem
1261+
}
1262+
return *s.AzureCluster.Spec.NetworkSpec.PrivateDNSZone
1263+
}

azure/scope/cluster_test.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,58 @@ func TestAPIServerHost(t *testing.T) {
216216
},
217217
want: "apiserver.example.private",
218218
},
219+
{
220+
name: "private apiserver without private dns zone",
221+
azureCluster: infrav1.AzureCluster{
222+
Spec: infrav1.AzureClusterSpec{
223+
AzureClusterClassSpec: infrav1.AzureClusterClassSpec{
224+
SubscriptionID: fakeSubscriptionID,
225+
IdentityRef: &corev1.ObjectReference{
226+
Kind: infrav1.AzureClusterIdentityKind,
227+
},
228+
},
229+
ControlPlaneEnabled: true,
230+
NetworkSpec: infrav1.NetworkSpec{
231+
NetworkClassSpec: infrav1.NetworkClassSpec{
232+
PrivateDNSZoneName: "",
233+
PrivateDNSZone: ptr.To(infrav1.PrivateDNSZoneModeNone),
234+
},
235+
APIServerLB: &infrav1.LoadBalancerSpec{
236+
LoadBalancerClassSpec: infrav1.LoadBalancerClassSpec{
237+
Type: infrav1.Internal,
238+
},
239+
},
240+
},
241+
},
242+
},
243+
want: "apiserver.my-cluster.capz.io",
244+
},
245+
{
246+
name: "private apiserver with private dns zone",
247+
azureCluster: infrav1.AzureCluster{
248+
Spec: infrav1.AzureClusterSpec{
249+
AzureClusterClassSpec: infrav1.AzureClusterClassSpec{
250+
SubscriptionID: fakeSubscriptionID,
251+
IdentityRef: &corev1.ObjectReference{
252+
Kind: infrav1.AzureClusterIdentityKind,
253+
},
254+
},
255+
ControlPlaneEnabled: true,
256+
NetworkSpec: infrav1.NetworkSpec{
257+
NetworkClassSpec: infrav1.NetworkClassSpec{
258+
PrivateDNSZoneName: "",
259+
PrivateDNSZone: ptr.To(infrav1.PrivateDNSZoneModeSystem),
260+
},
261+
APIServerLB: &infrav1.LoadBalancerSpec{
262+
LoadBalancerClassSpec: infrav1.LoadBalancerClassSpec{
263+
Type: infrav1.Internal,
264+
},
265+
},
266+
},
267+
},
268+
},
269+
want: "apiserver.my-cluster.capz.io",
270+
},
219271
}
220272

221273
for _, tc := range tests {
@@ -4137,3 +4189,95 @@ func TestAPIServerLBName(t *testing.T) {
41374189
})
41384190
}
41394191
}
4192+
4193+
func TestPrivateDNSSpec(t *testing.T) {
4194+
tests := []struct {
4195+
name string
4196+
clusterName string
4197+
azureClusterNetworkSpec infrav1.NetworkSpec
4198+
expectPrivateDNSSpec bool
4199+
}{
4200+
{
4201+
name: "Default PrivateDNSZone (PrivateDNSZoneModeSystem)",
4202+
clusterName: "private-default",
4203+
azureClusterNetworkSpec: infrav1.NetworkSpec{
4204+
NetworkClassSpec: infrav1.NetworkClassSpec{
4205+
PrivateDNSZoneName: "fake-privateDNSZoneName",
4206+
},
4207+
APIServerLB: &infrav1.LoadBalancerSpec{
4208+
FrontendIPs: []infrav1.FrontendIP{
4209+
{
4210+
Name: "api-server-lb-internal-ip",
4211+
FrontendIPClass: infrav1.FrontendIPClass{
4212+
PrivateIPAddress: infrav1.DefaultInternalLBIPAddress,
4213+
},
4214+
},
4215+
},
4216+
LoadBalancerClassSpec: infrav1.LoadBalancerClassSpec{
4217+
Type: infrav1.Internal,
4218+
},
4219+
},
4220+
},
4221+
expectPrivateDNSSpec: true,
4222+
},
4223+
{
4224+
name: "PrivateDNSZone set to PrivateDNSZoneModeNone",
4225+
clusterName: "private-none",
4226+
azureClusterNetworkSpec: infrav1.NetworkSpec{
4227+
NetworkClassSpec: infrav1.NetworkClassSpec{
4228+
PrivateDNSZoneName: "fake-privateDNSZoneName",
4229+
PrivateDNSZone: ptr.To(infrav1.PrivateDNSZoneModeNone),
4230+
},
4231+
APIServerLB: &infrav1.LoadBalancerSpec{
4232+
LoadBalancerClassSpec: infrav1.LoadBalancerClassSpec{
4233+
Type: infrav1.Internal,
4234+
},
4235+
},
4236+
},
4237+
expectPrivateDNSSpec: false,
4238+
},
4239+
{
4240+
name: "Public LB",
4241+
clusterName: "public-none",
4242+
azureClusterNetworkSpec: infrav1.NetworkSpec{
4243+
NetworkClassSpec: infrav1.NetworkClassSpec{
4244+
PrivateDNSZoneName: "fake-privateDNSZoneName",
4245+
PrivateDNSZone: ptr.To(infrav1.PrivateDNSZoneModeNone),
4246+
},
4247+
APIServerLB: &infrav1.LoadBalancerSpec{
4248+
LoadBalancerClassSpec: infrav1.LoadBalancerClassSpec{
4249+
Type: infrav1.Public,
4250+
},
4251+
},
4252+
},
4253+
expectPrivateDNSSpec: false,
4254+
},
4255+
}
4256+
for _, tc := range tests {
4257+
t.Run(tc.name, func(t *testing.T) {
4258+
g := NewWithT(t)
4259+
4260+
cluster := &clusterv1.Cluster{
4261+
ObjectMeta: metav1.ObjectMeta{
4262+
Name: tc.clusterName,
4263+
Namespace: "default",
4264+
},
4265+
}
4266+
azureCluster := &infrav1.AzureCluster{
4267+
ObjectMeta: metav1.ObjectMeta{
4268+
Name: tc.clusterName,
4269+
},
4270+
Spec: infrav1.AzureClusterSpec{
4271+
NetworkSpec: tc.azureClusterNetworkSpec,
4272+
},
4273+
}
4274+
4275+
clusterScope := &ClusterScope{
4276+
Cluster: cluster,
4277+
AzureCluster: azureCluster,
4278+
}
4279+
zoneSpec, _, _ := clusterScope.PrivateDNSSpec()
4280+
g.Expect(zoneSpec != nil).Should(Equal(tc.expectPrivateDNSSpec))
4281+
})
4282+
}
4283+
}

config/crd/bases/infrastructure.cluster.x-k8s.io_azureclusters.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,14 @@ spec:
926926
description: LBType defines an Azure load balancer Type.
927927
type: string
928928
type: object
929+
privateDNSZone:
930+
description: |-
931+
PrivateDNSZone enables private dns zone creation modes for a private cluster.
932+
When unspecified, it defaults to PrivateDNSZoneModeSystem which creates a private DNS zone.
933+
enum:
934+
- System
935+
- None
936+
type: string
929937
privateDNSZoneName:
930938
description: PrivateDNSZoneName defines the zone name for the
931939
Azure Private DNS.

config/crd/bases/infrastructure.cluster.x-k8s.io_azureclustertemplates.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,14 @@ spec:
593593
Type.
594594
type: string
595595
type: object
596+
privateDNSZone:
597+
description: |-
598+
PrivateDNSZone enables private dns zone creation modes for a private cluster.
599+
When unspecified, it defaults to PrivateDNSZoneModeSystem which creates a private DNS zone.
600+
enum:
601+
- System
602+
- None
603+
type: string
596604
privateDNSZoneName:
597605
description: PrivateDNSZoneName defines the zone name
598606
for the Azure Private DNS.

0 commit comments

Comments
 (0)