This guide walks you through setting up a Google Kubernetes Engine (GKE) cluster with Traefik as an Ingress controller, enabling HTTPS for multiple subdomains using Let’s Encrypt wildcard certificates via cert-manager.
🚀 Step 1: Create a GKE Cluster
🔄 Note: Replace premsvmm-k8s with your preferred Kubernetes cluster name.
gcloud container clusters create premsvmm-k8s \ --zone asia-south1-a \ --machine-type e2-medium \ --num-nodes 2 \ --enable-ip-alias
🧱 Step 2: Create a Namespace for Traefik
kubectl create namespace traefik
🌐 Step 3: Install Traefik Ingress Controller
helm install traefik traefik/traefik \ --namespace traefik \ --create-namespace \ --set service.type=LoadBalancer \ --set ports.web.port=8000 \ --set ports.websecure.port=8443 \ --set "entryPoints.web.address=:8000" \ --set "entryPoints.web.http.redirections.entryPoint.to=websecure" \ --set "entryPoints.web.http.redirections.entryPoint.scheme=https" \ --set "entryPoints.web.http.redirections.entryPoint.permanent=true" \ --set "entryPoints.websecure.address=:8443" \ --set "securityContext.capabilities.drop[0]=ALL" \ --set securityContext.runAsGroup=65532 \ --set securityContext.runAsUser=65532 \ --set securityContext.runAsNonRoot=true \ --set dashboard.enabled=true \ --set ingressRoute.dashboard.enabled=true \ --set crds.enabled=true
🧭 Step 4: Create Dashboard IngressRoute
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard namespace: traefik spec: entryPoints: - websecure routes: - match: Host(`traefik.k8s.premsvmm.xyz`) kind: Rule services: - name: api@internal kind: TraefikService
🌍 Step 5: Configure DNS A Record
Run the command
kubectl get svc -n traefik
This will create an external IP. Copy the external IP and update your DNS record accordingly.


🔒 Step 6: Install cert-manager for Auto TLS
helm repo add jetstack https://charts.jetstack.io helm repo update kubectl create namespace cert-manager helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set installCRDs=true
🛂 Step 7: Configure DNS-01 Challenge via Cloud DNS
Create GCP Service Account and Bind DNS Admin Role:
gcloud iam service-accounts create cert-manager-dns01-solver \ --display-name "cert-manager dns01 solver" gcloud projects add-iam-policy-binding prem-1516640837807 \ --member "serviceAccount:cert-manager-dns01-solver@prem-1516640837807.iam.gserviceaccount.com" \ --role "roles/dns.admin" gcloud iam service-accounts keys create key.json \ --iam-account cert-manager-dns01-solver@prem-1516640837807.iam.gserviceaccount.com
Create Kubernetes Secret for the Key:
kubectl create secret generic clouddns-dns01-solver-sa \ --from-file=key.json=key.json \ -n cert-manager
🔐 Step 8: Create ClusterIssuer for Let’s Encrypt
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-dns spec: acme: email: prem.svmm@gmail.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-dns-account-key solvers: - dns01: cloudDNS: project: prem-1516640837807 serviceAccountSecretRef: name: clouddns-dns01-solver-sa key: key.json
Apply it with:
kubectl apply -f cluster-issuer.yaml
📄 Step 9: Request a Wildcard TLS Certificate
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ssl-cret namespace: traefik spec: secretName: ssl-cret issuerRef: name: letsencrypt-dns kind: ClusterIssuer commonName: "*.k8s.premsvmm.xyz" dnsNames: - "*.k8s.premsvmm.xyz" - "k8s.premsvmm.xyz"
🔄 Step 10: Update Traefik Dashboard for HTTPS
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard namespace: traefik spec: entryPoints: - websecure routes: - match: Host(`traefik.k8s.premsvmm.xyz`) kind: Rule services: - name: api@internal kind: TraefikService tls: secretName: ssl-cret
You can now access your secure dashboard at:
🔗 https://traefik.k8s.premsvmm.xyz
Step 11: Create App Namespace and Deploy Your Service
kubectl create namespace app
🚀 Step 12: Deploy Sample App with HTTPS IngressRoute
# app1-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: app1-deployment spec: replicas: 1 selector: matchLabels: app: app1 template: metadata: labels: app: app1 spec: containers: - name: whoami image: traefik/whoami ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: app1-service spec: selector: app: app1 ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: app1-ingressroute namespace: app spec: entryPoints: - websecure routes: - match: Host(`app1.k8s.premsvmm.xyz`) && PathPrefix(`/`) kind: Rule services: - name: app1-service port: 80 tls: secretName: ssl-cret
✅ You can now access your app securely at
🔗 https://app1.k8s.premsvmm.xyz


🧹 Optional: Delete the Cluster
gcloud container clusters delete premsvmm-k8s \ --zone asia-south1-a