Kubernetes via DNS

An example project that can be deployed to kubernetes via minikube is in integration-test/kubernetes-dns.

The project shows how to:

  • Use Akka Bootstrap with akka-dns with cluster formation via DNS SRV records
  • Use a headless service for internal and Akka management/bootstrap so that readiness probes for prod traffic don’t interfere with bootstrap
    • Note that this requires the use of the publishNotReadyAddresses, which replaces the service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" annotation , so bootstrap can see the pods before they are ready. Check your Kubernetes environment supports this feature
  • If required use a separate service and/or ingress for user-facing endpoints, for example HTTP or gRPC

Internal headless service for bootstrap

For Akka Cluster / Management use a headless service. This allows the solution to not be coupled to k8s as well as there is no use case for load balancing across management/remoting ports. Set endpoints to be published before readiness checks pass as these endpoints are required to bootstrap the Cluster and make the application ready.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: akka-bootstrap-demo
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: "integration-test-kubernetes-dns-internal"
spec:
  ports:
  - name: management
    port: 8558
    protocol: TCP
    targetPort: 8558
  - name: remoting
    port: 2552
    protocol: TCP
    targetPort: 2552
  selector:
    app: akka-bootstrap-demo
  clusterIP: None
  publishNotReadyAddresses: true

Note there are currently two ways to specify that addresses should be published if not ready, the initial way via an annotation service.alpha.kubernetes.io/tolerate-unready-endpoints and via the new officially supported way as the property publishNotReadyAddresses. Set both as depending on your DNS solution it may have not migrated from the annotation to the property.

This will result in SRV records being published for the service that contain the nodes that are not ready. This allows bootstrap to find them and form the cluster thus making them ready.

Then to configure your application:

akka.management {
  cluster.bootstrap {
    contact-point-discovery {
      discovery-method = akka-dns
    }
  }

  http {
    port = 8558
    bind-hostname = "0.0.0.0"
  }
}

The same configuration will work for any environment that has an SRV record for your Akka Clustered application.

For more details on how to configure the Kubernetes deployment see recipes.

Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.