Migrate analytics data from MFP Cloud 8.0 to PMF Cloud 9.1 on Kubernetes
Prerequisites
- Ensure to take snapshot of the analytics data into a directory.
- Note the number of shards configured in the Elastic search on-prem environment.
- Analytics data is migrated on a fresh PMF 9.1 installation.
- PMF Elastic search component runs in the same namespace as other PMF components.
Procedure
Proceed as follows.
-
In your existing MFP 8.0 set up package, go to
es/deploydirectory and modifyoperator.yamlfile and changees-operatorimage to do the upgrade.Replace existing operator image version with 8.1.32 version, and ensure you have updated version info on below lines (3 places) in operator.yaml
Note: PMF 9.1 package contains
es-operator:8.1.32image, push it to your internal docker repository before applying changes in operator.yaml file.release: es-operator-8.1.32 ... release: es-operator-8.1.32 ... image: es-operator:8.1.32 -
Apply
operator.yamlchanges by using the following command.kubectl apply -f operator.yaml -
Wait untll all the
ibm-es-*pods come up. -
Check if the
ibm-es-es-configmapreflects thepath.repoby using the following command.kubectl edit configmap ibm-es-es-configmapIf the changes do not reflect in the
ibm-es-es-configmap, then manually edit configMap by using the following command.kubectl edit configmap ibm-es-es-configmapUpdate
path.repo: /es_backup\ninelasticsearch.yamlsection.Example
apiVersion: v1 data: elasticsearch.yml: "cluster:\n name: ${CLUSTER_NAME}\nnode:\n master: ${NODE_MASTER}\n \ data: ${NODE_DATA}\n name: ${NODE_NAME}\n ingest: ${NODE_INGEST}\nindex:\n \ number_of_replicas: 1\n number_of_shards: 3\n mapper.dynamic: true\npath:\n \ data: /data/data_${staticname}\n logs: /data/log_${staticname}\n plugins: /elasticsearch/plugins\n work: /data/work_${staticname} \nprocessors: ${PROCESSORS:1}\nbootstrap:\n \ memory_lock: false\nhttp:\n enabled: ${HTTP_ENABLE}\n compression: true\n \ cors:\n enabled: true\n allow-origin: \"*\"\ncloud:\n k8s:\n service: ${DISCOVERY_SERVICE}\n namespace: ${NAMESPACE}\ndiscovery:\n type: io.fabric8.elasticsearch.discovery.k8s.K8sDiscoveryModule\n \ zen:\n ping.multicast.enabled: false\n minimum_master_nodes: 1\nxpack.security.enabled: false\nxpack.ml.enabled: false\ncompress.lzf.decoder: optimal\ndiscovery.zen.ping.multicast.enabled: false\nbootstrap.mlockall: true\ncompress.lzf.decoder: safe\nscript.inline: true\npath.repo: /es_backup\n" -
Create PersistentVolume (PV) and PersistentVolumeClaim (PVC).
a. Create PersistentVolume as follows.
es-pv-volume.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: es-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 2Gi accessModes: - ReadWriteMany hostPath: path: "/es_backup"kubectl apply -f es-pv-volume.yamlb. Create PersistentVolumeClaim as follows.
es-pv-claim.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: es-pv-claim spec: storageClassName: manual accessModes: - ReadWriteMany resources: requests: storage: 2Gikubectl apply -f es-pv-claim.yamlChange the storage size as per your requirements.
kubectl get pvOutput
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE es-pv-volume 2Gi RWX Retain Bound mfpmig2/es-pv-claim manual <unset> 12skubectl get pvcOutput
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE es-pv-claim Bound es-pv-volume 2Gi RWX manual <unset> 9s -
Make volumeMounts and volumes changes in the Elastic search deployments and statefulset.
See the deployments by using the following command.
kubectl get deploymentsOutput
NAME READY UP-TO-DATE AVAILABLE AGE es-operator 1/1 1 1 40h ibm-es-esclient 1/1 1 1 40h ibm-es-esmaster 1/1 1 1 40h ibm-mf-analytics 1/1 1 1 41h ibm-mf-analytics-recvr 1/1 1 1 41h ibm-mf-server 1/1 1 1 41h mf-operator 1/1 1 1 41See the statefulsets by using the following command.
kubectl get statefulsetsOutput
NAME READY AGE ibm-es-esdata 1/1 40hModify
ibm-es-esclientandibm-es-esmasterdeployments to update volumeMounts and volumes as follows.a. Modify
ibm-es-esclientdeployment by using the following command.kubectl edit deployment ibm-es-esclientAdd below volumeMount.
- mountPath: /es_backup name: hp-volumeAdd below volume.
- name: hp-volume persistentVolumeClaim: claimName: es-pv-claimExample
volumeMounts: - mountPath: /es_backup name: hp-volume - mountPath: /data name: storage - mountPath: /elasticsearch/config/elasticsearch.yml name: config subPath: elasticsearch.yml - mountPath: /elasticsearch/config/log4j2.properties name: config subPath: log4j2.propertiesvolumes: - name: hp-volume persistentVolumeClaim: claimName: es-pv-claim - emptyDir: {} name: storage - configMap: defaultMode: 420 name: ibm-es-es-configmap name: configb. Modify
ibm-es-esmasterdeployment by using the following command.kubectl edit deployment ibm-es-esmasterAdd below volumeMount.
- mountPath: /es_backup name: hp-volumeAdd below volume.
- name: hp-volume persistentVolumeClaim: claimName: es-pv-claimExample
volumeMounts: - mountPath: /es_backup name: hp-volume - mountPath: /data name: storage - mountPath: /elasticsearch/config/elasticsearch.yml name: config subPath: elasticsearch.yml - mountPath: /elasticsearch/config/log4j2.properties name: config subPath: log4j2.propertiesvolumes: - name: hp-volume persistentVolumeClaim: claimName: es-pv-claim - emptyDir: {} name: storage - configMap: defaultMode: 420 name: ibm-es-es-configmap name: configc. Modify
ibm-es-esdatastatefulset by using the following command.kubectl edit statefulset ibm-es-esdataAdd below volumeMount.
- mountPath: /es_backup name: hp-volumeAdd below volume.
- name: hp-volume persistentVolumeClaim: claimName: es-pv-claimExample
volumeMounts: - mountPath: /es_backup name: hp-volume - mountPath: /data name: analytics-data - mountPath: /elasticsearch/config/elasticsearch.yml name: config subPath: elasticsearch.yml - mountPath: /elasticsearch/config/log4j2.properties name: config subPath: log4j2.propertiesvolumes: - name: hp-volume persistentVolumeClaim: claimName: es-pv-claim - name: analytics-data persistentVolumeClaim: claimName: mfanalyticsvolclaim2 - configMap: defaultMode: 420 name: ibm-es-es-configmap name: config -
Verify that
/es_backuppath is mounted in each of the elasticsearch pods.ibm-es-esclient-69f4974f8f-brczt 1/1 Running 0 42h ibm-es-esdata-0 1/1 Running 0 42h ibm-es-esmaster-6548b4ddf9-l884h 1/1 Running 0 42ha. Verify that
/es_backuppath inibm-es-esclientpod by using the following command.kubectl exec -it ibm-es-esclient-7cb8768cf5-kv5lc bashbash-4.4$ cat /elasticsearch/config/elasticsearch.yml cluster: name: ${CLUSTER_NAME} ... ... ... xpack.ml.enabled: false compress.lzf.decoder: optimal discovery.zen.ping.multicast.enabled: false bootstrap.mlockall: true compress.lzf.decoder: safe script.inline: true path.repo: /es_backup bash-4.4$ ls -ld /es_backup/You should see path.repo: /es_backup
in theelasticsearch.yaml` and also a mounted path.b. Similiarly verify
/es_backuppath foribm-es-esdata-*andibm-es-esmaster-*pods. -
Take snapshot using elasticsearch API
a. Get elasticsearch master pod IP address by using the following command.
kubectl get pods -o wideOutput
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES es-operator-658779fbb4-xbm76 1/1 Running 0 42h 192.0.2.139 master-node <none> <none> ibm-es-esclient-69f4974f8f-brczt 1/1 Running 0 42h 192.0.2.138 master-node <none> <none> ibm-es-esdata-0 1/1 Running 0 42h 192.0.2.135 master-node <none> <none> ibm-es-esmaster-6548b4ddf9-l884h 1/1 Running 0 42h 192.0.2.143 master-node <none> <none> ibm-mf-analytics-58574df7d6-49bft 1/1 Running 0 42h 192.0.2.142 master-node <none> <none> ibm-mf-analytics-recvr-7bf6857955-xw4ct 1/1 Running 0 42h 192.0.2.191 master-node <none> <none> ibm-mf-defaultsecrets-job-2bcg9 0/2 Completed 0 42h 192.0.2.163 master-node <none> <none> ibm-mf-server-867d785477-bmzmp 1/1 Running 0 42h 192.0.2.184 master-node <none> <none> mf-operator-5c499fd5d8-84sfr 1/1 Running 0 42h 192.0.2.154 master-node <none> <none>Elastic Search master pod IP address in this example is 192.0.2.143.
b. Execute following API to verify that elastic search cluster is up and running.
curl --location --request GET 'http://192.0.2.143:9200/_nodes/process?pretty'c. Execute following API to set backup directory.
curl --location --request PUT 'http://192.0.2.143:9200/_snapshot/my_backup' --header 'Content-Type: application/json' --data '{"type": "fs","settings": {"location": "/es_backup"}}' Success response: {"acknowledged":true}d. Execute following API to take snapshot.
curl --location --request PUT 'http://192.0.2.143:9200/_snapshot/my_backup/snapshot_1' Success response: {"accepted":true}e. Verify that the snapshot is created by using this command on the VM/Node where
/es_backupvolume is created.ls /es_backup/ index indices metadata-snapshot_1 snapshot-snapshot_1
Post-upgrade task
Restore the MFP 8.0 Analytics snapshot data
-
Create PersistentVolume and PersistentVolumeClaim and point it to MFP snapshot (
/es_backupdirectory located on the node/vm) also ensure that elasticsearch.yaml is reflecting thepath.repolocation which is/es_backup.a. Complete the Steps#5a-5c of the Procedure section.
b. Complete the Steps#6-7 of the Procedure section.
-
Restore snapshot by using Elastic search API.
a. Complete the Steps#8a-8d of the Procedure section.
b. Execute following API to restore the snapshot.
curl --location --request POST 'http://192.0.2.137:9200/_snapshot/my_backup/snapshot_1/_restore' Success response: {"accepted":true}c. If you get open index error then close the index and try to run the restore command again.
Close the index by using the following API.
curl --location --request POST 'http://192.0.2.173:9200/global_all_tenants/_close'Where,
‘global_all_tenants’ is the index to be closed. For each open index error, run execute this API with the given open index.
d. Run the restore command after closing all the open indexes.
curl --location --request POST 'http://192.0.2.137:9200/_snapshot/my_backup/snapshot_1/_restore' Success Response: {"accepted":true}e. Once the restore is successful, open all the closed index.
Open an index by using the following API.
curl --location --request POST 'http://192.0.2.173:9200/global_all_tenants/_open'f. Restart the analytics pod by using the following command.
bash kubectl delete pod ibm-mf-analytics-58574df7d6-49bft92