The PowerProtect DataManager Inventory Source uses Standardized Configurations and Configmaps for the Pods deployed by PPDM, e.gh. cProxy, PowerProtect Controller, as well as Velero.
In this Post, i will use an example to deploy the cProxies to dedicated nodes using Node Affinity. This makes Perfect sense if you want to separate Backup from Production Nodes.
More Examples could include using cni plugins like multus, dns configurations etc.
The Method described here is available from PPDM 19.10 and will be surfaced to the UI in Future Versions
1. what we need
The below examples must be run from a bash shell. We will use jq to modify json Documents.
2. Adding labels to worker nodes
in order to use Node Affinity for our Pods, we first need to label nodes for dedicated usage.
In this Example we label a node with tier=backup
A corresponding Pod Configuration example would look like:
We will use a customized template section later for our cProxy
So first, tag the Node(s) you want to use for Backup:
2. Create a Configuration Patch for the cProxy
We create manifest Patch for the cProxy from a yaml Document.
This will be base64 encoded and presented as a Value to POD_CONFIG type to our Inventory Source
The API Reference describes the Format of the Configuration.
The CPROXY_CONFIG variable below will contain the base64 Document
3. Patching the inventory Source using the PowerProtect Datamanager API
Installation and troubleshooting Tips for PPDM 19.11 in disconnected OpenShift 4.10 Environments
Disclaimer: use this at your own Risk
why that ?
I am happily running some disconnected OpenShift Clusters on VMware and AzureStack Hub.
This Post is about how to Protect a Greenfield Deployment of OpenShift 4.10 with PPDM 19.11, running on vSphere.
OpenShift Container Platform 4.10 installs the vSphere CSI Driver Operator and the vSphere CSI driver by default in the openshift-cluster-csi-drivers namespace.
This setup is different from a user Deployed CSI driver or CSI Drivers as a Process like in TKGi.
In this Post, i will point out some Changes required to make OpenShift 4.10 fresh installs work with PPDM 19.11
1. what we need
In order to support Disconnected OpenShift Clusters, we need to prepare our environment to Host certain Images and Operators on a local Registry.
1.1 Mirroring the Operator Catalog for the OADP Provider
PPDM utilized the RedHat OADP (OpenShift APIs for Data Protection) Operator vor Backup and Restore. Therefore, we need to Replicate
redhat-operators from the index image registry.redhat.io/redhat/redhat-operator-index:v4.10
This is well documented on Using Operator Lifecycle Manager on restricted networks, specifically if you want to filter the Catalog to a specific list of Packages.
If you want to mirror the entire Catalog, you can utilize oc adm catalog mirror
Once the Replication is done, make sure apply the ImageContentSourcePolicy and the new CatalogSource itself.
1.2 Mirroring the DELL PowerProtect Datamanager and vSphere/Velero Components
The Following Images need to be Replicated to your local Registry:
On the PPDM Server, point the CNDM (Cloud Native Datamover )Service to the Registry that is hosting your PPDM and Velero Images by editing
/usr/local/brs/lib/cndm/config/application.properties
Put the FQDN for k8s.docker.registry to reflect your local registry:
This will instruct cndm to point to your registry when creating configmaps for PPDM
You need to restart the Service in order for changes to affect.
2.2 Configure a Storage Class with volumeBindingMode: Immediate
The vSphere CSI Operator Driver storage class uses vSphere’s storage policy. OpenShift Container Platform automatically creates a storage policy that targets datastore configured in cloud configuration. However, this uses volumeBindingMode: WaitForFirstConsumer. In order to restore PVC´s to a new Namespace, we need a StorageClass with volumeBindingMode: Immediate
Make sure the StoragePolicyName reflects ure existing Policy ( from Default Storage Class )
2.3 Deploy the RBAC Templates from PPDM
RBAC Templates containing PPDM CRD´s, RoleBindings and ClusterRoleBindings,Roles and ConfigMaps and ServiceAccount Definitions can
found on PPDM Server in /usr/local/brs/lib/cndm/misc/rbac.tar.gz.
Always use the Latest version that comes with your PPDM version !
Once you copied and extracted the Templates, apply the to your cluster:
2.4 Retrieve the PPDM Discovery Service Account Token
Applying the above Templates has also created the Powerprotect namespace and Discovery Token.
Retrieve the token with
2.5 Add the OpenShift Cluster to PPDM
If you not have already enabled the Kubernetes Asset Source in PPDM, do so now.
To do so, go to Infrastructure > AssetSources > +
In the New Asset Source Tab, Click on Enable Source for the Kubernetes Asset Source
Select the Kubernetes tab and click Add. Provide your Cluster information and click on Add credentials.
Provide a Name for the Discovery Service Account and Provide the Token extracted in the Previous Step
Click on Verify to Validate the Certificate of the OpenShift Cluster
hint: if you use unknown root ca, follow the user guide to add the ca to ppdm using the ppdmtool
The the powerprotect controller and Configmap should now being deployed to powerprotect namespace
To view the configmap, execute
to view the logs, execute:
if the controller is waiting for velero-ppdm ip,
then probably your oadp-operator subscription is pointing to the wrong operator catalog source.
View your subscription with
In this case, we need to patch the Subscription to reflect the Catalog Name we created for our custom Operator Catalog ( in this example, redhat-operator-index):
This should deploy the RedHat OADP Operator in the velero-ppdm namespace.
You can view the Operator Status from your OpenShift Console
Now it is time to watch the Pods Created in the velero-ppdm Namespace:
The Backup driver fails to deploy, so we need to have a look at the logs:
Obviously, the OpenShift Cluster Operator deployed CSI drivers, but no configuration was made for the velero-vsphere-plugin to point to a default secrets for velero backup-driver (different from standard CSI Installation )
So we need to create a secret from a vSphere config File hosting the clusterID and the vSphere Credentials,
and apply a configmap to ppdm to use the secret.
Use the following example to create a config file with your vCenter csi account:
Create a Secret bfrom that file using:
Apply the configmap for the velero vSphere Plugin
And delete the existing backup-driver pod
We can see the results with:
3. Run a backup !
Follow the Admin Guide to create a Protection Policy for your Discovered OpenShift Assets and select a Namespace with a PVC.
Run the Policy and examine the Status Details.
Unfortunately, PPDM tries to trigger a CSI based Backup instead of a FCD based PVC Snapshot. This is because upon initial discovery, PPDM did not correctly identify a “VANILLA_VSPHERE” Cluster, as the cluster-csi-operator uses a different install location for the csi drivers. This only Occurs on 4.10 Fresh installs, not on updates from 4.9 to 4.10 !
What we need to do now, is patching the Inventory Source of Our OpenShift Cluster in PPDM using the REST API.
4. Patching a PPDM Inventory Source for fresh deployed 4.10 Clusters
4.1 Get and use the bearer token for subsequent requests
4.2 Get the inventory id´s for vCenter and the OpenShift cluster
4.3 query the distribution type field of the kubernetes inventory source by using above K8S_INVENTORY_ID
If the Distribution type shows NON_VSPHERE, we need to patch it
4.4 Read the inventory into variable:
4.5 Patch the variable content using jq:
4.6 validate the variable using jq:
4.7 And Patch that PPDM !!!
5. Run the Protection Policy Again
In the Job List in PPDM, select the failed job and click on restart
The Job should now run Successful, and take PVC Snapshots (using First Class Disks) instead of CSI Snapshots
Update Dell PowerProtect Datamanager Appliance using Ansible and REST API
Disclaimer: use this at your own Risk
why that ?
Automation is everywhere. Automation should your standards. Automation should be based on (Rest) API´s.
As our customers broadly use Ansible to automate standard IT Tasks, i created this Example use case to manage Dell PowerProtect Datamanager´s Update lifecycle.
My Friend Preston De Guise has written a nice Blogpost on PowerProtect Data Manager 19.11 – What’s New, and Updating
We will do all of his outlined steps to update a PowerProtect Datamanager from 19.10 to 19.11 using Ansible.
The individual API Calls are Organized in Ansible roles and will be executed from corresponding Playbooks
what we need
In general, all of the following playbooks / roles are built with the Ansible URI module ( with one exception :-) )
They have been tested from Ubuntu Linux ( running from WSL2 ), best “Ubuntu 20.04.4 LTS” for python 3.8 support
i am happy to share my ansible roles per request for now.
so let us walk trough a typical update scenario
1. Uploading the Update Package
1.1 the get_ppdm_token role to authenticate with the api endpoint
All of the playbooks require to authenticate via the API endpoint and use a Bearer token for Subsequent requests.
so i use a role called get_ppdm_token to retrieve the token from the API:
1.2 the upload_update role for uploading a package to PPDM
to upload an update package, we have to use a curl via an ansible shell call ( this being the one exception :-) ), as an upload vi URI Module fails for files > 2GB
1.3 Playbook to upload the Update Package
The following snippet is an example of an Upload Playbook
The Playbook will run like this:
2. Pre Checking the Update
The Update Pre Check will inform you about Required Actions need to be taken in order to make the update succeed.
It will also show us Warnings for issues we might correct prior the Update.
2.1 the get_ppdm_update_package role for getting the Update ID
PPDM has an API endpoint to get all Updates in the System. This could be active or historical Updates.
The Response Contains JSON Documents with specific information and state about the Update
This task allows us to get info a specific update by using the update ID, or filter an update by type ( e.g. ACTIVE or HISTORY )
2.2 example Playbook to get an ACTIVE Update Content
This example shows the JSON response for the Update Package with Essential information for example Versions,Required Passwords/Reboot, Updated EULA´s, ID etc:
2.3 the precheck_ppdm_update_package role
After reviewing the Information, we will trigger the Pre Check using the precheck endpoint.
This will transform the Package state to Processing.
The below Precheck role will wait for the state AVAILABLE and the Validation Results:
2.4 Running the Precheck Playbook
The Corresponding Playbook for above task will may look like this:
The Playbook will output the validation Details:
3. Executing the Upgrade
Once the Update Validation has passed, we can execute the Update
3.1 the install_ppdm_update_package role
The below example task shows the upgrade-packages endpoint to be called
A JSON Body needs to be provided with additional information.
We wil create the Body from the Calling Playbook
3.2 the check_update_done role
Once the Update is started, PPDM sysmgr and other components will shut down.
PPDM has a specific API Port to Monitor the Update( also from the UI, Port 14443)
The check_update_done role will wait until the Update reaches 100%
3.3 Playbook to install the Update
to install the update, we will modify the update-package JSON document to change the state field to INSTALLED.
Also, we will approve updated EULA Settings and trust the Package Certificate.
The changes will be merged from the Playbook.
The corresponding Playbook looks like
We can follow the Upgrade Process from the Ansible Playbook:
And also use the Webbrowser at “https://:14443" to see the Update Status:
Due to an Azure Marketplace API Change we are currently investigating, some combined Marketplace Applications in Azure no longer deploy.
This also affect´s DellEMC´s Combined Deployments for Avamar w./DataDomain as well as PowerProtect w./ DataDomain.
This Example will deploy a Fresh PowerProtect Standalone Appliance into a Fresh Resource group for basic testing.
This guide is to give you an understanding on how to accept marketplace terms and deploy anb appliance from a marketplace image using the cli.
I will create a more comprehensive guide for Custom Installs soon.
The Problem lok like this
Uuups, an API Changed. So the blade does not give us a better answer then opening a case.
so with that, we would not be able to deploy the appliance from the Marketplace.
However, we could still use terraform, ARM Templates or … az cli.
So for quick and dirty, I just guide you through an az-cli process:
identifying the template
first of all, we need to get the current image offer for dellemc powerprotect
This will show you all required information to deploy the image. But before we start, we need to accept the Marketplace Image Terms for that image.
For that, we just use az vm image terms accept with the urn:
We also might want to look on what the image includes as image resources:
Deploying the Image
first of all we need to create a resource group for ppdm, if not deploying to an existing one.
in my example, I am going to deploy into a resource group ppdm_from_cli in location germanywestcentral
if you do not ave already created a resource group for you deployment, do so with
next, we will cerate the VM form the Marketplace image using az vm create.
az vm create will create all required resources ( vnet, NIC, NSG, pulicIp ) unless we specify a specific configuration.
Just for the test, we will accept the standard Parameters. In Real World Scenarios, people would deploy to an existing Network that might be managed by CloudAdmin´s.
You will find a more comprehensive Guide on that here soon.
if you do not want a Public IP at this point, add –public-ip-address “”
for now, we just do:
Note: the required for PPDM is a Standard_D8s_v3 ! do not change that !
in order to access the vm via Public IP for Configuration, we need to open 443 on the NSG.
The default NSG is “${VM_NAME}NSG”
Give the System a few moments to but up and configure basic things
Meanwhile, you might want to look at you deployed resources from the Portal:
Try to connect to the appliance on https://[public_ip] after some minutes.
it should bring you to the Appliance Fresh Install page
Recently I tried to deploy newer versions of Kubernetes using AKS Engine to my AzureStack hub, but i failed for some odd reasons. That made me thinking about how do get newer Versions deployed to my AzureStack Hub using aks-engine.
Why should you want a newer version at all? Well, the answer is fairly simple. With K8s dot releases essentially coming monthly, one want’s to stay current with Security fixes. Patching is not an option. I love the image based approach where i simply replace the OS Image. The longer a VM runs, the more vulnerable it get’s. Deleting a VM an rebuild with a new Image is by far the most convenient and secure approach. aks-egine does a pretty good job in upgrading to newer image versions…. if available.
The Problem
If you want to use your own Image, or try a newer AKS Engine release, the Deployment will try to download the missing Packages from https://kubernetesartifacts.azureedge.net/kubernetes/ and the according Docker Images from mcr.microsoft.com/oss/kubernetes/
This Process is most likely to fail for slow Networks, as the download scripts have timeouts of 60 seconds per package.
My First idea was to patch the deployment scripts. While looking at the Code on GitHub, i found it might be much more convenient to create updated aks base images and put them onto my AzureStack Marketplace.
The Current State
As of this Post, the “Official” Documented version of AKS-Engine for AzureStack Hub is v0.55.4.
This Version has Built In Support for Kubernetes up to 1.17.11
Preseeded deployments requires the Following Marketplace Images to be deployed:
The Images have the following K8S Version Pre-Seeded:
However, while reading the Release Notes for AKS-Engine on GitHub, i found newer versions exist with newer Image Support:
Yes, it says v0.60.0 would support up to K8S-AzS v1.18.15, but that is NOT in the current image.
While reading and Browsing the aks-engine GitHub releases, i found it would be a convenient way for me to create new microsoft-aks images using packer the way Microsoft does…
The Packer building Process used my microsoft is essentially an automated approach used in their Pipelines to create new Azure Images.
So why not just use this for AzureStackHub ( keep in mind, it’s like Azure )
As you can see from the Changelog, aks-engine has newer support for AzureStack Hub, however, aks-engine would complain about a missing aks sku version.
To create a newer image offer, we will use packer and the artifacts from the aks-engine GitHub repository.
But before we start, we will need to do some prerequisite.
In a Nutshell, the Process will deploy an Ubuntu Base VM in Azure along with a temporary resource group, pull all supported docker Containers for aks from mcr an pre-seed all software versions. Some hardening and updates will run, and once finished and cleaned up, a new image will be provided along with the SAS Url to download.
Requirements
I run the imaging process from an Ubuntu 18.04 Machine. you can use a VM, WSL2 or any Linux host / Docker Image.
Install the following Packages:
Packer from https://www.packer.io/downloads
make utils ( sudo apt install make )
git ( sudo apt install git)
an Azure account ( the images will be created in Public Azure)
We also would need an Azure Service Principal in an Azure Subscription, as the build process runs in Azure.
Creating a v0.60.0 Compliant image
First of all, use git to clone into the aks-engine repo
every release of aks sitś in a new bracnch
to get a list of all released versions of aks-engine, simply type
as we want to create a v0.60.0 compliant image, we checkout the corresponding release branch:
for the packer process, microsoft automatically creates a settings.json file. to pass required parameters for the file, we export some shell variables for the init process:
(Replace ARM Parameters with your values)
once those variables are set, we can run the initialization of the Environment.
first, we connect programmatic to the azure environment with make az-login
if the login is successful, you SP and Credentials worked.
We can now use the make init-packer command to initialize the Packer Environment (e.g. create the storage account)
*note: i skipped the az-login in the picture above as it shows credentials :-)
once done with the init process, we can start to build our image.
Sit back and relax , the Process will take
a good amount of time as a lot of stuff will be seeded into the image.
Once the Image has been created, you will be presented with URL’s to download the image / template.
We need the “OSDiskUriReadOnlySas” URL now, as we will use it to add the Image to the AzureStack.
Review your Image SKU from /pkg/api/azenvtypes.go .
For example, for an aks-engine-ubuntu-1804-202007 image:
Uploading the Image to AzureStackHub
Goto you AzureStackHub AdminPortal. Click on Compute > VM Images > Add to add a new Image.
Fill in the Image Offer/SKU/Publisher/Vesrion for above, and paste the OSDiskUriReadOnlySas in “OS disk blob URi”.
It will take a while for the Image Upload to be finished. Once the Image state changed fro creating to succeeded, you are ready to test a new deployment with the aks-engine version you used to build the image.
Here are 2 Examples of AKS Nodes running different image sku’s in different Clusters:
For an 16.04, engine v0.55.4 deployed Cluster running K8S v1.17.11:
For an 18.04, engine v0.60.0 deployed Cluster running K8S v1.18.15:
I am running a lot of different AKS Version in my lab with now issues.
In the configs i am using, i run them with the azure cni and calico deployed.
Happy k8s-ing