diff --git a/api/v1alpha1/tenantcontrolplane_types.go b/api/v1alpha1/tenantcontrolplane_types.go
index 78affad..8dc23f4 100644
--- a/api/v1alpha1/tenantcontrolplane_types.go
+++ b/api/v1alpha1/tenantcontrolplane_types.go
@@ -14,6 +14,11 @@ type NetworkProfileSpec struct {
// Address where API server of will be exposed.
// In case of LoadBalancer Service, this can be empty in order to use the exposed IP provided by the cloud controller manager.
Address string `json:"address,omitempty"`
+ // The default domain name used for DNS resolution within the cluster.
+ //+kubebuilder:default="cluster.local"
+ //+kubebuilder:validation:XValidation:rule="self == oldSelf",message="changing the cluster domain is not supported"
+ //+kubebuilder:validation:Pattern=.*\..*
+ ClusterDomain string `json:"clusterDomain,omitempty"`
// AllowAddressAsExternalIP will include tenantControlPlane.Spec.NetworkProfile.Address in the section of
// ExternalIPs of the Kubernetes Service (only ClusterIP or NodePort)
AllowAddressAsExternalIP bool `json:"allowAddressAsExternalIP,omitempty"`
diff --git a/charts/kamaji/crds/kamaji.clastix.io_tenantcontrolplanes.yaml b/charts/kamaji/crds/kamaji.clastix.io_tenantcontrolplanes.yaml
index a704207..60578b7 100644
--- a/charts/kamaji/crds/kamaji.clastix.io_tenantcontrolplanes.yaml
+++ b/charts/kamaji/crds/kamaji.clastix.io_tenantcontrolplanes.yaml
@@ -6550,6 +6550,14 @@ spec:
items:
type: string
type: array
+ clusterDomain:
+ default: cluster.local
+ description: The default domain name used for DNS resolution within the cluster.
+ pattern: .*\..*
+ type: string
+ x-kubernetes-validations:
+ - message: changing the cluster domain is not supported
+ rule: self == oldSelf
dnsServiceIPs:
default:
- 10.96.0.10
diff --git a/docs/content/reference/api.md b/docs/content/reference/api.md
index 0d99b2a..d9c43a4 100644
--- a/docs/content/reference/api.md
+++ b/docs/content/reference/api.md
@@ -13924,6 +13924,15 @@ ExternalIPs of the Kubernetes Service (only ClusterIP or NodePort)
Use this field to add additional hostnames when exposing the Tenant Control Plane with third solutions.
false |
+
+ | clusterDomain |
+ string |
+
+ The default domain name used for DNS resolution within the cluster.
+
+ Default: cluster.local
+ |
+ false |
| dnsServiceIPs |
[]string |
diff --git a/internal/kubeadm/configuration.go b/internal/kubeadm/configuration.go
index a5e4253..8714c3b 100644
--- a/internal/kubeadm/configuration.go
+++ b/internal/kubeadm/configuration.go
@@ -50,7 +50,7 @@ func CreateKubeadmInitConfiguration(params Parameters) (*Configuration, error) {
},
}
conf.Networking = kubeadmapi.Networking{
- DNSDomain: "cluster.local",
+ DNSDomain: params.TenantControlPlaneClusterDomain,
PodSubnet: params.TenantControlPlanePodCIDR,
ServiceSubnet: params.TenantControlPlaneServiceCIDR,
}
diff --git a/internal/kubeadm/types.go b/internal/kubeadm/types.go
index a0b2408..7693498 100644
--- a/internal/kubeadm/types.go
+++ b/internal/kubeadm/types.go
@@ -32,22 +32,23 @@ func (c *Configuration) Checksum() string {
}
type Parameters struct {
- TenantControlPlaneName string
- TenantControlPlaneNamespace string
- TenantControlPlaneEndpoint string
- TenantControlPlaneAddress string
- TenantControlPlaneCertSANs []string
- TenantControlPlanePort int32
- TenantControlPlanePodCIDR string
- TenantControlPlaneServiceCIDR string
- TenantDNSServiceIPs []string
- TenantControlPlaneVersion string
- TenantControlPlaneCGroupDriver string
- ETCDs []string
- CertificatesDir string
- KubeconfigDir string
- KubeProxyOptions *AddonOptions
- CoreDNSOptions *AddonOptions
+ TenantControlPlaneName string
+ TenantControlPlaneNamespace string
+ TenantControlPlaneEndpoint string
+ TenantControlPlaneAddress string
+ TenantControlPlaneCertSANs []string
+ TenantControlPlanePort int32
+ TenantControlPlaneClusterDomain string
+ TenantControlPlanePodCIDR string
+ TenantControlPlaneServiceCIDR string
+ TenantDNSServiceIPs []string
+ TenantControlPlaneVersion string
+ TenantControlPlaneCGroupDriver string
+ ETCDs []string
+ CertificatesDir string
+ KubeconfigDir string
+ KubeProxyOptions *AddonOptions
+ CoreDNSOptions *AddonOptions
}
type AddonOptions struct {
diff --git a/internal/resources/kubeadm_config.go b/internal/resources/kubeadm_config.go
index 743b013..ae4cfc0 100644
--- a/internal/resources/kubeadm_config.go
+++ b/internal/resources/kubeadm_config.go
@@ -92,17 +92,18 @@ func (r *KubeadmConfigResource) mutate(ctx context.Context, tenantControlPlane *
r.resource.SetLabels(utilities.KamajiLabels(tenantControlPlane.GetName(), r.GetName()))
params := kubeadm.Parameters{
- TenantControlPlaneAddress: address,
- TenantControlPlanePort: port,
- TenantControlPlaneName: tenantControlPlane.GetName(),
- TenantControlPlaneNamespace: tenantControlPlane.GetNamespace(),
- TenantControlPlaneEndpoint: r.getControlPlaneEndpoint(tenantControlPlane.Spec.ControlPlane.Ingress, address, port),
- TenantControlPlaneCertSANs: tenantControlPlane.Spec.NetworkProfile.CertSANs,
- TenantControlPlanePodCIDR: tenantControlPlane.Spec.NetworkProfile.PodCIDR,
- TenantControlPlaneServiceCIDR: tenantControlPlane.Spec.NetworkProfile.ServiceCIDR,
- TenantControlPlaneVersion: tenantControlPlane.Spec.Kubernetes.Version,
- ETCDs: r.ETCDs,
- CertificatesDir: r.TmpDirectory,
+ TenantControlPlaneAddress: address,
+ TenantControlPlanePort: port,
+ TenantControlPlaneName: tenantControlPlane.GetName(),
+ TenantControlPlaneNamespace: tenantControlPlane.GetNamespace(),
+ TenantControlPlaneEndpoint: r.getControlPlaneEndpoint(tenantControlPlane.Spec.ControlPlane.Ingress, address, port),
+ TenantControlPlaneCertSANs: tenantControlPlane.Spec.NetworkProfile.CertSANs,
+ TenantControlPlaneClusterDomain: tenantControlPlane.Spec.NetworkProfile.ClusterDomain,
+ TenantControlPlanePodCIDR: tenantControlPlane.Spec.NetworkProfile.PodCIDR,
+ TenantControlPlaneServiceCIDR: tenantControlPlane.Spec.NetworkProfile.ServiceCIDR,
+ TenantControlPlaneVersion: tenantControlPlane.Spec.Kubernetes.Version,
+ ETCDs: r.ETCDs,
+ CertificatesDir: r.TmpDirectory,
}
config, err := kubeadm.CreateKubeadmInitConfiguration(params)