How To Use Kubernetes

How To Use Kubernetes

Reading time1 min
#Cloud#DevOps#Infrastructure#Kubernetes#MultiCluster#Federation

Mastering Kubernetes: Pragmatic Multi-Cluster Deployments for Real Scalability

A single Kubernetes cluster is rarely sufficient for production-scale infrastructure. When you need to mitigate cross-regional outages, enforce data locality, or distribute traffic globally, multi-cluster architecture isn’t optional—it’s essential.

Below: field experience, not theory. Patterns, pitfalls, exact commands, and trade-offs when running Kubernetes across data centers, clouds, and edge locations.


Why Multi-Cluster? Patterns and Pressures

Outage in a single cluster—operator error, network split, or a control plane bug—takes down your services globally. Multi-cluster setups introduce boundaries for failure domains, regulatory compliance, and scale. Here’s where it pays off:

  • High Availability: Cluster1 fails, traffic shifts to Cluster2 or Cluster3. No manual intervention.
  • Blast Radius Reduction: Misconfigured RBAC or rogue DaemonSet only affects a single environment.
  • Data Residency: Regulatory regimes (e.g. GDPR, HIPAA) often require per-region data handling.
  • Hybrid/Cloud Vendor Strategy: Run GKE in Frankfurt, EKS in Ohio, on-prem k3s at the edge.

Note: Running multi-cluster increases operational complexity—plan for network, security, and cost impacts upfront.


Essential Components of Multi-Cluster Kubernetes

Technical orchestration boils down to:

RequirementCandidate Solutions
Cluster CoordinationFederation v2, Crossplane, custom tooling
NetworkingService mesh (Istio, Linkerd), VPN, BGP
AuthN/AuthZOIDC/JWT federation, per-cluster RBAC
CI/CDArgoCD, Flux, Spinnaker
Monitoring/LoggingPrometheus Federation, Thanos, Loki

Certain providers (AWS, GCP) hide some details, but avoid vendor lock-in for portability.


1. Cluster Provisioning: Public, Private, or Both

Quick reality check: “Hybrid multi-cluster” isn’t marketing—networks, authentication, and upgrades become your problem. For cloud-managed clusters:

  • EKS: eksctl create cluster --name=prod-us-east-1
  • GKE: gcloud container clusters create prod-eu-west1
  • AKS: az aks create --resource-group prod-rg --name prod-uksouth

For on-prem, kubeadm and k3s (v1.24+) remain reliable:

curl -sfL https://get.k3s.io | sh -
# Or kubeadm, but manage certificates and etcd backup yourself.

Networking: Secure overlay (WireGuard, IPSec, VPC peering) between clusters is required for cross-cluster service routing. Misconfigured firewalls lead to classic “connection refused” headaches later.


2. Cluster Federation: Kubernetes Federation v2 (KubeFed)

KubeFed remains the reference for multi-cluster resource distribution, though not always the best fit for stateful workloads or advanced custom resources.

Install kubefedctl v0.8.1

curl -LO https://github.com/kubernetes-sigs/kubefed/releases/download/v0.8.1/kubefedctl-$(uname | tr '[:upper:]' '[:lower:]')-amd64.tar.gz
tar -xzf kubefedctl-*-amd64.tar.gz
sudo mv kubefedctl /usr/local/bin/

Known issue: version drift between clusters can result in federation sync stalls. Stick to identical minor versions (e.g. v1.26.x everywhere).

Deploy Federation Controller to Host

kubectl --context=cluster1 create namespace kube-federation-system
kubefedctl join cluster2 \
  --cluster-context=cluster2 \
  --host-cluster-context=cluster1 \
  --add-to-registry \
  --v=3 \
  --namespace=kube-federation-system

Repeat for each peer.

Federated Deployment Example

federated-nginx.yaml:

apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
  name: nginx
  namespace: default
spec:
  template:
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.25.4
  placement:
    clusters:
    - name: cluster1
    - name: cluster2

Apply from the host:

kubectl --context=cluster1 apply -f federated-nginx.yaml

Note: KubeFed is not ideal for CRDs with non-trivial conversion logic or for long tail of operators.


3. Cross-Cluster Networking and Service Discovery

Synchronization is not communication. For actual cross-cluster requests:

  • Istio Multi-Cluster (v1.19+): mTLS, transparent service discovery, traffic shifting.
  • CoreDNS Federation: legacy and fiddly.
  • Manual Cluster IP Bridging: not recommended at scale.

Example: Istio Replicated Control Plane

  • Install Istio on both clusters with identical mesh IDs
  • Expose Istiod via LoadBalancer or mesh gateway
  • Setup east-west gateways for cross-cluster pod routing

All clusters must share root CA for transparent mTLS.

Expected gotcha: by default, service names (svc-a.ns.svc.cluster.local) only resolve locally. Cross-cluster communication requires explicit ServiceEntry and exported endpoints.


4. Deployments: GitOps & Multi-Cluster CI/CD

Centralized deployment management is mandatory. GitOps platforms—ArgoCD v2.6+, Flux v2.x—treat each cluster as a separate target.

Add Cluster to ArgoCD:

argocd cluster add cluster2

Application Manifests:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: payment-api-eu
spec:
  destination:
    server: https://gke-prod-eu-west1.example.com
    namespace: payments
  source:
    repoURL: https://github.com/org/example-apps
    path: k8s/payment-api
    targetRevision: main
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Tip: Parameterize application overlays with Kustomize or Helm; don’t fork per-region YAML unless you enjoy config drift.


5. Observability and Incident Response

Metrics and logs need global aggregation.

  • Metrics: Prometheus with federation to a central Thanos instance (beware: store minimum two months of metrics for meaningful production forensics).
  • Logging: Loki or Elasticsearch aggregators for all clusters. Ship logs with promtail or fluentbit.
  • Dashboards: Grafana v10+ supports organization-wide views; configure per-cluster data sources.

Example Prometheus federation stanza:

- job_name: 'federate'
  scrape_interval: 60s
  honor_labels: true
  metrics_path: '/federate'
  params:
    match[]:
      - '{__name__=~".+"}'
  static_configs:
    - targets:
      - 'prometheus.cluster1:9090'
      - 'prometheus.cluster2:9090'

Known issue: metric label collisions between clusters; prefix job/instance labels with cluster name.


Operational Field Notes

  • IaC is non-negotiable: Terraform, Crossplane, or Pulumi for clusters and network glue.
  • Disaster Recovery: Velero works, but cross-cluster restores tend to surface missing primitives—test with realistic outages.
  • RBAC: Avoid shared root credentials across clusters. Use workload identity or OIDC wherever possible.
  • Cost: Inter-region egress is expensive. Expect unpredictable costs if cross-cluster traffic spikes.
  • Failover: Chaos engineering pays dividends—simulate total cluster and network failures, not just pod-level disruptions.

Resources


Building resilient, scalable infrastructure on Kubernetes means engaging with multi-cluster realities: cross-cluster identity, traffic routing, monitoring, and deployment automation. You’ll never get everything perfect, but with automation, rigorous testing, and careful observability, you can recover quickly—and scale confidently.

Sample manifests, Helm charts, and Terraform modules available on request—reach out for practical field recipes.


Note: The Kubernetes ecosystem evolves rapidly. Validate all instructions against upstream documentation before production rollout.