Manual component-based installation
This section is intended for enterprise customers who need full control over each stage of the AKS cluster deployment. Use this path when individual infrastructure stages must be reviewed or approved separately. Also use it when integration with an existing CI/CD pipeline is required. Use it when corporate change-management controls prevent running an all-in-one automated script. Each stage is self-contained and can be executed by different teams on the same jump box.
Review the Deploying PPC section to override settings for high availability, data safety, and security compliance before running tofu apply.
Note: If you are performing a standard deployment, ensure you completed Configuring PPC for a Standard Deployment before proceeding. Do not revert
fips_enabledtotruewhen performing the following steps.
Deploying PPC using component-based installation
To install PPC, complete the following steps in order. Each step is described in detail in the sections below.
| Step | Action | Description |
|---|---|---|
| # | Before you begin | Reviews the required access, permissions, and values to collect before installation. |
| 1 | Preparing a jump box | Prepares a jump box with network access to the AKS cluster and private API server endpoint. |
| 2 | Authenticating with Azure CLI | Authenticates with Azure using az login. Verifies access to the target subscription, resource group, managed identities, subnet, and private DNS zone. |
| 3 | Downloading and extracting the release PCT | Downloads and extracts the PPC release archive on the jump box. |
| 4 | Installing required tools | Installs the required CLI tools on the jump box using ./bootstrap-scripts/setup-devtools-azure.sh. |
| 5 | Provisioning backup storage and key vault | (Skip if using existing resources) Provisions a new Azure Storage Account, Blob container, Key Vault, and encryption key. These store PPC backup data and are created with the 00_backup_storage Terraform module. |
| 6 | Filling in each module’s terraform.tfvars | Configures and applies five Terraform modules in sequence to provision all PPC infrastructure components. |
| 6a | 01_identity module | Creates RBAC role assignments for the pre-existing User-Assigned Managed Identities (UAMIs) required by AKS, Velero, and OpenSearch. |
| 6b | 02_aks_cluster module | Provisions the private AKS cluster with a system node pool. It configures networking (Azure CNI Overlay and Cilium) and enables Workload Identity. It also creates federated identity credentials for Velero and OpenSearch. |
| 6c | 03_node_pool module | Creates a user node pool for application workloads with the specified VM size, architecture, and availability zone configuration. |
| 6d | 04_aks_addons module | Creates default and backup Kubernetes storage classes using Azure Managed Disks (Premium LRS). Removes the built-in default storage class annotation. |
| 6e | 05_helm_releases module | Deploys all PPC platform Helm charts including Velero, NFA/Eclipse, Insight, Reloader, and Envoy Gateway. This step may take 15–20 minutes. |
| 7 | Verifying the installation | Confirms all cluster nodes are in Ready state, and all pods are in Running state. |
Before you begin
Ensure to have the following prerequisites before proceeding with the installation.
Access and permissions
| Requirement | Details |
|---|---|
| Azure RBAC | Contributor and User Access Administrator on the target subscription or resource group. |
| Jump box | Debian or Red Hat VM in Azure with internet access to pull the release archive. |
Required Roles
The Azure principal must have AKS cluster admin access.
The required Azure RBAC Roles are listed in the following table:
| Role | Scope | Used by |
|---|---|---|
| Contributor | Resource group | Create AKS cluster, node pool, storage account, Key Vault |
| User Access Administrator | Resource group | Create role assignments (module 01) |
| Storage Blob Data Contributor | Backup storage account | Access state files in backend, upload module 00 state |
| Key Vault Administrator | Key Vault | Create Key Vault and keys (module 00) |
| AKS Cluster Admin | AKS cluster | Kubernetes API access for Helm, kubectl operations (modules 04, 05) |
Deployment Resource Group
All resources created by the installer are provisioned in a single Azure resource group. Specify this group using resource_group_name in each terraform.tfvars file. This resource group must exist before running the installer.
The following resources are created inside this resource group.
| Stage | Resources Created |
|---|---|
| 00_Backup Storage | Storage Account, Key Vault, Key Vault Key, Blob Container |
| 01_Identity | RBAC Role Assignments. References existing UAMIs, no new resources created. |
| 02_AKS Cluster | AKS Cluster, Federated Credentials |
| 03_Node Pool | AKS User Node Pool |
| 04_AKS Addons | Storage Classes, Cluster Add-ons |
| 05_Helm Releases | Kubernetes Namespaces, Secrets, Helm Charts |
Values to collect before starting
Gather the following values before populating each stage terraform.tfvars in Step 5.
| Value | Description | Example |
|---|---|---|
| Cluster name | Name of the AKS cluster to create or manage. | my-aks-cluster |
| Resource group | Azure resource group containing the AKS cluster and related resources. | <resource-group-name> |
| Azure subscription ID | Unique identifier of the Azure subscription used for deployment. | <subscription-id> |
| Azure region | Azure region where the cluster and resources are deployed. | eastus |
| UAMI resource ID | Full resource ID of the user-assigned managed identity for AKS appliance framework workloads. | /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-managed-identity-name> |
| AKS subnet resource ID | Full resource ID of the virtual network subnet where AKS nodes are deployed. | /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name> |
| Private DNS zone resource ID | Full resource ID of the private DNS zone used for AKS private cluster name resolution. | /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/privateDnsZones/privatelink.eastus.azmk8s.io |
| Storage account name | Azure Storage Account used for Velero backups and Terraform remote state. | existing name or provisioned in Step 4 |
| Backup container name | Blob container within the storage account used by Velero for cluster backups. | velero |
| Key Vault name | Azure Key Vault that holds the backup encryption key. | existing name or provisioned in Step 4 |
| Key Vault key name | Name of the encryption key inside the Key Vault used by Velero. | pty-backup-key |
| Velero UAMI resource ID | Full resource ID of the user-assigned managed identity for Velero backup and restore operations. | /subscriptions/<subscription-id>/resourceGroups/<velero-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<velero-managed-identity-name> |
| OpenSearch UAMI resource ID | Full resource ID of the user-assigned managed identity for OpenSearch workload identity. | /subscriptions/<subscription-id>/resourceGroups/<opensearch-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<opensearch-managed-identity-name> |
| Ingress FQDN | Fully qualified domain name used by the ingress controller to expose cluster services externally. | myapp.example.com |
| Image registry endpoint | Endpoint of the container image registry from which cluster images are pulled. Note: If deploying from the Protegrity Container Registry, use registry.protegrity.com:9443. Specify the local registry endpoint if a local registry is used. | <Container_Registry_Path> |
| Registry username & password | Credentials for authenticating with the container image registry. | provided by the team |
Optional: Using a Standard Deployment
By default, the PCT is configured to deploy a cluster using secure settings. To deploy a standard cluster, the configuration files must be modified accordingly. For the additional configurations, refer to Configuring for a Standard Deployment.
Deploying PPC
To deploy PPC using component-based installation, perform the following steps:
1. Preparing a jump box
Create a jump box or use an existing one that has network access to the AKS cluster. The jump box must be able to access the private AKS API server endpoint.
2. Authenticating with Azure CLI
To authenticate with the Azure CLI on the jump box, run the following command:
az login
az account show
Note: CLI login using Single Sign-On (SSO) is not supported. Use
az login --use-device-codeor authenticate as a Service Principal.
Ensure the target subscription, resource group, managed identities, subnet, and private DNS zone are accessible before continuing.
3. Downloading and extracting the release PCT
To download and extract the PCT, refer to Preparing for PPC deployment.
4. Installing required tools
To install the required tools from the extracted PPC release archive, run the following command:
./bootstrap-scripts/setup-devtools-azure.sh
| Tool Name | Description | Minimum Required Version |
|---|---|---|
| OpenTofu | Open-source Terraform fork used to provision and manage infrastructure | OpenTofu v1.11.5 |
| Azure CLI | Command-line tool for managing Azure resources | 2.90.0 |
| kubectl | Kubernetes command-line tool for interacting with the cluster | v1.37.1 |
| Helm | Kubernetes package manager for deploying Helm charts | v3.22.0+g144ca65 |
| skopeo | Tool for inspecting and copying container images between registries | skopeo version 1.9.3 |
| jq | Lightweight command-line JSON processor | jq-1.6 |
| bc | Arbitrary-precision calculator used in shell scripts | bc 1.07.1 |
| ssh-keygen | Tool for generating SSH key pairs used for secure access | OpenSSH_9.2p1 Debian-2+deb12u10, OpenSSL 3.0.20 7 Apr 2026 |
| oras | OCI Registry As Storage client for pushing and pulling artifacts | 1.3.4 |
| cmctl | Command-line tool for managing cert-manager resources | v2.6.1 |
5. Provisioning backup storage and key vault
This is an optional step.
Note: Skip this step if an Azure Storage Account, backup container, Key Vault, and key already exist for this cluster. Note these values. They will be needed in next steps.
- Navigate to the
00_backup_storagedirectory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/00_backup_storage"
- Open
terraform.tfvarsand fill in the required values.
resource_group_name = "<resource-group-name>"
aks_cluster_name = "<cluster-name>"
storage_account_name = "<storage-account-name>"
storage_container_name = "velero"
key_vault_name = "<key-vault-name>"
key_name = "pty-backup-key"
azure_subscription_id = "<subscription-id>"
azure_location = "<region>" # e.g. eastus
Save the file and exit the editor.
To apply the terraform configuration, run the following command:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
- Note the Storage Account, container, Key Vault, and key values for future steps.
6. Filling in each module’s terraform.tfvars
Each module under iac/azure/cluster/modules/ contains its own terraform.tfvars file. There is no single shared configuration file. The terraform.tfvars file in every module must be updated before running the deployment.
Verify that the following values are the same across all modules:
resource_group_nameaks_cluster_nameazure_subscription_idstorage_account_namestorage_container_name
01_identity module
This stage creates RBAC role assignments for the pre-existing User-Assigned Managed Identities (UAMIs) required by AKS, Velero, and OpenSearch.
| Resource | Purpose |
|---|---|
| Managed Identity Operator role | Allows AKS to assign the UAMI to nodes. |
| Virtual Machine Contributor role | Allows AKS to manage VMs in the node resource group. |
| Disk Snapshot Contributor role | Allows Velero to create and manage disk snapshots. |
| Storage Blob Data Contributor (Velero) | Allows Velero to read/write backup blobs. |
| Key Vault Crypto User role | Allows Velero to encrypt/decrypt backups with the Key Vault key. |
| Storage Blob Data Contributor (OpenSearch) | Allows OpenSearch to store snapshot data in blob storage. |
To update the 01_identity module, perform the following steps:
a. Navigate to the iac/azure/cluster/modules/01_identity/ directory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/01_identity/"
b. Edit the terraform.tfvars file to provide the required values.
# -------------------------------------------------
# Common (backend + provider — same value in all stages)
# -------------------------------------------------
resource_group_name = "<resource-group-name>" # e.g. "aks-rg-prod"
aks_cluster_name = "<cluster-name>" # e.g. "prod-aks-cluster"
azure_subscription_id = "<subscription-id>" # e.g. "1e9ef7b6-cdc4-4a6b-98f7-a408ac1e19e0"
storage_account_name = "<storage-account-name>" # e.g. "myclusterstateaccount"
storage_container_name = "velero"
# -------------------------------------------------
# Pre-existing managed identities (provided by IT)
# -------------------------------------------------
uami_id = "</subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-managed-identity-name>>"
velero_uami_id = "</subscriptions/<subscription-id>/resourceGroups/<velero-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<velero-managed-identity-name>>" # required
opensearch_uami_id = "</subscriptions/<subscription-id>/resourceGroups/<opensearch-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<opensearch-managed-identity-name>>" # required
# -------------------------------------------------
# Key Vault (leave empty to skip KV role assignment)
# -------------------------------------------------
key_vault_name = "<key-vault-name>" # e.g. "my-key-vault"
c. Save the file and exit the editor.
d. To initialize, plan, and apply the changes, run the following commands:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
e. To verify the resources created in this stage, run the following commands:
Retrieve the Principal ID of the AKS User-Assigned Managed Identity (UAMI):
az identity show \
--ids "<uami-resource-id>" \
--query principalId \
--output tsv
Use the returned Principal ID to verify the role assignments:
az role assignment list \
--assignee "<aks-uami-principal-id>" \
--output table
Retrieve the Principal ID of the Velero UAMI:
az identity show \
--ids "<velero-uami-resource-id>" \
--query principalId \
--output tsv
Use the returned Principal ID to verify the role assignments:
az role assignment list \
--assignee "<velero-uami-principal-id>" \
--output table
Retrieve the Principal ID of the OpenSearch UAMI:
az identity show \
--ids "<opensearch-uami-resource-id>" \
--query principalId \
--output tsv
Use the returned Principal ID to verify the role assignments:
az role assignment list \
--assignee "<opensearch-uami-principal-id>" \
--output table
02_aks_cluster module
This stage provisions the private AKS cluster with a system node pool. It configures networking using Azure CNI Overlay and Cilium, and enables Workload Identity. It also creates federated identity credentials for Velero and OpenSearch.
| Resource | Purpose |
|---|---|
| AKS cluster | Private Kubernetes control plane with OIDC issuer and Workload Identity enabled. |
| System node pool | 2-node pool for core Kubernetes components, such as, CoreDNS, metrics-server, and so on. |
| Federated credential (Velero) | Allows the Velero service account to authenticate as the Velero UAMI. |
| Federated credential (OpenSearch) | Allows the OpenSearch service account to authenticate as the OpenSearch UAMI. |
| Kubeconfig context | Auto-configures kubectl access to the new cluster. |
To update the 02_aks_cluster module, perform the following steps:
a. Navigate to the iac/azure/cluster/modules/02_aks_cluster/ directory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/02_aks_cluster/"
Note (standard deployment): If you are deploying a standard cluster, ensure
fips_enabledremainsfalse. For more information, refer to Configuring PPC for a Standard Deployment. Do not change this value totrue.
b. Edit the terraform.tfvars file to provide the required values.
# -------------------------------------------------
# Common (backend + provider — same value in all stages)
# -------------------------------------------------
resource_group_name = "<resource-group-name>" # e.g. "aks-rg-prod"
aks_cluster_name = "<cluster-name>" # e.g. "prod-aks-cluster"
azure_subscription_id = "<subscription-id>" # e.g. "1e9ef7b6-cdc4-4a6b-98f7-a408ac1e19e0"
storage_account_name = "<storage-account-name>" # e.g. "myclusterstateaccount"
storage_container_name = "velero"
# -------------------------------------------------
# Identity (UAMI for kubelet and federated credentials)
# -------------------------------------------------
uami_id = "</subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-managed-identity-name>>" # full UAMI resource ID (same as Stage 01)
velero_uami_id = "</subscriptions/<subscription-id>/resourceGroups/<velero-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<velero-managed-identity-name>>" # full Velero UAMI resource ID (for federated credential)
opensearch_uami_id = "</subscriptions/<subscription-id>/resourceGroups/<opensearch-resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<opensearch-managed-identity-name>>" # full OpenSearch UAMI resource ID (for federated credential)
# -------------------------------------------------
# Cluster
# -------------------------------------------------
azure_location = "<region>" # e.g. "eastus" (auto-detected from resource group)
subnet_id = "</subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>>" # e.g. "/subscriptions/.../subnets/snet-aks-applianceframework"
private_dns_zone_id = "</subscriptions/<subscription-id>/resourceGroups/<dns-resource-group>/providers/Microsoft.Network/privateDnsZones/privatelink.eastus.azmk8s.io>" # e.g. "/subscriptions/.../privateDnsZones/privatelink.eastus.azmk8s.io"
# -------------------------------------------------
# Networking (service CIDR + DNS IP)
# -------------------------------------------------
service_cidr = "<10.0.0.0/16>" # auto-derived by updatevartf.sh (non-overlapping with the VNet)
dns_service_ip = "<10.220.0.10>" # auto-derived: the .10 host of the chosen service_cidr
pod_cidr = "<10.0.0.0/16>" # auto-derived: non-overlapping with the VNet and service_cidr
# -------------------------------------------------
# System node pool
# -------------------------------------------------
architecture = "amd64" # amd64 or arm64
system_node_pool_vm_size = "" # leave empty to auto-select based on architecture
system_node_pool_node_count = 2
system_node_pool_disk_size_gb = 50
system_node_pool_os_sku = "AzureLinux"
system_node_pool_zones = ["1", "2", "3"]
fips_enabled = true # set false for a non-FIPS node OS image (immutable)
# -------------------------------------------------
# Ownership / tagging
# -------------------------------------------------
owner_email = "<name@domain.tld>" # optional; blank = auto-detect from the Azure CLI identity
c. Save the file and exit the editor.
d. To initialize, plan, and apply the changes, run the following commands:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
e. To verify the resources created in this stage, run the following commands:
# Confirm the AKS cluster is in Succeeded state
az aks show --name <cluster-name> --resource-group <resource-group> \
--query "{Name:name, State:provisioningState, Version:kubernetesVersion, Fqdn:privateFqdn}" \
--output table
A sample output is displayed below:
Name State Version Fqdn
---------------- --------- --------- -----------------------------------------------
<cluster-name> Succeeded 1.35 <cluster-name>.privatelink.<region>.azmk8s.io
# Verify kubectl can reach the cluster
kubectl get nodes # expect 2 system nodes in Ready state
# Verify federated credentials exist
az identity federated-credential list \
--identity-name <velero-uami-name> \
--resource-group <velero-uami-resource-group> --output table
az identity federated-credential list \
--identity-name <opensearch-uami-name> \
--resource-group <opensearch-uami-resource-group> --output table
03_node_pool module
This stage creates a user-managed node pool for application workloads. Node Auto Provisioning (NAP) handles autoscaling; no cluster autoscaler is configured on this pool.
| Resource | Purpose |
|---|---|
| User node pool (userpool) | Worker nodes for NFA platform, Insight, and other application pods. |
To update the 03_node_pool module, perform the following steps:
a. Navigate to the iac/azure/cluster/modules/03_node_pool/ directory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/03_node_pool/"
Note (standard deployment): If you are deploying a standard cluster, ensure
fips_enabledremainsfalseas configured in Configuring PPC for a Standard Deployment. Do not change this value totrue.
b. Edit the terraform.tfvars file to provide the required values.
# -------------------------------------------------
# Common (backend + provider — same value in all stages)
# -------------------------------------------------
resource_group_name = "<resource-group-name>" # e.g. "aks-rg-prod"
aks_cluster_name = "<cluster-name>" # e.g. "prod-aks-cluster"
azure_subscription_id = "<subscription-id>" # e.g. "1e9ef7b6-cdc4-4a6b-98f7-a408ac1e19e0"
storage_account_name = "<storage-account-name>" # e.g. "myclusterstateaccount"
storage_container_name = "velero"
# -------------------------------------------------
# Node pool
# -------------------------------------------------
subnet_id = "</subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>>" # same subnet as AKS nodes (Stage 02)
architecture = "amd64" # amd64 or arm64
vm_size = "" # leave empty for architecture default
node_pool_disk_size_gb = 120
node_pool_desired_size = 3
node_pool_zones = ["1", "2", "3"]
fips_enabled = true # set false for a non-FIPS node OS image (immutable)
c. Save the file and exit the editor.
d. To initialize, plan, and apply the changes, run the following commands:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
Expected time for this stage is approximately 5 to 10 minutes for node pool provisioning.
e. To verify the resources created in this stage, run the following commands:
# Confirm the user node pool exists and is Succeeded
az aks nodepool show --cluster-name <cluster-name> \
--resource-group <resource-group> --name userpool \
--query "{Name:name, State:provisioningState, Count:count, VmSize:vmSize, OsSku:osSku}" \
--output table
A sample output is displayed below:
Name State Count VmSize OsSku
-------- --------- ------- ---------- ----------
userpool Succeeded <count> <vm-size> AzureLinux
# Verify all nodes are Ready (system + user nodes)
kubectl get nodes -o wide
# Confirm user pool nodes have the expected label
kubectl get nodes -l agentpool=userpool
04_aks_addons module
This stage creates the default and backup Kubernetes storage classes using Azure Managed Disks (Premium LRS). It also removes the built-in default storage class annotation.
| Resource | Purpose |
|---|---|
| ebs-sc storage class | Default storage class, such as, expandable, Premium LRS, WaitForFirstConsumer. |
| ebs-bkp storage class | Backup storage class used by Velero for PVC snapshots. |
| Remove built-in default SC | Ensures only ebs-sc is marked as the cluster default. |
To update the 04_aks_addons module, perform the following steps:
a. Navigate to the iac/azure/cluster/modules/04_aks_addons/ directory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/04_aks_addons/"
b. Edit the terraform.tfvars file to provide the required values.
# -------------------------------------------------
# Common (backend + provider — same value in all stages)
# -------------------------------------------------
resource_group_name = "<resource-group-name>" # e.g. "aks-rg-prod"
aks_cluster_name = "<cluster-name>" # e.g. "prod-aks-cluster"
azure_subscription_id = "<subscription-id>" # e.g. "1e9ef7b6-cdc4-4a6b-98f7-a408ac1e19e0"
storage_account_name = "<storage-account-name>" # e.g. "myclusterstateaccount"
storage_container_name = "velero"
# -------------------------------------------------
# Storage classes (must match Stage 05's terraform.tfvars)
# -------------------------------------------------
storage_class_name = "<storage-class-name>"
backup_storage_class_name = "<backup-storage-class-name>"
c. Save the file and exit the editor.
d. To initialize, plan, and apply the changes, run the following commands:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
e. To verify the resources created in this stage, run the following commands:
# List storage classes and confirm ebs-sc is the default
kubectl get storageclass
# Verify ebs-sc details
kubectl describe storageclass ebs-sc
# Confirm the built-in 'default' storage class is no longer the default
kubectl get storageclass default -o jsonpath='{.metadata.annotations.storageclass\.kubernetes\.io/is-default-class}'
# expected output: empty or "false"
A sample output is displayed below:
storage_class_names = {
"backup" = "ebs-bkp"
"default" = "ebs-sc"
}
05_helm_releases module
This stage deploys all application Helm charts and configures Velero backup with the Azure plugin. It also bootstraps the NFA platform and Insight analytics stack.
| Resource | Purpose |
|---|---|
| Velero Helm release | Backup and disaster recovery with Azure Blob Storage and disk snapshots. |
| NFA / Eclipse Helm release | Main platform stack, such as, API Gateway, cert-manager, Keycloak, services. |
| Insight Helm release | Log aggregation and analytics, such as, Dashboards, Fluentd, OpenSearch. |
| Reloader Helm release | Auto-restarts workloads on ConfigMap or Secret changes. |
| Envoy Gateway Helm release | API gateway and ingress proxy. |
| VolumeSnapshotClass | CSI snapshot class (csi-azure-vsc) for Azure Disk snapshots. |
| Namespaces & registry secrets | Creates namespaces with image-pull secrets for the private registry. |
To update the 05_helm_releases module, perform the following steps:
a. Navigate to the iac/azure/cluster/modules/05_helm_releases/ directory.
export PPC_DEPLOY_DIR=<path to PPC deployment directory>
cd "$PPC_DEPLOY_DIR/iac/azure/cluster/modules/05_helm_releases/"
b. Run the following commands and note the values:
# Get the Velero Client ID
az identity show \
--name <velero-managed-identity-name> \
--resource-group <resource-group-name> \
--query clientId \
-o tsv
# Get the OpenSearch Client ID
az identity show \
--name <opensearch-managed-identity-name> \
--resource-group <resource-group-name> \
--query clientId \
-o tsv
c. Edit the terraform.tfvars file to provide the required values.
Important: The value for
harbor_secretfield must always beharbor-secret.
Note: If deploying from the Protegrity Container Registry, use
registry.protegrity.com:9443. Specify the local registry endpoint if a local registry is used.
# -------------------------------------------------
# Common (backend + provider — same value in all stages)
# -------------------------------------------------
resource_group_name = "<resource-group-name>" # e.g. "aks-rg-prod"
aks_cluster_name = "<cluster-name>" # e.g. "prod-aks-cluster"
azure_subscription_id = "<subscription-id>" # e.g. "1e9ef7b6-cdc4-4a6b-98f7-a408ac1e19e0"
storage_account_name = "<storage-account-name>" # e.g. "myclusterstateaccount"
storage_container_name = "velero"
check_prev_stage = true # set false to skip verifying Stage 04 was applied before Stage 05
# -------------------------------------------------
# Storage classes (must match Stage 04's terraform.tfvars)
# -------------------------------------------------
storage_class_name = "<storage-class-name>"
backup_storage_class_name = "<backup-storage-class-name>"
# -------------------------------------------------
# Networking
# -------------------------------------------------
subnet_id = "</subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>>" # same subnet as Stages 02/03 (for VNet address space lookup)
pod_cidr = "" # optional override; empty = auto-detected from the live AKS network profile
architecture = "amd64" # amd64 or arm64
node_os = "AzureLinux_FIPS" # should mirror stage-03 user node pool os_sku + fips_enabled
node_pool_name = "<node-pool-name>" # must match node_pool_name in Stage 03's terraform.tfvars
# -------------------------------------------------
# Registry
# -------------------------------------------------
global_image_reg = "<Container_Registry_Path>"
harbor_secret = "harbor-secret"
ingress_fqdn = "<FQDN>" # e.g. "apps.example.com"
# -------------------------------------------------
# Ownership / tagging
# -------------------------------------------------
owner_email = "<name@domain.tld>" # optional; blank = auto-detect from the Azure CLI identity
# -------------------------------------------------
# CLI users (enrolled via bootstrap.sh access add-cli-user)
# -------------------------------------------------
cli_user_public_keys = {} # e.g. { "jane.doe" = "ssh-rsa AAAA... jane.doe@host" } — on FIPS clusters only RSA (>=2048 bits) and ECDSA keys are accepted, not Ed25519/DSA
# cli_user_public_keys is an optional map of additional CLI users
# who should be granted SSH access to the cluster. Add entries
# as username-to-public-key pairs, for example: {"jane.doe" = "ssh-rsa AAAA... jane.doe@host"}
# This is used to enroll additional users through bootstrap.sh access add-cli-user.
# On FIPS-enabled clusters, only RSA keys with a minimum length of 2048 bits
# and ECDSA keys are accepted. Ed25519 and DSA keys are not supported.
# -------------------------------------------------
# Restore / backup
# -------------------------------------------------
restore = false # set to true to restore from a previous backup
backup_name = "authnz-postgresql-schedule-backup" # Velero backup name used when restore = true
insight_backup_name = "" # Insight Velero backup name (K8s resources only); leave empty to auto-resolve latest
# -------------------------------------------------
# Workload Identity
# -------------------------------------------------
velero_uami_client_id = "<velero_uami_client_id>" # client ID of the Velero UAMI
opensearch_uami_client_id = "<opensearch_uami_client_id>" # client ID of the OpenSearch UAMI
c. Save the file and exit the editor.
d. This step must be performed only if registry needs an authentication. Do not put them in the tfvars file.
To enter registry credentials using the environment variables, run the following commands:
export TF_VAR_username="<registry-username>"
export TF_VAR_password="<registry-password>"
e. To initialize, plan, and apply the changes, run the following commands:
tofu init
tofu plan # review the proposed changes before applying
tofu apply # when prompted with "Enter a value:", type "yes"
Expected time for this stage is approximately 15 to 20 minutes.
f. To verify the resources created in this stage, run the following commands:
# Confirm all Helm releases are deployed
helm list -A
# Verify Velero is running
kubectl get pods -n pty-backup-recovery
# Verify NFA platform pods
kubectl get pods -A
# Verify Insight pods
kubectl get pods -n pty-insight
# Verify Envoy Gateway
kubectl get pods -n api-gateway
# Verify VolumeSnapshotClass exists
kubectl get volumesnapshotclass
# Check all pods across the cluster are healthy
kubectl get pods -A --field-selector=status.phase!=Running,status.phase!=Succeeded
# Confirm the ingress gateway has an IP
kubectl get gateway -A
A sample output is displayed below:
nfa_release_status = "deployed"
user_svc_private_key = <sensitive>
velero_release_status = "deployed"
All the nodes must be in the Ready state. All the pods must be in the Running or Completed state.
Verifying the installation
To verify the installation, run the following command:
kubectl get nodes
kubectl get pods -A
Configuring for a Standard Deployment
Note: The following instructions are optional and only required for configuring a standard PPC deployment on Azure. Skip these steps if you have already installed the secure settings.
By default, the PCT is configured to deploy a cluster using secure settings. To deploy a standard cluster, the configuration files must be modified.
The following files require changes:
| File | Setting | Value |
|---|---|---|
deployment/iac/azure/cluster/modules/02_aks_cluster/terraform.tfvars | fips_enabled | false |
deployment/iac/azure/cluster/modules/03_node_pool/terraform.tfvars | fips_enabled | false |
For a standard PPC deployment on Azure AKS, perform the following steps:
Ensure that you have downloaded and extracted the PCT. For more information, refer to Preparing for PPC deployment.
Update the settings in the AKS Cluster Module.
a. Navigate to the 02_aks_cluster module.
cd iac/azure/cluster/modules/02_aks_cluster/
b. Edit the terraform.tfvars file. Locate the fips_enabled parameter and set it to false.
fips_enabled = false
c. Save the file and exit the editor.
- Update the settings in the Node Pool Module.
a. Navigate to the 03_node_pool module.
cd iac/azure/cluster/modules/03_node_pool/
b. Edit the terraform.tfvars file. Locate the fips_enabled parameter and set it to false.
fips_enabled = false
c. Save the file and exit the editor.
- After completing all these configuration changes, proceed to deploy the cluster.
Note: The steps provided here update the security settings during installation. When following the installation method, do not revert or overwrite the values configured in this section. Keep
fips_enabledset tofalsein02_aks_clusterand03_node_pool.
Feedback
Was this page helpful?