I have been playing a lot with Kubernetes lately, from creating a cluster from scratch on bare metal, setting up a ELK stack, Prometheus metrics to setting up a CI/CD using Gitlab CI.

I found the last one so easy that I made a video for it.

I have been using a DigitalOcean Kubernetes cluster for this video, it was super easy and I got $100 to play with it for 60 days.

If you have never tried it, I encourage you to try it out. Here is a link you can use to get the $100 credits: DigitalOcean

The video shows how I create a cluster, setup a service account on it for Gitlab ci, then setup a gitlab runner on the cluster.

The easiest way to do it is to use the button in Gitlab UI to create a runner on your cluster, or to use Helm from the console, but in my case I wanted to customize a bit more the runner to be able to use Docker DinD to build Docker images from Gitlab ci.


Using Helm from the console

You can take a look at the doc here: https://docs.gitlab.com/runner/install/kubernetes.html#installing-gitlab-runner-using-the-helm-chart

Here are the values I have been using when I tried with Helm

You can then install the runner using this command:

# Add the repo
helm repo add gitlab https://charts.gitlab.io

# Install
helm install --namespace gitlab-managed-apps gitlab-runner gitlab/gitlab-runner -f values.yaml

The issue with this is that for now, gitlab chart does not use the volumes when creating it's config file (`config.toml`). So one way to fix it if you still want to use Helm is to change the ConfigMap manually in Kubernetes. You'll find a lot of issues here that are talking about it.

To fix that you can run kubectl edit -n gitlab-managed-apps ConfigMap gitlab-runner-name then add this before # Start the runner:

    cat >> /home/gitlab-runner/.gitlab-runner/config.toml <<-EOF
          [[runners.kubernetes.volumes.host_path]]
            name = "docker"
            mount_path = "/var/run/docker.sock"
            read_only = true
            host_path = "/var/run/docker.sock"
          [[runners.kubernetes.volumes.host_path]]
            name = "certs"
            mount_path = "/certs/client"
            read_only = true
            host_path = "/certs/client"
          [[runners.kubernetes.volumes.host_path]]
            name = "cache"
            mount_path = "/cache"
            read_only = true
            host_path = "/cache"
    EOF

Using Kubectl

The way I did it was to extract the templates from the chart and modify them to add my changes in the ConfigMap

To extract the yaml files you can use helm template gitlab/gitlab-runner --output-dir '.' -f values.yaml

You will get a bunch of files depending on your values.

Then edit the configmap.yaml to add the previous block and get something like this:

Once it's done you can run kubectl apply -f <file> for your files

kubectl apply -f service-account.yaml
kubectl apply -f secrets.yaml
kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml