- The data plane runs entirely in your cloud account within a dedicated VPC, storing and processing your vectors, executing queries, and managing index data in object storage (S3 on AWS, GCS on GCP, or Azure Blob Storage on Azure).
- The control plane is managed by Pinecone globally and handles index lifecycle management, authentication, billing, and user management, but never stores or processes your vectors.
Prerequisites
Before deploying BYOC, ensure you have the following tools installed on your local machine:| Tool | Purpose | Install |
|---|---|---|
| Python 3.12+ | Runtime | python.org |
| uv | Package manager | docs.astral.sh/uv |
| Pulumi | Infrastructure-as-code | pulumi.com/docs/install |
| kubectl | Cluster access | kubernetes.io |
- The CLI for your cloud provider:
- AWS: AWS CLI v2
- GCP: gcloud CLI
- Azure: Azure CLI
- A cloud account with admin-level permissions:
- AWS:
AdministratorAccess.PowerUserAccessis not sufficient because BYOC creates IAM roles and policies. - GCP:
roles/owner.roles/editoris not sufficient because BYOC creates IAM service accounts and bindings. - Azure:
Owneron the subscription.Contributoris not sufficient because BYOC creates managed identities and role assignments.
- AWS:
- Sufficient cloud quota for the resources (the setup wizard validates this)
- A Pinecone API key from the Pinecone console.
- A Pinecone Enterprise plan (required for BYOC access)
Deploy BYOC
To deploy BYOC, follow these steps:Run the setup wizard
Setup wizard prompts
Setup wizard prompts
| Prompt | Description | Default |
|---|---|---|
| Cloud provider | Select AWS, GCP, or Azure (skipped if pre-selected via --cloud). | - |
| Pinecone API key | Your API key from the Pinecone console (or uses PINECONE_API_KEY env var). | - |
| Cloud credentials | Validates credentials and displays your account/project/subscription ID. | - |
| GCP project ID | (GCP only) Your GCP project ID. | Detected from gcloud |
| Azure subscription ID | (Azure only) Your Azure subscription ID. | Detected from az account show |
| Region | Region for deployment. | us-east-1 (AWS) / us-central1 (GCP) / eastus (Azure) |
| Availability zones | Zones for high availability. Wizard fetches available options. | First two zones |
| Custom AMI | (AWS only) Custom AMI ID for EKS nodes. Leave blank for the default AWS AMI. | None |
| VPC CIDR block | IP range for your VPC/VNet. Choose a range that doesn’t conflict with existing networks. | 10.0.0.0/16 (AWS/Azure) / 10.112.0.0/12 (GCP) |
| Deletion protection | Protect databases and storage from accidental deletion. | Enabled |
| Network access | Public access (connect from anywhere) or private only (requires PrivateLink on AWS, Private Service Connect on GCP, or Private Link on Azure). | Public enabled |
| Resource tags/labels | Custom tags (AWS/Azure) or labels (GCP) for cost tracking (e.g., team=platform,env=prod). | None |
| Preflight checks | Validates cloud quotas. If checks fail, request quota increases before proceeding. | - |
| Project name | Name for your deployment. | pinecone-byoc |
| Pulumi backend | Where to store state: local (~/.pulumi with passphrase) or Pulumi Cloud. | Local |
Generated configuration file
Generated configuration file
Pulumi.<stack>.yaml file with configurable options. The options vary by cloud provider:- AWS
- GCP
- Azure
| Option | Description | Default |
|---|---|---|
pinecone-version | Pinecone release version | - |
region | AWS region | us-east-1 |
availability-zones | Availability zones for high availability | ["us-east-1a", "us-east-1b"] |
vpc-cidr | VPC IP range | 10.0.0.0/16 |
deletion-protection | Protect RDS and S3 from accidental deletion | true |
public-access-enabled | Enable public endpoint (false = PrivateLink only) | true |
custom-ami-id | Custom AMI ID for EKS nodes | Default AWS AMI |
tags | Custom tags for all AWS resources | {} |
Pulumi.<stack>.yaml and run pulumi up.Programmatic usage
Programmatic usage
pulumi-pinecone-byoc package is available on PyPI. Install with cloud-specific dependencies:Deploy the infrastructure
- Your BYOC environment name (used when creating indexes).
- The kubectl command to configure cluster access.
Infrastructure provisioned
Infrastructure provisioned
| Component | AWS | GCP | Azure |
|---|---|---|---|
| VPC / Networking | VPC, public and private subnets, NAT gateways, internet gateway | VPC network, subnets, Cloud NAT, Cloud Router | VNet, subnets, NAT gateway |
| Kubernetes | EKS cluster with managed node groups | GKE cluster with node pools | AKS cluster with agent pools |
| Object storage | S3 buckets (data, WAL, backups) | GCS buckets (data, WAL, backups) | Blob Storage containers (data, WAL, backups) |
| Database | Aurora PostgreSQL (RDS) | AlloyDB | PostgreSQL Flexible Server |
| Load balancing | Network Load Balancer | Internal load balancer with Private Service Connect | Internal load balancer with Private Link Service |
| DNS | Route 53 hosted zone | Cloud DNS managed zone | Azure DNS zone |
| TLS certificates | AWS Certificate Manager | cert-manager | cert-manager |
| IAM | IAM roles and policies | Service accounts and Workload Identity | Managed identities and Workload Identity |
Verify the deployment
kubectl to connect to your cluster using the command from the deployment output:- AWS
- GCP
- Azure
kubectl tool to communicate with your Kubernetes cluster. You’ll use cluster access for administrative tasks like viewing operations and troubleshooting. Creating indexes and reading/writing vectors still use the standard Pinecone API.Verify all components are running:Running status. If any pods are in Pending or CrashLoopBackOff, check the Troubleshooting section.You can also verify the cluster operations CRD is installed:Use BYOC
Once your BYOC environment is deployed, you can create indexes and read/write data using the standard Pinecone API.Control plane operations
Control plane operations like creating, listing, and deleting indexes work via the standard Pinecone API regardless of your network access mode.Create an index
Create an index
Data plane operations
Data plane operations like querying, upserting, and fetching vectors depend on your network access mode.Public access enabled (default)
Public access enabled (default)
host URL from the Pinecone console or the Describe an index API response. For example:Public access disabled
Public access disabled
- AWS
- GCP
- Azure
Create a VPC endpoint
private_host URL from the Pinecone console or the Describe an index API response. For example:Manage BYOC
Operations and upgrades
Pinecone uses a pull-based model for cluster operations:- When upgrades, scaling, or maintenance are needed, Pinecone queues operations in the control plane.
- An agent running in your cluster (deployed automatically during setup) continuously pulls pending operations.
- Operations execute locally within your cluster.
- Status is reported back to Pinecone for monitoring.
Monitoring
You can monitor your BYOC deployment through multiple channels:Pinecone console
Pinecone console
Prometheus
Prometheus
Audit logs
Audit logs
Cleanup
To destroy your BYOC deployment:deletion_protection is enabled (the default), you must either disable it in Pulumi.<stack>.yaml and run pulumi up, or manually delete protected resources via the cloud console before running pulumi destroy:
- AWS: RDS instances and S3 buckets
- GCP: AlloyDB instances and GCS buckets
- Azure: PostgreSQL Flexible Server instances and Storage accounts
Reference
Troubleshooting
Common issues and how to resolve them:Preflight check failures
Preflight check failures
| Check | Resolution |
|---|---|
| VPC / network quota | Request a limit increase via your cloud provider’s quota console |
| Kubernetes cluster quota | Request an EKS, GKE, or AKS cluster limit increase |
| IP address quota | Release unused IPs or request a limit increase |
| Instance / machine type availability | Verify the required type is available in your region |
| vCPU quota (Azure) | Request a “Total Regional vCPUs” increase via the Azure Portal (minimum 8 required) |
| VM SKU availability (Azure) | Verify Standard_D4s_v5 and L-series SKUs are available in your region |
| Resource providers (Azure) | Register required providers: Microsoft.Compute, Microsoft.ContainerService, Microsoft.DBforPostgreSQL, Microsoft.Storage, Microsoft.Network, Microsoft.KeyVault, Microsoft.ManagedIdentity, Microsoft.Authorization |
| Required APIs (GCP only) | Enable Compute Engine, GKE, AlloyDB, Cloud Storage, and Cloud DNS |
Deployment failures
Deployment failures
pulumi up fails partway through:Cluster access issues
Cluster access issues
- AWS
- GCP
- Azure
Index stuck in terminating state
Index stuck in terminating state
Limitations
Some features available in the standard Pinecone service are not yet supported or have constraints in BYOC:- Each organization can have up to 2 BYOC environments. To request an increase, contact Pinecone support.
- Integrated embedding and inference, which relies on models hosted by Pinecone outside your cloud account.
- Reading and writing data from the index browser in the Pinecone console.
- Pinecone CLI data plane operations (queries, upserts, fetches). Control plane operations (create, list, delete indexes) work as expected.
- Imports from private cloud storage buckets, unless the bucket is in the same cloud account as your BYOC deployment.
- Customer-managed encryption keys (CMEK).
- On-demand indexes (initial release supports DRN indexes only).
FAQs
Answers to common questions about BYOC:Does Pinecone have access to my cloud account?
Does Pinecone have access to my cloud account?
- Pinecone does not need SSH, VPN, or inbound access to your cluster.
- You control cloud account boundaries, networking, and Kubernetes access.
- Operational changes run through explicit, software-mediated workflows.
- You don’t open inbound firewall ports for Pinecone operations.
What data leaves my cluster?
What data leaves my cluster?
- Vectors, metadata, and index contents
- Query and upsert payloads
- Customer data
- Operational metrics and traces (for example, CPU, memory, latency)
- Cluster health and operation status
What is the difference between BYOC and Pinecone's standard service?
What is the difference between BYOC and Pinecone's standard service?
How does authentication work?
How does authentication work?
How is data secured in BYOC?
How is data secured in BYOC?
Which cloud providers does BYOC support?
Which cloud providers does BYOC support?
What happens if I destroy the cluster before deleting indexes?
What happens if I destroy the cluster before deleting indexes?
pulumi destroy.What is the __SLI__ project in my organization?
What is the __SLI__ project in my organization?
__SLI__ in your organization. This is used by Pinecone to enforce SLAs for your BYOC environment. Do not modify or delete this project.Pricing
BYOC pricing is based on provisioned resources (compute and storage) in your deployment, metered over time. Usage is measured by the Pinecone BYOC agent running in your cluster, which periodically reports the resources that are provisioned. What you pay:- Pinecone fees: Based on provisioned compute (vCPU and RAM) and storage (NVMe) resources
- Cloud provider fees: You pay your cloud provider directly for the underlying infrastructure (Kubernetes nodes, object storage, databases, networking, etc.)
- When heartbeats are received, you are billed for the provisioned compute and storage the agent reports, even if the cluster is unhealthy.
- Short heartbeat interruptions (under 60 minutes) are treated as a grace period.
- If heartbeats are missing for more than 60 minutes, billing stops and the deployment is marked disconnected.