This chapter describes the process for changing the NFS mount used for JENKINS_HOME
by the operations center in CloudBees CI for modern cloud platforms.
Prerequisites
Before starting, it is assumed that there are two different NFS-mountable filesystems for JENKINS_HOME
. One of these is the one currently in use by operations center, and the other is a new mount that is being changed to. These instructions refer to these as "old" and "new".
-
Create a provisioner for the new storage. It won’t be needed here as the new storage type has already been created, but it will be needed for any dynamically provisioned storage used later by the system.
kubectl apply -f new-provisioner.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: generation: 1 labels: app: new-provisioner name: new-provisioner spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: new-provisioner strategy: type: Recreate template: metadata: labels: app: new-provisioner spec: containers: - env: - name: PROVISIONER_NAME value: new-provisioner - name: NFS_SERVER value: 10.2.3.4 - name: NFS_PATH value: / image: quay.io/external_storage/new-provisioner:latest imagePullPolicy: Always name: new-provisioner resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /persistentvolumes name: nfs-client-root dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: new-provisioner serviceAccountName: new-provisioner terminationGracePeriodSeconds: 30 volumes: - name: nfs-client-root nfs: path: / server: 172.20.55.134 status: {}
-
Create a new storage class in Kubernetes for the new filesystem. Apply a file like this one with the
kubectl apply -f new-sc.yaml
command.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: new-sc provisioner: new-provisioner reclaimPolicy: Delete volumeBindingMode: Immediate
To get a copy of any current Kubernetes object’s YAML run the kubectl get --export=true -o yaml <type>/<object>
command. -
Create a new persistent volume. Apply a file like this with one with the
kubectl apply -f new-pv.yaml
command after setting the path and server correctly.apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: new-sc finalizers: - kubernetes.io/pv-protection name: pvc-cc62a5b6-e44a-4d70-8bba-a4b56a4a0656 spec: accessModes: - ReadWriteOnce capacity: storage: 20Gi nfs: path: /example-jenkins-home-cjoc-0-pvc-174ae856-b82a-11e8-a61b-12e800f18598 server: 1.2.3.4 persistentVolumeReclaimPolicy: Delete storageClassName: new-sc status: {}
If copying a current persistent volume’s yaml, be certain to remove the claimRef section from the spec. Use a tool like uuidgen to create the unique identifier, the uuid will need to be changed to lowercase for Kubernetes. -
To prevent updates to the file systems while working on this, stop the operations center with the
kubectl scale sts/cjoc --replicas=0
command. -
Synchronize the old and new file systems.
-
Use
kubectl get --export=true -o yaml pvc/<old-pvc>
to get a copy of the old Persistent Volume Claim. Remove the last-applied-configuration annotation and it will look similar to:apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-provisioner: nfskr finalizers: - kubernetes.io/pvc-protection labels: com.cloudbees.cje.tenant: cjoc com.cloudbees.cje.type: cjoc name: jenkins-home-cjoc-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: new-sc volumeName: pvc-cc62a5b6-e44a-4d70-8bba-a4b56a4a0656 status: {}
-
Change the spec:volumeName to the new persistent volume created in step 2.
-
Delete the current persistent volume claim with the
kubectl delete pvc/jenkins-home-cjoc-0
command. -
Create a new persistent volume claim using the
pvc.yaml
from the previous command with thekubectl apply -f pvc.yaml
command. -
Check that the new PVC has a status of "Bound" with the
kubectl get pvc/jenkins-home-cjoc-0
command. -
Scale the operations center back to
1
replica with thekubectl scale sts/cjoc --replicas=1
command.