Migrate Releases from Helm v2 to Helm v3

About this task

After upgrading a cluster, end users’ Helm releases are not upgraded from version 2. Run a custom script to migrate the end users’ Helm releases or installs to Helm v3.

Procedure

  1. Install the /helm-2to3 plugin.

    export HELM_LINTER_PLUGIN_NO_INSTALL_HOOK=true
    helm plugin install /usr/local/share/helm/plugins/2to3
    
  2. Fetch existing helmv2 config.

    cat >get_helmv2_config.sh<<'EOF'
    JSONPATH='{range .items[*]}{"\n"}{@.metadata.name}:{@.metadata.deletionTimestamp}{range @.status.conditions[*]}{":"}{@.type}={@.status}{end}{end}'
    ARMADA_PODS=( $(kubectl get pods -n armada \
                    --kubeconfig=/etc/kubernetes/admin.conf \
                    --selector=application=armada,component=api \
                    --field-selector status.phase=Running \
                    --output=jsonpath="$JSONPATH") )
    if [ $#ARMADA_PODS[@] -eq 0 ]; then
        echo "$NAME: ERROR - Could not find armada pod."
        exit 1
    fi# Get first available Running and Ready armada pod, with tiller container
    POD=""
    for LINE in "$ARMADA_PODS[@]"; do
        # match only Ready pods with nil deletionTimestamp
        if [[ $LINE =~ ::.*Ready=True ]]; then
            # extract pod name, it is first element delimited by :
            A=$( cut -d ':' -f 1 - <<< "$LINE" )
            P=$A[0]
        else
            continue
        fi
        kubectl  --kubeconfig=/etc/kubernetes/admin.conf \
            cp armada/$P:tmp/.helm "$HOME"/.helm -c tiller
        RC=$?
        if [ $RC -eq 0 ]; then
            echo "$NAME: helmv2 config copied to $HOME/.helm"
            break
        else
            echo "$NAME: ERROR - failed to copy helm config from helmv2 (tiller) to host. (RETURNED: $RC)"
            exit 1
        fi
    done
    EOF
    
  3. Move the helm2 config to helm3.

    ~(keystone-admin)]$ helm 2to3 move config
    
  4. Choose a Helm v2 release to migrate.

    ~(keystone-admin)]$ helmv2-cli -- helm list -a
    
  5. Migrate a helm2 release, for example, myApplication.

    ~(keystone-admin)]$ migrate_helm_release.py myApplication
    

    Note

    The script migrate_helm_release.py is part of the StarlingX release package.

  6. Check if it migrated successfully.

    ~(keystone-admin)]$ helm list -A -a
    
  7. The migrated release should not appear in helm2.

    ~(keystone-admin)]$ helmv2-cli -- helm list -a