Spinnaker has some quirks when enabled for ldap authentication, especially the login URL. When deploying Spinnaker using the published Helm chart, gate is available on /gate on deck. But the login URL gets routed to /login and after successful login routed to /auth/redirect instead of being relative to the gate base url! The setup works very well when you have a static hostname that can be directed to deck or gate depending on the port being 9000 or 8084. And you set the base URL for deck and gate accordingly. But then you need to get that static hostname setup and your load balancer configured. Or, you have to use localhost with port forwarding but then it is only available to you! This tutorial provides an alternative using Kubernetes ingress controller without the need for a static hostname and a load-balancer.

From Google Cloud console, setup a managed Kubernetes cluster. For this exercise, set up the cluster with least 3 nodes of type n1-standard-2. And we would name the cluster my-spinnaker.

It is recommended to use the Google Cloud Shell to run the commands used in this tutorial. Otherwise you will need to install the tools being used in your environment first.

Launching Google Cloud Shell

This will give you a shell at the bottom of the browser window. Authenticate your shell against the Kubernetes cluster you just created.

gcloud container clusters get-credentials my-spinnaker --region us-central1-a

Initialize Helm

Helm is used to deploy resources into Kubernetes cluster. You need to initialize Helm in your cluster before you can use it to deploy Helm charts.

kubectl create serviceaccount -n kube-system tiller

kubectl create clusterrolebinding tiller-binding --clusterrole=cluster-admin --serviceaccount kube-system:tiller

helm init --service-account tiller --wait

Deploy Spinnaker

We will install Spinnaker using the published stable Helm chart. But before that we would like to configure the deployment. Let’s get the values file first to customize the deployment.

wget https://raw.githubusercontent.com/helm/charts/master/stable/spinnaker/values.yaml

Edit the file to uncomment the section gate-local.yml as shown below under additionalProfileConfigMaps. Make sure to also remove the { } after the tag data:.

## if you're running spinnaker behind a reverse proxy such as a GCE ingress
## you may need the following profile settings for the gate profile.
## see https://github.com/spinnaker/spinnaker/issues/1630
## otherwise its harmless and will likely become default behavior in the future
## According to the linked github issue.
protocolHeader: X-Forwarded-Proto
remoteIpHeader: X-Forwarded-For
internalProxies: .*
httpsServerPort: X-Forwarded-Port

Now deploy your Spinnaker.

helm install -n spinnaker stable/spinnaker -f values.yaml

Give it some time. Once all the pods are running, your Spinnaker is deployed and ready to use.

$ kubectl get pods
spin-clouddriver-749d9c9589-wg49j 1/1 Running 0 11m
spin-deck-775cdfccff-shzcb 1/1 Running 0 11m
spin-echo-5fd76b8f79-fkdm9 1/1 Running 0 11m
spin-front50-597b4ff46d-72kxr 1/1 Running 0 11m
spin-gate-7dc88df658-xl8nm 1/1 Running 0 11m
spin-igor-67b9b4c66-zs28q 1/1 Running 0 11m
spin-orca-7d5958f8d6-c6w7x 1/1 Running 0 11m
spin-rosco-67847b657b-gx5vc 1/1 Running 0 11m
spinnaker-install-using-hal-mdt4q 0/1 Completed 0 14m
spinnaker-minio-5c994565d6-fjdkm 1/1 Running 0 14m
spinnaker-redis-master-0 1/1 Running 0 14m
spinnaker-spinnaker-halyard-0 1/1 Running 0 14m

Before using it, the health check on the gate pod needs to be fixed as this is needed for the Ingress (which we will create later on) to successfully do a health check on the pod. First let’s connect to the halyard pod.

kubectl exec -it spinnaker-spinnaker-halyard-0 bash

Add additional configuration for gate by adding the file ~/.hal/default/service-settings/gate.yml

cat <<EOF > ~/.hal/default/service-settings/gate.yml 
healthEndpoint: /health
useExecHealthCheck: false

Now, apply the configuration to Spinnaker.

hal deploy apply

Once it completes, you can exit out of the halyard pod.

Your Spinnaker is deployed but how do you access it? You could always create port-forwards as mentioned in the output of the helm command you used to deploy Spinnaker. But that works when you are using your local laptop. The best option to make it always available and to others is to create Kubernetes services to Spinnaker gate and deck components and then an ingress in Kubernetes to expose Spinnaker.

Create a file spinsvcs.yml that will be used to create Spinnaker services.

apiVersion: v1
kind: Service
app: spin
stack: gate
name: spin-gate-np
type: NodePort
name: http
port: 8084
protocol: TCP
cluster: "spin-gate"
apiVersion: v1
kind: Service
app: spin
stack: deck
name: spin-deck-np
type: NodePort
name: http
port: 9000
protocol: TCP
cluster: "spin-deck"

Create a file ingress.yml that will be used to create an ingress to Spinnaker.

apiVersion: extensions/v1beta1
kind: Ingress
app: spinnaker
name: spinnaker-ingress
serviceName: spin-deck-np
servicePort: 9000
- http:
- path: /login
serviceName: spin-gate-np
servicePort: 8084
- path: /auth/*
serviceName: spin-gate-np
servicePort: 8084

Run the commands to create the services and ingress.

kubectl apply -f spinsvcs.yml

kubectl apply -f ingress.yml

You are ready to try launch Spinnaker when the backend services are green for the ingress (give it a few minutes).

Note the Load Balancer IP on the page. You can now use Spinnaker by clicking on that. Now, let’s go and secure this setup with LDAP based authentication.

Deploy OpenLDAP

We will use OpenLDAP as the LDAP provider in this tutorial. Use helm to install OpenLDAP.

helm install --name openldap stable/openldap

You can always configure the base dn and other attributes of the OpenLDAP. Out of the box, it sets up with a base dn of dc=example,dc=org. You can get the password of the admin user using

kubectl get secret --namespace default openldap -o jsonpath="{.data.LDAP_ADMIN_PASSWORD}" | base64 --decode; echo

Configure Spinnaker to use OpenLDAP

First you need to connect to the halyard pod in Spinnaker.

kubectl exec -it spinnaker-spinnaker-halyard-0 bash

Next configure and enable authentication in Spinnaker.

hal config security authn ldap edit --user-dn-pattern="cn={0}" --url=ldap://openldap.default:389/dc=example,dc=org

hal config security authn ldap enable

The deck base URL also needs to be updated to the ingress host (replace the with the ip address of load-balancer of the ingress).

hal config security ui edit --override-base-url

Now, apply the configuration to Spinnaker.

hal deploy apply

Once the deployment is successful, you can reload the Spinnaker UI you had launched earlier. You should be redirected to a login page. Login with admin and the password for the admin user in LDAP.