Kubernetes上にJenkinsをインストールする方法を説明します。前回「VirtualBoxでKubernetes環境構築」の応用編になります。
今回の目的はKubernetes上にJenkinsをインストールし、以下の仕様を達成することです:
- JenkinsのジョブでDockerが使えること
- Jenkinsのデータを簡単にバックアップできること (VirtualBoxの仮想HDDを利用)
まず最初に、Jenkinsのデータを保存するVolumeのための仮想HDDを作成します。VirtualBoxで以下の仮想HDDを3個作成します:
- Jenkins Home用 : 32 GiB
- Jenkins Workspace用 : 128 GiB
- Jenkins Docker認証書用 : 1 GiB
そしてこの仮想HDDをJenkinsを運用するKubernetesのWorker Nodeにマウントし、フォーマットしておきます。(/etc/fstabで再起動しても自動でマウントするようにしておくのも忘れずに)
- /mnt/volumes/jenkins-home
- /mnt/volumes/jenkins-workspace
- /mnt/volumes/jenkins-docker-certs
では本格的にKubernetesの設定を行います。まずはPersistentVolumeを作ります。PersistentVolumeをマウントするWorker Nodeの名前は「k8s-node-0」という前提です。
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-home-pv
labels:
volume-name: jenkins-home
spec:
capacity:
storage: 32Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/volumes/jenkins-home
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node-0
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-workspace-pv
labels:
volume-name: jenkins-workspace
spec:
capacity:
storage: 128Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/volumes/jenkins-workspace
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node-0
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-docker-certs-pv
labels:
volume-name: jenkins-docker-certs
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/volumes/jenkins-docker-certs
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node-0
上記をjenkins-volume.yamlに保存し、Kubernetesに反映します。
kubectl apply -f jenkins-volume.yaml
これでJenkinsのデータを保存するためのPersistentVolumeが作られました。次にJenkins本体とDocker実行のためのコンテナが入ったPodを作ります。Jenkinsは再起動後も各種設定やデータを保持している必要があるのでStatefulSetで作ります。
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
type: NodePort
ports:
- nodePort: 30000
port: 8080
targetPort: 8080
protocol: TCP
name: http
selector:
app: jenkins
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: jenkins
namespace: jenkins
spec:
serviceName: "jenkins"
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
securityContext:
fsGroup: 1000
containers:
- name: jenkins-blueocean
image: jenkinsci/blueocean
ports:
- containerPort: 8080
name: http
- containerPort: 50000
name: inbound
env:
- name: DOCKER_HOST
value: "tcp://localhost:2376"
- name: DOCKER_CERT_PATH
value: "/certs/client"
- name: DOCKER_TLS_VERIFY
value: "1"
- name: JENKINS_OPTS
value: "--prefix=/jenkins"
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
- name: jenkins-workspace
mountPath: /var/jenkins_home/workspace
- name: jenkins-docker-certs
mountPath: /certs/client
readOnly: true
livenessProbe:
httpGet:
path: /jenkins/login
port: 8080
initialDelaySeconds: 300
periodSeconds: 60
timeoutSeconds: 30
- name: jenkins-docker
image: docker:dind
securityContext:
privileged: true
ports:
- containerPort: 2376
name: docker-daemon
env:
- name: DOCKER_TLS_CERTDIR
value: "/certs"
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
- name: jenkins-workspace
mountPath: /var/jenkins_home/workspace
- name: jenkins-docker-certs
mountPath: /certs/client
volumeClaimTemplates:
- metadata:
name: jenkins-home
spec:
selector:
matchLabels:
volume-name: jenkins-home
accessModes: [ "ReadWriteOnce" ]
storageClassName: "local-storage"
resources:
requests:
storage: 32Gi
- metadata:
name: jenkins-workspace
spec:
selector:
matchLabels:
volume-name: jenkins-workspace
accessModes: [ "ReadWriteOnce" ]
storageClassName: "local-storage"
resources:
requests:
storage: 128Gi
- metadata:
name: jenkins-docker-certs
spec:
selector:
matchLabels:
volume-name: jenkins-docker-certs
accessModes: [ "ReadWriteOnce" ]
storageClassName: "local-storage"
resources:
requests:
storage: 1Gi
上記をjenkins.yamlで保存し、Kubernetesに反映します。
kubectl apply -f jenkins.yaml
特に問題が起きてない場合、しばらくするとJenkinsのPodが起動します。Jenkinsのコンテナから、Jenkinsの初期セットアップに必要なパスワードを取得します。
kubectl logs jenkins-0 jenkins-blueocean
JenkinsのURLにアクセスし、初期セットアップを行います。
- http://[Worker Nodeの外部IP]:30000/jenkins
これでKubernetes上にJenkinsをセットアップできました。Reverse Proxyを立ててKubernetesのノードIPを隠蔽するとより使いやすくなるでしょう。
JenkinsのデータはVirtualBoxの仮想HDDになっているので、シンプルにHDDファイルをコピーすることでバックアップが取れます。
今回の手順はJenkinsをDockerにインストールする手順を参考にKubernetesで動くよう修正を加えたものです。
[おまけ]
今回使ったjenkins.yamlの簡単な解説です:
- JenkinsのServiceを生成
- NodePortタイプ。ノードIP:30000をJenkinsPodの8080ポートに転送
- JenkinsのPodを生成
- JenkinsがPersistentVolumeにデータを書き込めるようにfsGroupを1000に設定
- Jenkins本体のコンテナ生成
- アクセスURLに/jenkins/を付ける
- 各種PersistentVolumeをマウントする
- Docker In Dockerのホスト情報を環境変数として設定
- LivenessProbeでもしJenkinsが落ちたら自動で再起動するように。初回起動の5分後から1分間隔でチェック。
- LocalPersistentVolumeを使うようにVolumeClaim設定
- Docker In Dockerコンテナ生成
- 各種PersistentVolumeをマウントする
- LocalPersistentVolumeを使うようにVolumeClaim設定