Kubernetes Installation
SOP v1.0
BuildPiper Kubernetes Installation #
Standard Operating Procedure — Document Version: 1.0
Effective Date: August 11, 2026
Target Audience: DevOps & System Admins
Installation at a Glance #
Customer fills the configuration Excel template with required parameters.
BuildPiper team updates values.yaml and loadbalancer-setup-values.yaml.
BP team emails the zipped Helm chart with updated values to the customer admin.
Admin applies the Helm chart on the destination Kubernetes cluster.
1. Objective #
This document defines the standard operating procedure for installing BuildPiper on a Kubernetes cluster using Helm. The setup is configured for a non‑root user and follows a secure, repeatable process involving configuration via an Excel template, Helm chart deployment, and thorough post‑installation verification.
2. Supported OS & Hardware Specifications #
| Component | Requirement |
|---|---|
| Supported Operating Systems | Ubuntu 18.04, 20.04, 22.04; RHEL 9 |
| Kubernetes Cluster | 1 Master + 2 Worker nodes, each with 8 Core CPU, 16 GB RAM |
| Driver Prerequisite | EFS‑based CSI driver must be set up in EKS clusters. For on‑premises / LDC environments, use an alternative like Longhorn. |
3. Supported Kubernetes Versions #
BuildPiper officially supports Kubernetes versions v1.25 through v1.33.
4. Prerequisites #
4.1 Managed Redis & MySQL #
The installation requires a managed Redis and MySQL instance. Ensure both are available and network-accessible from the Kubernetes cluster.
| Component | Version Command | Supported Version |
|---|---|---|
| MySQL | mysql --version |
MySQL Ver 8.0.45 |
| Redis | redis-server --version |
Redis server v=8.2.2 |
4.2 MySQL Mandatory Configuration #
Execute the following SQL statements on your MySQL instance:
SET GLOBAL general_log = 0;
SET GLOBAL general_log_file = '/var/lib/mysql/general.log';
SET GLOBAL tls_version = 'TLSv1.2';
SET GLOBAL max_connections = 400;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET GLOBAL sort_buffer_size = 8 * 1024 * 1024; -- 8 MB
SET GLOBAL wait_timeout = 86400;
SET GLOBAL interactive_timeout = 86400;Execute the validation query below to confirm the applied settings:
SHOW VARIABLES WHERE Variable_name IN (
'general_log', 'general_log_file', 'tls_version',
'max_connections', 'transaction_isolation',
'sort_buffer_size', 'wait_timeout',
'interactive_timeout', 'default_authentication_plugin'
);4.3 Redis Configuration #
Enable append‑only persistence on the Redis instance:
CONFIG SET appendonly yes5. BuildPiper Setup Procedure (4‑Step Workflow) #
Step 1: Customer Configuration
Customer fills the configuration Excel file (BP_Installation_Helm_Values.xlsx) with required parameters.
Step 2: Chart Values Updating
BuildPiper team updates the Helm chart’s values.yaml and loadbalancer-setup-values.yaml files using those values.
Step 3: Package Delivery
BuildPiper team emails the zipped Helm chart along with updated values files to the customer’s admin team.
Step 4: Deployment Execution
Customer admin team applies the Helm chart on the destination Kubernetes cluster.
6. Helm Deployment Details #
6.1 Access the Cluster #
Set the environment variable pointing to your cluster kubeconfig:
export KUBECONFIG="<path_to_kubeconfig>"6.2 Helm Install Command #
Execute the Helm installation command:
helm install bp <helm_files_directory> \
--set optimizedRun.firstTime=true \
--set optimizedRun.withPermission=true \
--namespace <namespace> \
-f <helm_files_directory>/values.yaml \
-f <helm_files_directory>/loadbalancer-setup-values.yaml \
--wait<helm_files_directory>— Path where Helm chart files are unzipped.<namespace>— Target dedicated namespace (e.g., bp).
6.3 Helm Upgrade Command (For Future Updates) #
Use the following command for future upgrades or configuration changes:
helm upgrade bp <helm_files_directory> \
--set optimizedRun.firstTime=true \
--set optimizedRun.withPermission=true \
--namespace <namespace> \
-f <helm_files_directory>/values.yaml \
-f <helm_files_directory>/loadbalancer-setup-values.yaml \
--wait7. Configuration Values (from Excel Template) #
7.1 Database & Redis Configuration (Sheet: CustomerToShare) #
| Key | Example Value | Value File Reference | Description |
|---|---|---|---|
| Fernet Key | ix-ztoyXCJlEXpDy8C14-uAg… | loadbalancer-setup-values.yaml | Encrypted DB credentials |
| DB username | (encrypted string) | loadbalancer-setup-values.yaml | MySQL username |
| DB password | (encrypted string) | loadbalancer-setup-values.yaml | MySQL password |
| Redis Host | 100.65.224.34 | loadbalancer-setup-values.yaml | Redis endpoint |
| Mysql Host | 100.65.224.38 | loadbalancer-setup-values.yaml | MySQL endpoint |
7.2 SMTP Configuration (Sheet: CustomerToShare) #
| Key | Example Value | Value File Reference | Description |
|---|---|---|---|
| host | 100.65.240.23 | loadbalancer-setup-values.yaml | SMTP server |
| port | 25 | loadbalancer-setup-values.yaml | SMTP port |
| user | Anonymous | loadbalancer-setup-values.yaml | SMTP username |
| password | Anonymous | loadbalancer-setup-values.yaml | SMTP password |
7.3 Cluster & NFS (Sheet: CustomerToShare) #
| Key | Example Value | Value File Reference | Description |
|---|---|---|---|
| CLUSTER‑NAME | builpiper-poc | loadbalancer-setup-values.yaml | Cluster name (must match onboarding) |
| NFS IP details | 103.127.30.16 | loadbalancer-setup-values.yaml | NFS server IP |
| Share Mount Point | /data/nfs | loadbalancer-setup-values.yaml | NFS export path |
| File System ID | fs-000xxxyyyzzz | loadbalancer-setup-values.yaml | EFS filesystem ID (AWS) |
7.4 Service Account & Storage Class (Sheet: CustomerToShare) #
| Key | Example Value | Value File Reference | Description |
|---|---|---|---|
| Service Account name | buildpiper-sa | values.yaml | Kubernetes service account |
| Storage Class name | bp-sc | values.yaml | Storage class (reclaimpolicy-retain/delete) |
7.5 General & BP Team Configuration (Sheet: OwnedbyBuildPiper) #
| Key | Example Value | Value File Ref | Filled By | Description |
|---|---|---|---|---|
| publicapi_url | http://10.130.0.2:30706 | loadbalancer-setup-values.yaml | BP Team | Master node IP + NodePort |
| organisationName | bp-airtel | loadbalancer-setup-values.yaml | BP Team | Organisation identifier |
| secretKey | (random string) | loadbalancer-setup-values.yaml | BP Team | Internal encryption key |
| fernet key | (generated via SOP) | loadbalancer-setup-values.yaml | BP Team | Fernet key |
| BP Tags (deployapi) | vindh-2.0.0_GA_hotfix7.1 | values.yaml | BP Team | Image tag |
| BP Tags (frontend) | vindh-2.0.0_GA_hotfix7.1 | values.yaml | BP Team | Image tag |
| BP Tags (publicapi) | vindh-2.0.0_GA_hotfix7.1 | values.yaml | BP Team | Image tag |
| BP Tags (scheduleapi) | vindh-2.0.0_GA_hotfix7.1 | values.yaml | BP Team | Image tag |
| BP Tags (bp‑agent) | vindh-2.0.0_GA_hotfix7.1 | values.yaml | BP Team | Image tag |
| License Microservices | 25 | values.yaml | BP Team | Licensed microservices count |
| License Users | 10 | values.yaml | BP Team | Licensed users count |
| Start‑date | today’s date | values.yaml | BP Team | License start date |
| end‑date | end of month | values.yaml | BP Team | License end date |
| Concurrency | 2 | values.yaml | BP Team | Default pipeline concurrency |
| Registry | registry.buildpiper.in | loadbalancer-setup-values.yaml | BP Team | Container registry endpoint |
| username | admin | loadbalancer-setup-values.yaml | BP Team | Registry username |
| password | (encrypted) | loadbalancer-setup-values.yaml | BP Team | Registry password |
8. Verification Steps #
8.1 Verify Pod Status #
Check pod statuses in the installation namespace:
kubectl get pods -n <namespace>Expected Outcome: All pods must show STATUS as Running and READY as 1/1.
NAME READY STATUS RESTARTS AGE bpagent-74b86b5868-szz2b 1/1 Running 0 20h bpagent-74b86b5868-x1vvp 1/1 Running 0 19h deplayout-57d8b5f87c-gpbx2 1/1 Running 0 20h frontend-bc58c74f4-4f2vg 1/1 Running 0 20h publicapi-6c7f4c4f4d-k6dkn 1/1 Running 0 20h scheduleapi-79f98775d4-28pcd 1/1 Running 0 20h
8.2 (Optional) Validate Service & Public Endpoint Access #
1. Fetch NodePort services:
kubectl get svc -n <namespace> | grep NodePort2. Get master node internal IP:
kubectl get nodes -o wide3. Test port connectivity:
telnet <MASTER_NODE_IP> <SERVICE_PORT>4. Check public API health endpoint:
curl <NODE_IP>:<PUBLICAPI_PORT>/api/v1/default/health/8.3 Fetch Logs for Troubleshooting #
To stream logs from a specific pod for troubleshooting:
kubectl logs -f <pod_name> -n <namespace>
# Example: kubectl logs -f publicapi-6c7f4c4f4d-k6dkn -n bp9. Generic Troubleshooting Tips #
- Pods not starting: Run
kubectl describe pod <pod_name> -n <namespace>to view detailed lifecycle events. - Image pull errors: Verify registry credentials and ensure image tags match loadbalancer-setup-values.yaml.
- Database connectivity: Test connectivity to MySQL (3306) and Redis (6379) from a temporary pod inside the cluster.
- Storage issues: Confirm EFS CSI driver / Longhorn is running and StorageClass is bound.
- Invalid encryption: Ensure Fernet key and encrypted credentials match the expected string format without extra spaces.
- Helm deployment errors: Confirm the target namespace exists (
kubectl create namespace <namespace>) and RBAC permissions are applied.
10. References #
- BuildPiper Helm Chart: https://github.com/buildpiper/bp-on-k8s/tree/master/helm-chart
- Load‑Balancer Setup Guide: https://github.com/buildpiper/bp-on-k8s/blob/master/helm-chart/LOADBALANCER-BASED-SETUP.md
11. Conclusion #
By following this Standard Operating Procedure, system administrators can achieve a consistent and repeatable installation of BuildPiper on Kubernetes. For further assistance or escalation, collect full cluster logs and describe output before reaching out to BuildPiper support.
BuildPiper Documentation · Kubernetes Installation SOP
Version 1.0 · Effective: August 11, 2026