I was in a need for a quick CI/CD application, I decided to try and take Jenkins (master) for a ride.
Below I will show you, how you can quickly install Jenkins by using the Jenkins Helm Chart.
Note: I am also using MetalLB (which I am a big fan of) to exposed a public IP address, more on how to configure MetalLB can be seen here and the MetallB home page is here.
The below example configuration uses the following versions:
- CoreOS: 2163.2.1
- Kubernetes client(kubectl):v1.13.1
- Kubernetes:v1.13.2
- Helm:v2.12.3
- Jenkins Helm chart:1.1.23
- Metal LB(optional):0.8.4
First lets get a starting/default Jenkins configuration.
1 |
helm inspect values stable/jenkins > jenkins.out |
You can inspect all the default settings and if required overwrite them in your own values.yaml file. (as I will be doing below).
Note: For a list of available settings you can look here
Next, lets prepare persistence storage that Jenkins will use and is now required at install time.
cat jenkins-storage-class.yaml
1 2 3 4 5 6 |
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer |
Now, lets create the volume
cat jenkins-vol.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
kind: PersistentVolume apiVersion: v1 metadata: name: jenkins namespace: jenkins labels: type: local spec: storageClassName: local-storage capacity: storage: 10Gi accessModes: - ReadWriteOnce - ReadOnlyMany persistentVolumeReclaimPolicy: Retain hostPath: path: /opt/jenkins |
Lastly, lets create / prepare the Volume Claim.
cat jenkins-pvc.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: jenkins namespace: jenkins spec: storageClassName: local-storage accessModes: - ReadWriteOnce resources: requests: storage: 3Gi |
Now, we are ready to install helm.
1 2 3 4 5 |
helm install stable/jenkins --tls \ --name jenkins \ --namespace jenkins \ --values helm/jenkins-values.yml \ --set persistence.existingClaim=jenkins |
Overwrite configuration properties
cat helm/jenkins-values.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
master: initContainerEnv: - name: http_proxy value: "http://10.10.10.17:1234" - name: https_proxy value: "http://10.10.10.17:1234" - name: no_proxy value: "" containerEnv: - name: http_proxy value: "http://10.10.10.17:1234" - name: https_proxy value: "http://10.10.10.17:1234" javaOpts: >- -Dhttp.proxyHost=10.10.10.17 -Dhttp.proxyPort=1234 -Dhttps.proxyHost=10.10.10.17 -Dhttps.proxyPort=1234 imageTag: "lts" installPlugins: - kubernetes:1.14.0 - workflow-job:2.31 - workflow-aggregator:2.6 - credentials-binding:1.17 - credentials:2.1.16 - git:3.9.1 - github:1.29.0 - git-client:2.7.1 - pipeline-utility-steps:2.0.2 - script-security:1.43 - slack:2.3 - thinBackup:1.9 |
Verify deployment.
1 2 3 4 |
helm list --tls NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE jenkins 1 Mon Jun 17 21:12:28 2019 DEPLOYED jenkins-1.1.23 lts jenkins metallb 1 Mon Feb 11 19:52:17 2019 DEPLOYED metallb-0.8.4 0.7.3 metallb-system |
If all worked correctly, you should see something like the below output.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
kubectl get pv,pvc,pods,svc -n jenkins -o wide NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/jenkins 10Gi RWO,ROX Retain Bound jenkins/jenkins local-storage 20h NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/jenkins Bound jenkins 10Gi RWO,ROX local-storage 20h NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/jenkins-5d448c689f-btvpq 1/1 Running 0 3h17m 10.20.4.5 dc2-coreos2 <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/jenkins LoadBalancer 10.30.5.120 10.50.108.160 8080:31248/TCP 18h app.kubernetes.io/component=jenkins-master,app.kubernetes.io/instance=jenkins service/jenkins-agent ClusterIP 10.30.1.197 <none> 50000/TCP 18h app.kubernetes.io/component=jenkins-master,app.kubernetes.io/instance=jenkins |
To get the Jenkins admin password, run the below.
1 2 3 4 5 6 7 |
printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo FOEf8vHW33 <pre> You can now login to Jenkins by going to (or whatever your load balancer IP address is). <pre> http://10.50.108.160:8080 |
Checking for issues – Troubleshooting
One of the issues I had was being behind a corporate proxy/firewall.
Jenkins by default will try to install a list of plugins at install time, which if it fails/timeout will cause the install to not complete and fail.
To get around this issue, you have two options.
- Add an empty install plugins list. you do so by adding a line installPlugins: to your helm/jenkins-values.yml with no entry
- Add your proxy to the helm/jenkins-values.yml (like the configuration above)
To see cause of the issue, you can use docker (or kubectl logs …).
For example in my case, the below error was shown.
1 2 3 4 5 6 7 8 9 10 |
NAMESPACE NAME READY STATUS RESTARTS AGE jenkins pod/jenkins-b9484f7bd-vq4qh 0/1 Init:0/1 0 55s # OR. NAMESPACE NAME READY STATUS RESTARTS AGE jenkins jenkins-74b9746545-ngcr4 0/1 Init:CrashLoopBackOff 3 89s # OR. NAMESPACE NAME READY STATUS RESTARTS AGE jenkins jenkins-74b9784f75-nq4qv 0/1 Init:Error 3 23s |
And the corresponding pod showed the below issue (timeout).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
docker logs afeca364f2b3 Creating initial locks... Analyzing war... Registering preinstalled plugins... Downloading plugins... Downloading plugin: kubernetes from https://updates.jenkins.io/download/plugins/kubernetes/1.14.0/kubernetes.hpi Downloading plugin: workflow-job from https://updates.jenkins.io/download/plugins/workflow-job/2.31/workflow-job.hpi Downloading plugin: workflow-aggregator from https://updates.jenkins.io/download/plugins/workflow-aggregator/2.6/workflow-aggregator.hpi Downloading plugin: credentials-binding from https://updates.jenkins.io/download/plugins/credentials-binding/1.17/credentials-binding.hpi Downloading plugin: git from https://updates.jenkins.io/download/plugins/git/3.9.1/git.hpi cp: overwrite '/var/jenkins_home/config.xml'? cp: overwrite '/var/jenkins_home/jenkins.CLI.xml'? cp: overwrite '/var/jenkins_home/jenkins.model.JenkinsLocationConfiguration.xml'? cccccuuuuurrrrrlllll::::: (((((2222288888))))) R eRRReRsseeeoosssllooovvllilivvnvniigignn n tggg ti titmtimieimemdmed e edoodd uu o ttouou u ttata ff ttaeaaefrffrtte et rer22 r0 022 5520005533315311 30 mm1 miii mllllmilliiliislllsiseiecsesccoeenccdooonosnnddn dssds s 19:28:07 Failure (28) Retrying in 1 seconds... 19:28:07 Failure (28) Retrying in 1 seconds... 19:28:07 Failure (28) Retrying in 1 seconds... 19:28:07 Failure (28) Retrying in 1 seconds... 19:28:07 Failure (28) Retrying in 1 seconds... curl: (28) Resolving timed out after 20532 milliseconds curl: (28) Resolving timed out aftceru r2l0:5 3(22 8m)i lRleissoelcvoinndgs timed out after 20532 milliseconds |
The full list of Jenkins Helm Chart Available Properties is available here
Like what you’re reading? please provide feedback, any feedback is appreciated.
You might also like – realted to Docker Kubernetes / micro-services.
Hello)
I have the same problem. Did you manage to fix this problem?
Hi and welcome to my blog.
I am out of the office for the next 5 days.
The post just shows an example of an issue/error. Your cause of the issue might be many things. To try and figure out the cause you will have to look on the log output plus inspect the pod.
I hope to return and will be able to better help once I return.
Thanks,
Eli