Manual component-based installation
Before you begin
Ensure to have the following prerequisites before proceeding with the installation.
Jump box requirement
Ensure that the entire process is performed using the same jump box.
Parameter values
| Value | Example |
|---|---|
| AWS credentials | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| Cluster name | my-cluster |
| VPC ID | vpc-0abc123 |
| Two private subnet IDs | subnet-aaa, subnet-bbb |
| Ingress FQDN | myapp.example.com |
| S3 backup bucket name | my-backup-bucket (existing) or provision one in Step 3 |
| Image registry endpoint | registry.example.com |
| Registry username and password | Provided by organization |
Deploying PPC using component-based installation
To deploy PPC using the component-based installation, perform the following steps
| Step | Action | Description |
|---|---|---|
| 1 | Exporting AWS credentials | Exports AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN as environment variables to authenticate Terraform and AWS CLI operations. |
| 2 | Installing the tools | Installs all required CLI tools (OpenTofu, AWS CLI, kubectl, Helm, and others) on the jump box, either automatically via bootstrap.sh install-tools or manually. |
| 3 | Provisioning the S3 bucket | (Skip if using an existing bucket) Provisions a new S3 bucket and KMS key for storing PPC backup data using the 00_backup_bucket Terraform module. |
| 4 | Modifying and applying terraform.tfvars files | Configures and applies five Terraform modules in sequence to provision all PPC infrastructure components. |
| 4a | 01_iam_roles module | Creates the EKS cluster IAM role, node group IAM role, and service account IAM roles required for the deployment. |
| 4b | 02_eks_cluster module | Provisions the EKS cluster, VPC security group, and networking add-ons (VPC CNI, kube-proxy). |
| 4c | 03_node_group module | Creates the EKS worker node group with the specified instance size, architecture, and subnet configuration. |
| 4d | 04_eks_addons module | Installs EKS add-ons including CoreDNS, Metrics Server, EBS CSI driver, and snapshot controller. |
| 4e | 05_helm_releases module | Deploys all PPC platform Helm charts including Karpenter, Velero, Envoy Gateway, and Insight. This step may take 15–20 minutes. |
| 5 | Verifying the installation | Confirms all cluster nodes are in Ready state and all pods are in Running state. |
1. Exporting AWS credentials
The installation process uses Terraform to provision and manage AWS resources, such as VPCs, EKS clusters, IAM roles, and S3 buckets. The AWS credentials must be exported as environment variables to authenticate these operations.
Note: While using temporary credentials, such as, using AWS STS, ensure the session token is included and that the credentials have not expired before proceeding.
If the components are installed by different users, ensure that each user must export their AWS credentials. This ensures that all the required access and permissions are available.
To export the AWS credentials, run the following commands.
export AWS_ACCESS_KEY_ID=<your-access-key-id>
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
export AWS_SESSION_TOKEN=<your-session-token>
2. Installing the tools
The following tools and minimum versions are required for the component-based installation. Ensure they are installed on your jump box before proceeding, or use the bootstrap.sh install-tools command to install them automatically.
After downloading and extracting the PPC-K8S-ALL_1.1.0.97.tar, run the following command to install the required tools.
./bootstrap.sh install-tools --cloud aws
Alternatively, the following tools must be installed and available on the jump box before starting.
| Tools Name | Description | Updated Version |
|---|---|---|
| OpenTofu | Required to manage infrastructure as code (IaC) and provision cloud resources. | 1.11.5 |
| AWS CLI | Required to communicate with AWS and manage AWS resources. | 2.36.7 |
| kubectl | Required to communicate with and manage Kubernetes clusters. | 1.36.1 |
| Helm | Required to deploy and manage Kubernetes packages and applications. | 3.21.0 |
| skopeo | Required to inspect, copy, and transfer container images between registries. | 1.18.0 |
| jq | Required to parse, filter, and process JSON data. | 1.7 |
| bc | Required for version comparisons and resource calculations. | 1.07.1 |
| ssh-keygen | Required to generate and manage SSH keys for secure access to deployment environments. | OpenSSH_10.0p2 Debian-7+deb13u4 |
| oras | Required to pull OCI artifacts, including non-container deployment packages, from registries. | 1.3.3 |
| cmctl | Required to validate, manage, and troubleshoot cert-manager TLS certificates. | 2.5.0 |
3. Provisioning the S3 bucket
This step is required if a new S3 bucket is to be provisioned for storing the backup data. If an existing S3 bucket is to be used, note the bucket name and KMS key ARN required for the installation process and skip to the next step.
a. To navigate to 00_backup_bucket directory, run the following command.
cd iac/aws/cluster/modules/00_backup_bucket
b. Edit the terraform.tfvars file to provide the following information.
cluster_name = "<cluster-name>"
s3_bucket_name = "<globally-unique-bucket-name>"
kms_key_alias_name = "alias/pty-backup-<cluster-name>-key"
aws_region = "<region>"
c. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
After the S3 bucket is provisioned successfully, note the bucket name and KMS key ARN. These values are required during the installation process.
d. To sync the Terraform state file to the S3 bucket, run the following command.
# Navigate to the bootstrap-scripts directory
cd <package-root>/bootstrap-scripts
# Run the script to sync the backup data to the S3 bucket
./sync-backup-bucket-state-to-s3.sh
4. Modifying and applying terraform.tfvars files
The iac/aws/cluster/modules/ directory contains the Terraform modules for the PPC installation. To enter details in the terraform.tfvars file, navigate to the appropriate module directory and edit the file accordingly.
After modifying the terraform.tfvars file, apply the changes
01_iam_roles module
a. To navigate to 01_iam_roles directory, run the following command.
cd iac/aws/cluster/modules/01_iam_roles
b. Edit the terraform.tfvars file to provide the following information.
aws_region = "<region>"
eks_cluster_name = "<cluster-name>"
backup_bucket = "<s3-bucket-name>"
backup_bucket_kms_arn = "<kms-key-arn>"
c. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
d. After the configurations are successfully applied, verify the required resources are created.To verify if the resources are created successfully, run the following command.
aws iam list-roles --query "Roles[?contains(RoleName, 'doc-test')].[RoleName, Arn]" --output table
The EKS cluster IAM role, Node group IAM role, and Service account IAM roles must be created.
Additionally, note the role ARNs from the Terraform output. These values are required in subsequent modules.
02_eks_cluster module
a. To navigate to 02_eks_cluster directory, run the following command.
cd iac/aws/cluster/modules/02_eks_cluster
b. Edit the terraform.tfvars file to provide the following information.
Ensure that the security group name must not start with
sg.
aws_region = "<region>"
eks_cluster_name = "<cluster-name>"
backup_bucket = "<s3-bucket-name>"
# --- Networking ---
vpc_id = "<vpc-id>"
security_group_name = "<security-group-name>"
private_subnet_ids = [
"<subnet-a>",
"<subnet-b>"
]
# --- Tagging ---
owner_email = "<owner_email>"
# --- Access Entries (optional) ---
# Add IAM users/roles that need kubectl / tofu access beyond the original installer.
additional_access_entries = [
# {
# principal_arn = "<principal-arn>"
# },
]
c. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
d. After the configurations are successfully applied, verify the required resources are created.To verify if the resources are created successfully, run the following command.
# Confirm the cluster is ACTIVE
aws eks describe-cluster --name <cluster-name> --region <region> \
--query "cluster.{Name:name, Status:status, Version:version, Endpoint:endpoint}" \
--output table
# Verify kubectl can reach the API server
kubectl get nodes # expected: no nodes yet (node group is Stage 03)
# Verify the worker security group exists
aws ec2 describe-security-groups \
--filters "Name=group-name,Values=<security-group-name>*" \
--region <region> \
--query "SecurityGroups[].{Name:GroupName, ID:GroupId}" \
--output table
# Verify VPC CNI and kube-proxy add-ons are ACTIVE
aws eks list-addons --cluster-name <cluster-name> --region <region> --output table
03_node_group module
a. To navigate to 03_node_group directory, run the following command.
cd iac/aws/cluster/modules/03_node_group
b. Edit the terraform.tfvars file to provide the following information.
Note: Use the private subnet IDs from the VPC where the EKS cluster is provisioned while installing the
02_eks_clustermodule.
aws_region = "<region>"
eks_cluster_name = "<cluster-name>"
backup_bucket = "<s3-bucket-name>"
# --- System Node Group ---
node_group_name = "<node-group-name>"
private_subnet_ids = [
"<subnet-a>",
"<subnet-b>"
]
architecture = "<amd64/arm64>"
node_group_desired_size = 2
node_group_max_size = 2
node_group_min_size = 1
Note for non-FIPS deployments: If you completed the steps in Configuring PPC for Non-FIPS Deployment on AWS, the
node_group_ami_type_mapdefault values in variables.tf file have already been changed toBOTTLEROCKET_x86_64(amd64) orBOTTLEROCKET_ARM_64(arm64). Do not add or overridenode_group_ami_typewith a FIPS value in terraform.tfvars, as this will reintroduce FIPS AMIs.
c. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
d. After the configurations are successfully applied, verify the required resources are created.To verify if the resources are created successfully, run the following command.
aws eks describe-nodegroup --cluster-name <cluster-name> --nodegroup-name <node-group-name> --query "nodegroup.status"
kubectl get nodes
Ensure that the Node group status is ACTIVE and the desired number of nodes are in Ready state.
04_eks_addons module
a. To navigate to 04_eks_addons directory, run the following command.
cd iac/aws/cluster/modules/04_eks_addons
b. Edit the terraform.tfvars file to provide the following information.
aws_region = "<region>"
eks_cluster_name = "<cluster-name>"
backup_bucket = "<s3-bucket-name>" #
# --- Upgrade mode only ---
# Set to "~/.kube/config" when upgrading an existing cluster;
# leave empty ("") for a fresh install.
kubeconfig_path = ""
c. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
Note: This stage waits for all nodes from Stage 03 to reach
Readystatus before installing add-ons.
d. After the configurations are successfully applied, verify the required resources are created.To verify if the resources are created successfully, run the following command.
# List all EKS add-ons and confirm they are ACTIVE
aws eks list-addons --cluster-name <cluster-name> --region <region> --output table
# Check add-on health details
for addon in coredns metrics-server aws-ebs-csi-driver snapshot-controller eks-pod-identity-agent; do
echo "--- $addon ---"
aws eks describe-addon --cluster-name <cluster-name> --addon-name $addon --region <region> \
--query "addon.{Name:addonName, Status:status, Version:addonVersion}" --output table
done
# Verify the default storage class exists
kubectl get storageclass
# Confirm CoreDNS and Metrics Server pods are running
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get pods -n kube-system -l k8s-app=metrics-server
05_helm_releases module
a. To navigate to 05_helm_releases directory, run the following command.
cd iac/aws/cluster/modules/05_helm_releases
b. Edit the terraform.tfvars file to provide the following information.
The default node OS is BOTTLEROCKET_x86_64_FIPS. While providing the node_os value, ensure that the value must be the same as nnode_group_ami_type value obtained from the 03_node_group module.
For obtaining the value of node_os, run the following command.
kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.osImage}'; echo
Provide the node_os value in the terraform.tfvars file.
aws_region = "<region>"
eks_cluster_name = "<cluster-name>"
backup_bucket = "<s3-bucket-name>"
backup_bucket_kms_arn = "<kms-key-arn>"
architecture = "<amd64/arm64>"
node_os = "<node-os>"
# --- Registry ---
global_image_reg = "<registry-endpoint>"
harbor_secret = "harbor-secret"
# --- Ingress ---
ingress_fqdn = "<fqdn>"
# --- Owner ---
owner_email = "<owner-email>"
# --- Networking (used to derive internal proxy CIDRs) ---
vpc_cidr_block = "<cidr>"
# --- Envoy Gateway (LoadBalancer subnet discovery) ---
# Populated automatically by bootstrap.sh from stage 02 state.
private_subnet_ids = []
# --- Restore ---
restore = false
backup_name = "authnz-postgresql-schedule-backup"
insight_backup_name = ""
# --- Upgrade mode only ---
# Set to "~/.kube/config" when upgrading an existing cluster;
# leave empty ("") for a fresh install.
kubeconfig_path = ""
is_upgrade = false
skip_validations = false
c. To enter registry credentials using the environment variables, run the following commands.
export TF_VAR_username="<registry-username>"
export TF_VAR_password="<registry-password>"
d. To apply the terraform configuration, run the following command.
tofu init
tofu plan # review the role assignments that will be created
tofu apply # type "yes" when prompted
Note: This process may take 15–20 minutes to get completed. Karpenter nodes are provisioned on demand after the NodePool is created.
e. After the configurations are successfully applied, verify the required resources are created.To verify if the resources are created successfully, run the following command.
# Confirm all Helm releases are deployed
helm list -A
# Verify Karpenter controller is running
kubectl get pods -n karpenter
# Verify Karpenter NodePool and EC2NodeClass exist
kubectl get nodepools
kubectl get ec2nodeclasses
# Verify Velero is running
kubectl get pods -n pty-backup-recovery
# Verify PPC platform pods
kubectl get pods -A
# Verify Insight pods
kubectl get pods -n pty-insight
# Verify Envoy Gateway
kubectl get pods -n api-gateway
# Check all pods across the cluster are healthy
kubectl get pods -A --field-selector=status.phase!=Running,status.phase!=Succeeded
5. Verifying the installation
To verify the installation, run the following command.
kubectl get nodes
kubectl get pods -A
All the nodes should be in the Ready state and all the pods should be in the Running state.
Feedback
Was this page helpful?