diff --git a/app/(docs)/[[...slug]]/page.tsx b/app/(docs)/[[...slug]]/page.tsx index 2aa72b0..1978aeb 100644 --- a/app/(docs)/[[...slug]]/page.tsx +++ b/app/(docs)/[[...slug]]/page.tsx @@ -1,25 +1,26 @@ -import { source } from '@/lib/source'; +import { source } from "@/lib/source"; import { DocsPage, DocsBody, DocsDescription, DocsTitle, -} from 'fumadocs-ui/page'; -import { notFound, redirect } from 'next/navigation'; -import { createRelativeLink } from 'fumadocs-ui/mdx'; -import { getMDXComponents } from '@/mdx-components'; -import { CopyPageDropdown } from '@/components/CopyPageDropdown'; -import { Feedback } from '@/components/feedback/client'; -import { onPageFeedbackAction } from '@/components/feedback/actions'; +} from "fumadocs-ui/page"; +import { notFound, redirect } from "next/navigation"; +import { createRelativeLink } from "fumadocs-ui/mdx"; +import { getMDXComponents } from "@/mdx-components"; +import { CopyPageDropdown } from "@/components/CopyPageDropdown"; +import { Feedback } from "@/components/feedback/client"; +import { onPageFeedbackAction } from "@/components/feedback/actions"; +import { MdxLink } from "@/components/MdxLink"; export default async function Page(props: { params: Promise<{ slug?: string[] }>; }) { const params = await props.params; - + // If we're at the root path, show the index page (Get Started) // No redirect needed - the index page will be shown - + // Otherwise, show the regular docs page const page = source.getPage(params.slug); if (!page) notFound(); @@ -27,27 +28,30 @@ export default async function Page(props: { const MDXContent = page.data.body; return ( - {page.data.title} {page.data.description}
- +
-
+
@@ -56,8 +60,6 @@ export default async function Page(props: { ); } - - export async function generateStaticParams() { return source.generateParams(); } @@ -66,15 +68,15 @@ export async function generateMetadata(props: { params: Promise<{ slug?: string[] }>; }) { const params = await props.params; - + // Handle root /docs path - will redirect, but provide metadata just in case if (!params.slug || params.slug.length === 0) { return { - title: 'Parseable Documentation', - description: 'Welcome to the Parseable documentation', + title: "Parseable Documentation", + description: "Welcome to the Parseable documentation", }; } - + const page = source.getPage(params.slug); if (!page) notFound(); diff --git a/components/MdxLink.tsx b/components/MdxLink.tsx new file mode 100644 index 0000000..8cfff15 --- /dev/null +++ b/components/MdxLink.tsx @@ -0,0 +1,17 @@ +import Link from "fumadocs-core/link"; +import type { ComponentProps } from "react"; + +export function MdxLink({ + href, + external, + prefetch, + ...props +}: ComponentProps) { + if (typeof href === "string" && href.startsWith("#")) { + return ; + } + + return ( + + ); +} diff --git a/content/docs/self-hosted/installation/distributed/k8s-helm-enterprise.mdx b/content/docs/self-hosted/installation/distributed/k8s-helm-enterprise.mdx new file mode 100644 index 0000000..d571a08 --- /dev/null +++ b/content/docs/self-hosted/installation/distributed/k8s-helm-enterprise.mdx @@ -0,0 +1,337 @@ +--- +title: Kubernetes (Enterprise) +description: Install Parseable Enterprise in distributed mode on Kubernetes with Helm. +--- + + + +This guide installs Parseable Enterprise in distributed mode on Kubernetes. The installation creates ingestor, querier, and Prism nodes. + +To install Parseable OSS, use the [distributed OSS Kubernetes guide](/docs/self-hosted/installation/distributed/k8s-helm-oss). + +## 1. Prerequisites + +Before you begin, make sure you have: + +- `kubectl` configured for your Kubernetes cluster +- Helm 3 or later +- A Kubernetes storage class +- An existing, empty object-store bucket with access credentials +- `parseable_license.json` and `parseable_license.sig` from Parseable + +A valid Enterprise license is required to run Parseable Enterprise. If you do not have a license, contact [sales@parseable.com](mailto:sales@parseable.com); the Enterprise deployment cannot run without it. + +Confirm the Kubernetes context and find an available storage class: + +```bash +kubectl config current-context +kubectl get nodes +kubectl get storageclass +``` + +## 2. Create the namespace + +```bash +kubectl create namespace parseable +``` + +## 3. Choose an object store + +Choose exactly one object store below. Replace every `<...>` placeholder in the selected option before running the command. + +After completing one option, continue to step 4. + +### Option A: MinIO + + + This single-node MinIO setup is for testing only. Skip the installation if you + already have a MinIO or another S3-compatible object store. + + +Install MinIO and create a bucket named `parseable`: + +```bash +helm repo add minio https://charts.min.io/ +helm install --namespace minio --create-namespace --set "buckets[0].name=parseable,buckets[0].policy=none,buckets[0].purge=false,rootUser=minioadmin,rootPassword=minioadmin,replicas=1,persistence.enabled=true,persistence.storageClass="",resources.requests.memory=128Mi,mode=standalone" minio minio/minio +``` + +Forward the MinIO console port: + +```bash +kubectl port-forward svc/minio-console -n minio 9001:9001 +``` + +Open `http://localhost:9001`. A bucket named `parseable` should be available. + +Create a file named `parseable-env-secret`. These defaults work with the MinIO installation above: + +```bash +cat << EOF > parseable-env-secret +s3.url=http://minio.minio.svc.cluster.local:9000 +s3.access.key=minioadmin +s3.secret.key=minioadmin +s3.region=us-east-1 +s3.bucket=parseable +addr=0.0.0.0:8000 +username=admin +password=admin +EOF +``` + + + These credentials are for testing only. Before creating the Kubernetes Secret, + replace the MinIO and Parseable administrator credentials with secure values + that match your MinIO deployment. + + +Use `s3-store` in [`enterprise-values.yaml`](#7-create-enterprise-valuesyaml). + +### Option B: Amazon S3 + +Create a file named `parseable-env-secret` using the bucket, region, access key, and secret key provided by your AWS administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +s3.url= +s3.access.key= +s3.secret.key= +s3.bucket= +s3.region= +EOF +``` + +Use `s3-store` in [`enterprise-values.yaml`](#7-create-enterprise-valuesyaml). + +### Option C: Google Cloud Storage + +Create a file named `parseable-env-secret` using the bucket details provided by your Google Cloud administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +gcs.url= +gcs.bucket= +EOF +``` + +Keep the service-account JSON file ready. You will create its Kubernetes Secret after creating the main Secret. + + +The service-account JSON file is a credential. Store it securely and never commit it to source control. + + +Use `gcs-store` in [`enterprise-values.yaml`](#7-create-enterprise-valuesyaml). + +### Option D: Azure Blob Storage + +Create a file named `parseable-env-secret` using the storage account, container, and access key provided by your Azure administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +azr.access_key= +azr.account= +azr.container= +azr.url= +EOF +``` + +Use `blob-store` in [`enterprise-values.yaml`](#7-create-enterprise-valuesyaml). + +## 4. Create the Kubernetes Secret + +After creating the file for your selected object store, review it and create the Kubernetes Secret: + +```bash +chmod 600 parseable-env-secret + +kubectl create secret generic parseable-env-secret \ + --namespace parseable \ + --from-env-file=parseable-env-secret +``` + +If you selected Google Cloud Storage, also create the service-account key Secret: + +```bash +kubectl create secret generic parseable-gcs-key \ + --namespace parseable \ + --from-file=key.json='' +``` + +You can add supported environment variables to `parseable-env-secret` as needed. See the [environment variables documentation](/docs/self-hosted/configuration). + +After confirming that the Kubernetes Secret exists, delete the local plaintext file: + +```bash +rm parseable-env-secret +``` + +## 5. Create Enterprise Secrets + +Create the license Secret. Replace `` with the directory containing both license files: + +```bash +kubectl create secret generic parseable-license \ + --namespace parseable \ + --from-file=parseable_license.json='/parseable_license.json' \ + --from-file=parseable_license.sig='/parseable_license.sig' +``` + +Create a random 16-character shared Secret for communication between Enterprise nodes: + +```bash +kubectl create secret generic parseable-cluster-secret \ + --namespace parseable \ + --from-literal=cluster-secret="$(openssl rand -hex 8)" +``` + +## 6. Add the Parseable Helm repository + +```bash +helm repo add parseable https://charts.parseable.com +helm repo update parseable +``` + +## 7. Create `enterprise-values.yaml` + +Create a file named `enterprise-values.yaml`: + +```yaml +parseable: + deploymentMode: distributed + + store: + # MinIO and Amazon S3: s3-store + # Google Cloud Storage: gcs-store + # Azure Blob Storage: blob-store + type: s3-store + secretName: parseable-env-secret + # Google Cloud Storage only: uncomment this block. + # gcsCredentials: + # secretName: parseable-gcs-key + # secretKey: key.json + # mountPath: /var/secrets/google + + clusterSecret: + enabled: true + secretName: parseable-cluster-secret + secretKey: cluster-secret + + enterprise: + enabled: true + license: + secretName: parseable-license + mountPath: /tmp/license + dataKey: parseable_license.json + signatureKey: parseable_license.sig + distributed: + ingestor: + replicas: 3 + resources: + requests: + cpu: 250m + memory: 1Gi + limits: + cpu: 500m + memory: 4Gi + persistence: + staging: + enabled: true + storageClass: + accessMode: ReadWriteOnce + size: 5Gi + + querier: + replicas: 1 + resources: + requests: + cpu: 250m + memory: 1Gi + limits: + cpu: 500m + memory: 4Gi + persistence: + hotTier: + enabled: true + storageClass: + accessMode: ReadWriteOnce + size: 100Gi + + prism: + replicas: 1 + resources: + requests: + cpu: 500m + memory: 1Gi + limits: + cpu: "1" + memory: 2Gi +``` + +Before continuing: + +1. Set `parseable.store.type` for the object store selected in step 3. +2. If you selected Google Cloud Storage, uncomment the `gcsCredentials` block. +3. Replace both `` placeholders with a storage class returned by `kubectl get storageclass`. +4. Adjust replicas, CPU, memory, and volume sizes for your workload. + +## 8. Install Parseable Enterprise + +```bash +helm upgrade --install parseable parseable/parseable \ + --namespace parseable \ + --values ./enterprise-values.yaml \ + --wait \ + --timeout 10m +``` + +## 9. Verify the installation + +```bash +helm status parseable --namespace parseable +kubectl get pods,pvc,services,statefulsets --namespace parseable +``` + +The ingestor, querier, and Prism pods should be `Running`, and all PVCs should be `Bound`. + +## 10. Access Parseable + +Forward the Prism service: + +```bash +kubectl port-forward \ + service/parseable-prism-service 8000:80 \ + --namespace parseable +``` + +Open `http://localhost:8000` and sign in with the administrator credentials used in `parseable-env-secret`. + +Send ingestion traffic inside the cluster to: + +```text +http://parseable-ingestor-service.parseable.svc.cluster.local +``` + +## 11. Troubleshooting + +Start with Prism, then the querier, and then the ingestors: + +```bash +kubectl get events --namespace parseable --sort-by=.lastTimestamp +kubectl logs statefulset/parseable-prism --namespace parseable +kubectl logs statefulset/parseable-querier --namespace parseable +kubectl logs statefulset/parseable-ingestor --namespace parseable +``` + +- License errors usually indicate missing, incorrectly named, or invalid license files. +- `Pending` PVCs usually indicate an invalid storage class or unavailable volume provisioner. +- `CreateContainerConfigError` usually indicates a missing Secret or Secret key. +- Object-store authentication errors usually indicate incorrect credentials, permissions, endpoint, bucket, or container values. +- Use an empty bucket or container for a new Parseable cluster. Metadata from another Parseable cluster can cause credential or deployment identity conflicts. diff --git a/content/docs/self-hosted/installation/distributed/k8s-helm-oss.mdx b/content/docs/self-hosted/installation/distributed/k8s-helm-oss.mdx new file mode 100644 index 0000000..284dfe1 --- /dev/null +++ b/content/docs/self-hosted/installation/distributed/k8s-helm-oss.mdx @@ -0,0 +1,293 @@ +--- +title: Kubernetes (OSS) +description: Install Parseable OSS in distributed mode on Kubernetes with Helm. +redirect_from: + - /installation/distributed/k8s-helm + - /server/installation/distributed/setup-distributed-parseable-on-kubernetes-via-helm + - /installation/kubernetes-helm + - /installation/setup-parseable-on-kubernetes-via-helm +--- + +This guide installs Parseable OSS in distributed mode on Kubernetes. The installation creates separate ingestor and querier nodes. + +To install Parseable Enterprise, use the [distributed Enterprise Kubernetes guide](/docs/self-hosted/installation/distributed/k8s-helm-enterprise). + +## 1. Prerequisites + +Before you begin, make sure you have: + +- `kubectl` configured for your Kubernetes cluster +- Helm 3 or later +- A Kubernetes storage class +- An existing, empty object-store bucket or container +- Credentials with read, write, list, and delete access to the object store + +Confirm the Kubernetes context and find an available storage class: + +```bash +kubectl config current-context +kubectl get nodes +kubectl get storageclass +``` + +## 2. Create the namespace + +```bash +kubectl create namespace parseable +``` + +## 3. Choose an object store + +Choose exactly one object store below. Replace every `<...>` placeholder in the selected option before running the command. + +After completing one option, continue to step 4. + +### Option A: MinIO + + + This single-node MinIO setup is for testing only. Skip the installation if you + already have a MinIO or another S3-compatible object store. + + +Install MinIO and create a bucket named `parseable`: + +```bash +helm repo add minio https://charts.min.io/ +helm install --namespace minio --create-namespace --set "buckets[0].name=parseable,buckets[0].policy=none,buckets[0].purge=false,rootUser=minioadmin,rootPassword=minioadmin,replicas=1,persistence.enabled=true,persistence.storageClass="",resources.requests.memory=128Mi,mode=standalone" minio minio/minio +``` + +Forward the MinIO console port: + +```bash +kubectl port-forward svc/minio-console -n minio 9001:9001 +``` + +Open `http://localhost:9001`. A bucket named `parseable` should be available. + +Create a file named `parseable-env-secret`. These defaults work with the MinIO installation above: + +```bash +cat << EOF > parseable-env-secret +s3.url=http://minio.minio.svc.cluster.local:9000 +s3.access.key=minioadmin +s3.secret.key=minioadmin +s3.region=us-east-1 +s3.bucket=parseable +addr=0.0.0.0:8000 +username=admin +password=admin +EOF +``` + + + These credentials are for testing only. Before creating the Kubernetes Secret, + replace the MinIO and Parseable administrator credentials with secure values + that match your MinIO deployment. + + +Use `s3-store` in [`oss-values.yaml`](#6-create-oss-valuesyaml). + +### Option B: Amazon S3 + +Create a file named `parseable-env-secret` using the bucket, region, access key, and secret key provided by your AWS administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +s3.url= +s3.access.key= +s3.secret.key= +s3.bucket= +s3.region= +EOF +``` + +Use `s3-store` in [`oss-values.yaml`](#6-create-oss-valuesyaml). + +### Option C: Google Cloud Storage + +Create a file named `parseable-env-secret` using the bucket details provided by your Google Cloud administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +gcs.url= +gcs.bucket= +EOF +``` + +Keep the service-account JSON file ready. You will create its Kubernetes Secret after creating the main Secret. + + +The service-account JSON file is a credential. Store it securely and never commit it to source control. + + +Use `gcs-store` in [`oss-values.yaml`](#6-create-oss-valuesyaml). + +### Option D: Azure Blob Storage + +Create a file named `parseable-env-secret` using the storage account, container, and access key provided by your Azure administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +azr.access_key= +azr.account= +azr.container= +azr.url= +EOF +``` + +Use `blob-store` in [`oss-values.yaml`](#6-create-oss-valuesyaml). + +## 4. Create the Kubernetes Secret + +After creating the file for your selected object store, review it and create the Kubernetes Secret: + +```bash +chmod 600 parseable-env-secret + +kubectl create secret generic parseable-env-secret \ + --namespace parseable \ + --from-env-file=parseable-env-secret +``` + +If you selected Google Cloud Storage, also create the service-account key Secret: + +```bash +kubectl create secret generic parseable-gcs-key \ + --namespace parseable \ + --from-file=key.json='' +``` + +You can add supported environment variables to `parseable-env-secret` as needed. See the [environment variables documentation](/docs/self-hosted/configuration). + +After confirming that the Kubernetes Secret exists, delete the local plaintext file: + +```bash +rm parseable-env-secret +``` + +## 5. Add the Parseable Helm repository + +```bash +helm repo add parseable https://charts.parseable.com +helm repo update parseable +``` + +## 6. Create `oss-values.yaml` + +Create a file named `oss-values.yaml`: + +```yaml +parseable: + deploymentMode: distributed + + store: + # MinIO and Amazon S3: s3-store + # Google Cloud Storage: gcs-store + # Azure Blob Storage: blob-store + type: s3-store + secretName: parseable-env-secret + # Google Cloud Storage only: uncomment this block. + # gcsCredentials: + # secretName: parseable-gcs-key + # secretKey: key.json + # mountPath: /var/secrets/google + + distributed: + ingestor: + replicas: 3 + resources: + requests: + cpu: 250m + memory: 1Gi + limits: + cpu: 500m + memory: 4Gi + persistence: + staging: + enabled: true + storageClass: + accessMode: ReadWriteOnce + size: 5Gi + + querier: + replicas: 1 + resources: + requests: + cpu: 250m + memory: 1Gi + limits: + cpu: 500m + memory: 4Gi + persistence: + hotTier: + enabled: true + storageClass: + accessMode: ReadWriteOnce + size: 100Gi +``` + +Before continuing: + +1. Set `parseable.store.type` for the object store selected in step 3. +2. If you selected Google Cloud Storage, uncomment the `gcsCredentials` block. +3. Replace both `` placeholders with a storage class returned by `kubectl get storageclass`. +4. Adjust replicas, CPU, memory, and volume sizes for your workload. + +## 7. Install Parseable + +```bash +helm upgrade --install parseable parseable/parseable \ + --namespace parseable \ + --values ./oss-values.yaml \ + --wait \ + --timeout 10m +``` + +## 8. Verify the installation + +```bash +helm status parseable --namespace parseable +kubectl get pods,pvc,services,statefulsets --namespace parseable +``` + +All ingestor and querier pods should be `Running`, and all PVCs should be `Bound`. + +## 9. Access Parseable + +Forward the querier service: + +```bash +kubectl port-forward \ + service/parseable-querier-service 8000:80 \ + --namespace parseable +``` + +Open `http://localhost:8000` and sign in with the administrator credentials used in `parseable-env-secret`. + +Send ingestion traffic inside the cluster to: + +```text +http://parseable-ingestor-service.parseable.svc.cluster.local +``` + +## 10. Troubleshooting + +```bash +kubectl get events --namespace parseable --sort-by=.lastTimestamp +kubectl logs statefulset/parseable-querier --namespace parseable +kubectl logs statefulset/parseable-ingestor --namespace parseable +``` + +- `Pending` PVCs usually indicate an invalid storage class or unavailable volume provisioner. +- `CreateContainerConfigError` usually indicates a missing Secret or Secret key. +- Object-store authentication errors usually indicate incorrect credentials, permissions, endpoint, bucket, or container values. +- Use an empty bucket or container for a new Parseable cluster. Metadata from another Parseable cluster can cause credential or deployment identity conflicts. diff --git a/content/docs/self-hosted/installation/distributed/k8s-helm.mdx b/content/docs/self-hosted/installation/distributed/k8s-helm.mdx deleted file mode 100644 index 4cb5c7f..0000000 --- a/content/docs/self-hosted/installation/distributed/k8s-helm.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Kubernetes -redirect_from: - - /installation/distributed/k8s-helm - - /server/installation/distributed/setup-distributed-parseable-on-kubernetes-via-helm - - /installation/kubernetes-helm - - /installation/setup-parseable-on-kubernetes-via-helm ---- - -This page explains the steps required to setup Parseable in a distributed mode on Kubernetes via Helm. - -## Prerequisites - -- `kubectl` and `helm` installed and configured to point to relevant Kubernetes cluster. -- Use S3 or a compatible object store such as MinIO to store logs. - -## Set up object store - - -The MinIO installation steps below are for testing purposes only. For production level deployment please refer to the [MinIO documentation](https://min.io/docs/minio/linux/index.html). - - -This step is required only if you want to setup MinIO as the backend for Parseable. Please skip this step if you have another object store, like S3, already available. -Make sure you configure `storageClass` in the helm install command. - -```bash -helm repo add minio https://charts.min.io/ -helm install --namespace minio --create-namespace --set "buckets[0].name=parseable,buckets[0].policy=none,buckets[0].purge=false,rootUser=minioadmin,rootPassword=minioadmin,replicas=1,persistence.enabled=true,persistence.storageClass="",resources.requests.memory=128Mi,mode=standalone" minio minio/minio -kubectl port-forward svc/minio-console -n minio 9001:9001 -``` - -You can now access the MinIO console at `http://localhost:9001`. You should see a bucket called `parseable` created. - -### Create configuration secret - -Create a secret file with the configuration for Parseable. Note that the values set below are based on the MinIO installation above. If you are using a different object store, please update the values accordingly. - -```bash -cat << EOF > parseable-env-secret -s3.url=http://minio.minio.svc.cluster.local:9000 -s3.access.key=minioadmin -s3.secret.key=minioadmin -s3.region=us-east-1 -s3.bucket=parseable -addr=0.0.0.0:8000 -staging.dir=./staging -fs.dir=./data -username=admin -password=admin -EOF -``` - -You can add additional environment variables to the `parseable-env-secret` file as needed. You can find the details of all the environment variables in the [Environment Variables](/docs/self-hosted/configuration) section. - - -After this, create the secret in Kubernetes. - -```bash -kubectl create ns parseable -kubectl create secret generic parseable-env-secret --from-env-file=parseable-env-secret -n parseable -``` - -### Install Parseable - -```bash -helm repo add parseable https://charts.parseable.com/ -helm install parseable parseable/parseable -n parseable --set "parseable.highAvailability.enabled=true" --set "parseable.store=s3-store" --set "parseable.s3ModeSecret.enabled=true" -``` - - -Note that `parseable.highAvailability.enabled=true` flag enables high availability mode. By default, the helm chart installs 3 Parseable ingest services and 1 Parseable query service. It also creates a ClusterIP service for Parseable ingestors. - - -### Access Parseable - -Since we're running Parseable in a distributed mode, the ingestor service and querier services are different. Any log agent or client should send events to the `parseable-ingestor-service` service. To expose the ingress service, you can use the following command: - -```bash -kubectl port-forward svc/parseable-ingestor-service 8000:80 -n parseable -``` - -To access thePrism, you'll need to expose the `parseable-querier-service` service: - -```bash -kubectl port-forward svc/parseable-querier-service 8001:80 -n parseable -``` - -You should now be able to point your browser to `http://localhost:8001` and see the Parseable login page. You can login with the values set in `username` and `password` fields in the `parseable-env-secret` file above. - -## Migration - -This section is for users using Parseable helm chart version `1.3.1` or previous. Parseable release `v1.4.0` introduced a hot-tier mechanism for query nodes. Accordingly, the query nodes in the helm chart are now deployed as a StatefulSet instead of a Deployment. The helm chart version `1.4.0` and above removes the Deployment and creates a StatefulSet for query nodes. - -Since distributed mode always runs with S3 store mode, the data is stored remotely and there is no manual migration required. If you face any issues during the upgrade, please reach out to us in the [community Slack](https://logg.ing/community). diff --git a/content/docs/self-hosted/installation/standalone/k8s-oss.mdx b/content/docs/self-hosted/installation/standalone/k8s-oss.mdx new file mode 100644 index 0000000..dbf5f32 --- /dev/null +++ b/content/docs/self-hosted/installation/standalone/k8s-oss.mdx @@ -0,0 +1,286 @@ +--- +title: Kubernetes (OSS) +description: Install Parseable OSS in standalone mode on Kubernetes with Helm. +redirect_from: + - /installation/standalone/k8s +--- + +This guide installs Parseable OSS as a single standalone pod on Kubernetes. You can use local storage, MinIO, Amazon S3, Google Cloud Storage, or Azure Blob Storage. + + + Standalone mode supports Parseable OSS only. To install Parseable Enterprise, + use the [distributed Enterprise Kubernetes guide](/docs/self-hosted/installation/distributed/k8s-helm-enterprise). + + +## 1. Prerequisites + +Before you begin, make sure you have: + +- `kubectl` configured for your Kubernetes cluster +- Helm 3 or later +- A Kubernetes storage class +- An existing, empty bucket or container with access credentials if you use an object store + +Confirm the Kubernetes context and find an available storage class: + +```bash +kubectl config current-context +kubectl get nodes +kubectl get storageclass +``` + +## 2. Create the namespace + +```bash +kubectl create namespace parseable +``` + +## 3. Choose a storage option + +Choose exactly one storage option below. Replace every `<...>` placeholder in the selected option before creating the Kubernetes Secret. + +After completing one option, continue to step 4. + +### Option A: Local storage + +Create a file named `parseable-env-secret`: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +EOF +``` + +Use `local-store` in [`standalone-values.yaml`](#6-create-standalone-valuesyaml). + +### Option B: MinIO + + + This single-node MinIO setup is for testing only. Skip the installation if you + already have a MinIO or another S3-compatible object store. + + +Install MinIO and create a bucket named `parseable`: + +```bash +helm repo add minio https://charts.min.io/ +helm install --namespace minio --create-namespace --set "buckets[0].name=parseable,buckets[0].policy=none,buckets[0].purge=false,rootUser=minioadmin,rootPassword=minioadmin,replicas=1,persistence.enabled=true,persistence.storageClass="",resources.requests.memory=128Mi,mode=standalone" minio minio/minio +``` + +Forward the MinIO console port: + +```bash +kubectl port-forward svc/minio-console -n minio 9001:9001 +``` + +Open `http://localhost:9001`. A bucket named `parseable` should be available. + +Create a file named `parseable-env-secret` using the MinIO test credentials: + +```bash +cat << EOF > parseable-env-secret +s3.url=http://minio.minio.svc.cluster.local:9000 +s3.access.key=minioadmin +s3.secret.key=minioadmin +s3.region=us-east-1 +s3.bucket=parseable +addr=0.0.0.0:8000 +username=admin +password=admin +EOF +``` + + + These credentials are for testing only. Replace the MinIO and Parseable + administrator credentials before using this setup outside a test cluster. + + +Use `s3-store` in [`standalone-values.yaml`](#6-create-standalone-valuesyaml). + +### Option C: Amazon S3 + +Create a file named `parseable-env-secret` using the bucket credentials provided by your AWS administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +s3.url= +s3.access.key= +s3.secret.key= +s3.bucket= +s3.region= +EOF +``` + +Use `s3-store` in [`standalone-values.yaml`](#6-create-standalone-valuesyaml). + +### Option D: Google Cloud Storage + +Create a file named `parseable-env-secret` using the bucket details provided by your Google Cloud administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +gcs.url= +gcs.bucket= +EOF +``` + +Keep the service-account JSON file ready. You will create its Kubernetes Secret after creating the main Secret. + + + The service-account JSON file is a credential. Store it securely and never + commit it to source control. + + +Use `gcs-store` in [`standalone-values.yaml`](#6-create-standalone-valuesyaml). + +### Option E: Azure Blob Storage + +Create a file named `parseable-env-secret` using the storage credentials provided by your Azure administrator: + +```bash +cat <<'EOF' > parseable-env-secret +addr=0.0.0.0:8000 +username=admin +password= +azr.access_key= +azr.account= +azr.container= +azr.url= +EOF +``` + +Use `blob-store` in [`standalone-values.yaml`](#6-create-standalone-valuesyaml). + +## 4. Create the Kubernetes Secret + +Review the file created for your selected storage option, then create the Secret: + +```bash +chmod 600 parseable-env-secret + +kubectl create secret generic parseable-env-secret \ + --namespace parseable \ + --from-env-file=parseable-env-secret +``` + +If you selected Google Cloud Storage, also create the service-account key Secret: + +```bash +kubectl create secret generic parseable-gcs-key \ + --namespace parseable \ + --from-file=key.json='' +``` + +Confirm that the required Secrets exist without displaying their values: + +```bash +kubectl get secret parseable-env-secret --namespace parseable +kubectl get secret parseable-gcs-key --namespace parseable +``` + +The second command is required only for Google Cloud Storage. + +Delete the local plaintext configuration file after creating the Secret: + +```bash +rm parseable-env-secret +``` + +## 5. Add the Parseable Helm repository + +```bash +helm repo add parseable https://charts.parseable.com +helm repo update parseable +``` + +## 6. Create `standalone-values.yaml` + +Create a file named `standalone-values.yaml`: + +```yaml +parseable: + deploymentMode: standalone + + store: + # Local storage: local-store + # MinIO and Amazon S3: s3-store + # Google Cloud Storage: gcs-store + # Azure Blob Storage: blob-store + type: local-store + secretName: parseable-env-secret + # Google Cloud Storage only: uncomment this block. + # gcsCredentials: + # secretName: parseable-gcs-key + # secretKey: key.json + # mountPath: /var/secrets/google + + standalone: + unified: + persistence: + staging: + storageClass: + size: 5Gi + data: + # Keep enabled for local-store. Set to false for object stores. + enabled: true + storageClass: + size: 5Gi +``` + +Before continuing: + +1. Set `parseable.store.type` for the storage option selected in step 3. +2. Keep `data.enabled: true` for `local-store`; set it to `false` for an object store. +3. If you selected Google Cloud Storage, uncomment the `gcsCredentials` block. +4. Replace both `` placeholders with a storage class returned by `kubectl get storageclass`. +5. Adjust volume sizes for your workload. + +The staging volume temporarily buffers incoming data. The data volume stores permanent data only when `local-store` is selected; object-store deployments keep permanent data in the selected bucket or container. + +## 7. Install Parseable + +```bash +helm upgrade --install parseable parseable/parseable \ + --namespace parseable \ + --values ./standalone-values.yaml \ + --wait \ + --timeout 10m +``` + +## 8. Verify the installation + +```bash +helm status parseable --namespace parseable +kubectl get pods,pvc,services,deployments --namespace parseable +``` + +The Parseable pod should be `Running`, and every enabled PVC should be `Bound`. + +## 9. Access Parseable + +```bash +kubectl port-forward service/parseable-standalone-service 8000:80 --namespace parseable +``` + +Open `http://localhost:8000` and sign in with the username and password stored in `parseable-env-secret`. + +## 10. Troubleshooting + +```bash +kubectl get events --namespace parseable --sort-by=.lastTimestamp +kubectl describe pod --namespace parseable -l app.kubernetes.io/instance=parseable +kubectl logs deployment/parseable-standalone --namespace parseable --tail=200 +``` + +- `Pending` PVCs usually indicate an invalid storage class or unavailable volume provisioner. +- `CreateContainerConfigError` usually indicates a missing Secret or Secret key. +- Object-store authentication errors usually indicate incorrect credentials, permissions, endpoint, bucket, or container values. +- Use an empty bucket or container for a new Parseable installation. diff --git a/content/docs/self-hosted/installation/standalone/k8s.mdx b/content/docs/self-hosted/installation/standalone/k8s.mdx deleted file mode 100644 index 4400d57..0000000 --- a/content/docs/self-hosted/installation/standalone/k8s.mdx +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Kubernetes -redirect_from: - - /installation/standalone/k8s ---- - -This page explains the steps required to setup Parseable (in S3 or Local mode) on Kubernetes via Helm. - -### Prerequisites -- `kubectl` and `helm` installed and configured to point to relevant Kubernetes clusters. - -### Setup Parseable with Local Storage -#### Create configuration secret - -Create a secret file with the configuration for Parseable. - -```bash -cat << EOF > parseable-env-secret -addr=0.0.0.0:8000 -staging.dir=./staging -fs.dir=./data -username=admin -password=admin -EOF -``` - -You can add additional environment variables to the `parseable-env-secret` file as needed. You can find the details of all the environment variables in the [Environment Variables](/docs/self-hosted/configuration) section. - -Then create the secret in Kubernetes. - -```bash -kubectl create ns parseable -kubectl create secret generic parseable-env-secret --from-env-file=parseable-env-secret -n parseable -``` - -#### Install Parseable - -```bash -helm repo add parseable https://charts.parseable.com -helm install parseable parseable/parseable -n parseable --set "parseable.local=true" -kubectl port-forward svc/parseable 8000:80 -n parseable -``` - -You should now be able to point your browser to `http://localhost:8000` and see the Parseable login page. You can login with the values set in the username and password fields in the `parseable-env-secret` file above. - -### Setup Parseable with S3 Storage -#### Setup object store -This step is required only if you want to setup [MinIO](https://min.io/) as the backend for Parseable. Please skip this step if you have another object store, like S3, already available. - -```bash -helm repo add minio https://charts.min.io/ -helm install --namespace minio --create-namespace --set "buckets[0].name=parseable,buckets[0].policy=none,buckets[0].purge=false,rootUser=minioadmin,rootPassword=minioadmin,replicas=1,persistence.enabled=false,resources.requests.memory=128Mi,mode=standalone" minio minio/minio -kubectl port-forward svc/minio-console -n minio 9001:9001 -``` -You can now access the MinIO console on http://localhost:9001. You should see a bucket called `parseable` created. - - - -MinIO installation steps above are for testing purposes only. For production, please refer to the [MinIO documentation](https://min.io/docs/minio/linux/index.html). - - -#### Create configuration secret -Create a secret file with the configuration for Parseable. Note that the values set below are based on the MinIO installation above. If you are using a different object store, please update the values accordingly. - -```bash -cat << EOF > parseable-env-secret -s3.url=http://minio.minio.svc.cluster.local:9000 -s3.access.key=minioadmin -s3.secret.key=minioadmin -s3.region=us-east-1 -s3.bucket=parseable -addr=0.0.0.0:8000 -staging.dir=./staging -fs.dir=./data -username=admin -password=admin -EOF -``` - -Then create the secret in Kubernetes. - -```bash -kubectl create ns parseable -kubectl create secret generic parseable-env-secret --from-env-file=parseable-env-secret -n parseable -``` - -#### Install Parseable - -```bash -helm repo add parseable https://charts.parseable.com -helm install parseable parseable/parseable -n parseable -kubectl port-forward svc/parseable 8000:80 -n parseable -``` - -You should now be able to point your browser to `http://localhost:8000` and see the Parseable login page. You can login with the values set in the username and password fields in the `parseable-env-secret` file above. - -