Start Jenkins on DigitalOcean’s Kubernetes Service

DigitalOcean recently released to a set of users their new Kubernetes service which is really great. So, I decided to do yet another Jenkins over Kubernetes tutorial for you. It’s close to what I showed you previously but customized for DigitalOcean. You can grab an instance for as little as $5 per month. It’s the perfect testing ground - cheap and stable. If you don’t already have an account go grab one with this promotion code and get $100 of services on their entire platform:

Did you get it? Good. Now let’s install Jenkins and create a ‘Hello, World!’ pipeline. First we’ll need to initialize our helm. Helm is a tool used for Kubernetes package management. First you’ll need to download your kubeconfig from the DigitalOcean website. There is a button for that available as soon as you build a cluster. Once done you should be able to use this file to get information on the cluster nodes. I’ll have just one node so here’s my output:

[kstaykov@manja ~]$ kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml get nodes
NAME                  STATUS    ROLES     AGE       VERSION
determined-kare-t8i   Ready     <none>    34m       v1.11.1
[kstaykov@manja ~]$ 

My config file is called “k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml” and it’s located in my Downloads folder. I’m using the Manjaro Linux distribution but you should have a close experience to this one whatever the OS you use.

Before we can start with Helm we’ll need to tune the cluster a little bit. Use those commands with your kubeconfig:

kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml create serviceaccount --namespace kube-system tiller
kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

This will configure account permissions and now we can initialize our Helm.

helm init --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml

Simple, ah? You just put the same –kubeconfig option like on the kubectl command. Now let’s install the Jenkins:

[kstaykov@manja Downloads]$ helm --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml install stable/jenkins
NAME:   wrinkled-seagull
LAST DEPLOYED: Sun Oct 21 17:36:22 2018
NAMESPACE: default

==> v1/Secret
NAME                      TYPE    DATA  AGE
wrinkled-seagull-jenkins  Opaque  2     0s

==> v1/ConfigMap
NAME                            DATA  AGE
wrinkled-seagull-jenkins        5     0s
wrinkled-seagull-jenkins-tests  1     0s

==> v1/PersistentVolumeClaim
wrinkled-seagull-jenkins  Pending  do-block-storage  0s

==> v1/Service
NAME                            TYPE          CLUSTER-IP      EXTERNAL-IP  PORT(S)         AGE
wrinkled-seagull-jenkins-agent  ClusterIP  <none>       50000/TCP       0s
wrinkled-seagull-jenkins        LoadBalancer   <pending>    8080:32690/TCP  0s

==> v1/Deployment
wrinkled-seagull-jenkins  1        1        1           0          0s

==> v1/Pod(related)
NAME                                       READY  STATUS   RESTARTS  AGE
wrinkled-seagull-jenkins-68f6587f87-gb5p2  0/1    Pending  0         0s

1. Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace default wrinkled-seagull-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc --namespace default -w wrinkled-seagull-jenkins'
  export SERVICE_IP=$(kubectl get svc --namespace default wrinkled-seagull-jenkins --template  "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
  echo http://$SERVICE_IP:8080/login

3. Login with the password from step 1 and the username: admin

For more information on running Jenkins on Kubernetes, visit:

[kstaykov@manja Downloads]$

Perfect! Our Jenkins is on its way to be deployed. Within minutes we should be able to see it. The ‘get all’ command will list things nicely for us:

[kstaykov@manja ~]$ kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml get all
NAME                                            READY     STATUS    RESTARTS   AGE
pod/wrinkled-seagull-jenkins-68f6587f87-gb5p2   1/1       Running   0          22m

NAME                                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)          AGE
service/kubernetes                       ClusterIP       <none>            443/TCP          39m
service/wrinkled-seagull-jenkins         LoadBalancer   8080:32690/TCP   22m
service/wrinkled-seagull-jenkins-agent   ClusterIP   <none>            50000/TCP        22m

NAME                                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wrinkled-seagull-jenkins   1         1         1            1           22m

NAME                                                  DESIRED   CURRENT   READY     AGE
replicaset.apps/wrinkled-seagull-jenkins-68f6587f87   1         1         1         22m
[kstaykov@manja ~]$

Notice that we have a running pod. This means that Jenkins is already available to us. Also notice the loadbalancer on external IP and port 8080. That’s where we’ll find the login page. Your IP of course will be different and before you try anything on mine be aware that this cluster will be long gone by the time you read this.

Now we only need the password for admin user and we’ll be on our way to create our simple pipeline. Review your output from the installation and you’ll see there is a command left for you. Mine is this one:

[kstaykov@manja ~]$ kubectl --kubeconfig ~/Downloads/k8s-1-11-1-do-1-fra1-1540131360772-kubeconfig.yaml get secret --namespace default wrinkled-seagull-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode
[kstaykov@manja ~]$

On no, you saw my password! Hehe as I said - long gone by then. Let’s login and we’ll see Jenkins page.


And here’s the execution of our very simple pipeline:


For more information on how this pipeline was built see the privious tutorial here:

Run Jenkins Master on Kubernetes Cluster