From 7e08b9a7cede820ab4c41f751ac6703d6957e10a Mon Sep 17 00:00:00 2001 From: Dario Tranchitella Date: Sun, 6 Oct 2024 09:40:20 +0200 Subject: [PATCH] feat: cluster domain customisation (#594) * feat(api): customising cluster domain option Signed-off-by: Dario Tranchitella * feat(helm): customising cluster domain option Signed-off-by: Dario Tranchitella * docs: customising cluster domain option Signed-off-by: Dario Tranchitella --------- Signed-off-by: Dario Tranchitella --- api/v1alpha1/tenantcontrolplane_types.go | 5 +++ ...kamaji.clastix.io_tenantcontrolplanes.yaml | 8 +++++ docs/content/reference/api.md | 9 +++++ internal/kubeadm/configuration.go | 2 +- internal/kubeadm/types.go | 33 ++++++++++--------- internal/resources/kubeadm_config.go | 23 ++++++------- 6 files changed, 52 insertions(+), 28 deletions(-) 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)