Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/adopters.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ If TyKO handles the lifecycle of your Typesense clusters in Kubernetes, please a

|Name| Description|
|---|---|
|[Architecture Center of T Cloud Public](https://arch.otc-service.com/)|The Best Practices & Blueprints knowledge-hub of [T Cloud Public](https://public.t-cloud.com/en), the public cloud offering of [Deutsche Telekom AG](https://www.telekom.de/start).|
|[Architecture Center of T Cloud Public](https://arch.otc-service.com/)|The Best Practices & Blueprints knowledge-hub of [T Cloud Public](https://public.t-cloud.com/en), the public cloud offering of [Deutsche Telekom AG](https://www.telekom.com).|
|[anny](https://anny.co)|Your flexible booking system for all kinds of resources.|
|[Procure Ai](https://www.procure.ai/)|We enable people to run the world’s most intelligent procurement – human & artificial.|
|[Hardcover.app](https://hardcover.app/)|Social network and book tracking for readers.|
Expand Down
10 changes: 5 additions & 5 deletions docs/crds/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,10 @@ As of **v0.3.6**, storage `accessMode` is introduced that supports `ReadWriteOnc

:::warning

1. When working with [Open Telekom Cloud Object Storage Service (OBS)](https://www.open-telekom-cloud.com/en/products-services/core-services/object-storage-service), [JuiceFS](https://juicefs.com/en/) and [Redis](https://redis.io/) **are not** required in order to mount S3 bucket in the Pods. The `everest-csi-provisioner` takes care of the whole life-cycle of provisioning and mount bucket as volumes
1. When working with [T Cloud Public Object Storage Service (OBS)](https://www.open-telekom-cloud.com/en/products-services/core-services/object-storage-service), [JuiceFS](https://juicefs.com/en/) and [Redis](https://redis.io/) **are not** required in order to mount S3 bucket in the Pods. The `everest-csi-provisioner` takes care of the whole life-cycle of provisioning and mount bucket as volumes
via annotations. You can skip this section entirely.

2. When working with [Amazon S3](https://aws.amazon.com/s3/), [Redis](https://redis.io/) **is not** required, as Amazon S3 comes with is own metadata endpoints.
1. When working with [Amazon S3](https://aws.amazon.com/s3/), [Redis](https://redis.io/) **is not** required, as Amazon S3 comes with is own metadata endpoints.

:::

Expand Down Expand Up @@ -222,9 +222,9 @@ spec:
This is by no means a production-ready Redis cluster nor a best-practice on how to deploy Redis on Kubernetes. It's just a quick spin of cluster in order to be able to work with JuiceFS.
:::

### Open Telekom Cloud OBS
### T Cloud Public OBS

If you are running on [Open Telekom Cloud](https://www.open-telekom-cloud.com/en), you can take advantage of the additional annotations field `csi.storage.k8s.io/fstype`
If you are running on [T Cloud Public](https://www.open-telekom-cloud.com/en), you can take advantage of the additional annotations field `csi.storage.k8s.io/fstype`
that controls how an S3 bucket is mounted into a Kubernetes pod.

- Using `csi.storage.k8s.io/fstype: s3fs` mounts an [SFS Turbo, Scalable File System](https://www.open-telekom-cloud.com/en/products-services/core-services/scalable-file-service) bucket using the S3-compatible API,
Expand Down Expand Up @@ -258,7 +258,7 @@ spec:
:::note
One big advantage of using these annotations is that the respective S3 buckets will be provisioned dynamically by the CSI itself.

For more information about configuring Open Telekom Cloud `StorageClass` consult
For more information about configuring T Cloud Public `StorageClass` consult
the [official documentation](https://docs.otc.t-systems.com/cloud-container-engine/umn/storage/storageclass.html).
:::

Expand Down
172 changes: 86 additions & 86 deletions docs/crds/index.mdx

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions docs/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ No. TyKO, after version 0.3.0, is a very stable release suitable for production

Kindly review the [Disclaimer](/docs/getting-started#disclaimer) carefully once more. (aaaargh!!!)

### What font sorcery is this?

It's [JetBrains Mono](https://www.jetbrains.com/lp/mono/), the opensource typeface by JetBrains.

### Can we meet Tyko, the mascot?

Nope-that can't do, he's a very busy fella!
5 changes: 3 additions & 2 deletions docs/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ Key features of Typesense Kubernetes Operator include:

## Disclaimer

:::warning read this carefully before you proceed
TyKO is an independent and unofficial implementation and **is not affiliated with or endorsed by Typesense, Inc**. TyKO is provided **as-is** without any warranties or guarantees. Use at your own risk.

While every effort has been made to ensure correctness and reliability, the maintainers are not responsible for any data loss, downtime, or other issues arising from the use of this software in production or other environments.
Expand All @@ -67,5 +68,5 @@ Before deploying in a critical environment, we strongly recommend:
- Testing in a safe, non-production setting,
- Keeping up to date with issues and pull requests.

By using TyKO, you agree that you assume full responsibility for any outcomes related to its use.

**By using TyKO, you agree that you assume full responsibility for any outcomes related to its use.**
:::
20 changes: 10 additions & 10 deletions docs/healthcheck.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ The *typesense-healthcheck* sidecar aggregates and reports the health of all nod
```

:::tip
You can configure external load balancers (e.g., AWS ALB or Open Telekom Cloud ELB) to probe the sidecar’s `/readyz` endpoint for continuous, real-time health checks of your cluster.
You can configure external load balancers (e.g., AWS ALB or T Cloud Public ELB) to probe the sidecar’s `/readyz` endpoint for continuous, real-time health checks of your cluster.
:::

## Web UI
Expand All @@ -117,15 +117,15 @@ The library ships with an interactive, single-page monitoring UI built on Vue.js
## Configuration

| Variable | Type | Default | Required | Description |
| ---------------------- | ------ | ---------------------------- | -------- | ---------------------------------------------------- |
| LOG_LEVEL | int | `0` | No | Log level |
| CLUSTER_NAMESPACE | string | `default` | No | K8s namespace where your Typesense StatefulSet lives |
| TYPESENSE_API_KEY | string | — | Yes | API key for accessing each Typesense node |
| TYPESENSE_PROTOCOL | string | `http` | No | Protocol for Typesense API (`http` or `https`) |
| TYPESENSE_API_PORT | uint | `8108` | No | Port for Typesense REST/API Port |
| TYPESENSE_PEERING_PORT | uint | `8107` | No | Port for Typesense Raft Peering Port |
| HEALTHCHECK_PORT | uint | `8808` | No | Port on which this healthcheck sidecar listens |
| TYPESENSE_NODES | string | `/usr/share/typesense/nodes` | No | Path for Typesense Raft nodes list |
| ---------------------- | ------ | ---------------------------- | :------: | ---------------------------------------------------- |
| LOG_LEVEL | int | `0` | | Log level |
| CLUSTER_NAMESPACE | string | `default` | | K8s namespace where your Typesense StatefulSet lives |
| TYPESENSE_API_KEY | string | — | 🔴 | API key for accessing each Typesense node |
| TYPESENSE_PROTOCOL | string | `http` | | Protocol for Typesense API (`http` or `https`) |
| TYPESENSE_API_PORT | uint | `8108` | | Port for Typesense REST/API Port |
| TYPESENSE_PEERING_PORT | uint | `8107` | | Port for Typesense Raft Peering Port |
| HEALTHCHECK_PORT | uint | `8808` | | Port on which this healthcheck sidecar listens |
| TYPESENSE_NODES | string | `/usr/share/typesense/nodes` | | Path for Typesense Raft nodes list |

:::note
All these values are automatically configured by the operator.
Expand Down
27 changes: 27 additions & 0 deletions docs/how-it-works/quorum-reconfiguration.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,30 @@ A `StatefulSet` will be provisioned by the operator as next step of the reconcil
### 7. Evaluating Quorum

The controller, in every reconciliation loop term, assesses the quorum's health by probing and collecting information about the state and the health of each member of the quorum (in our case for every `Pod` which represents a Typesense node). Based on the outcome, the controller devises an action plan for the next reconciliation loop. This process is detailed in the following section:

## Why PodDisruptionBudgets are not used by the Operator?

The Typesense Operator intentionally does **not** create a `PodDisruptionBudget` for the operator-managed Typesense `StatefulSet`.

**This is a design decision.**

The operator does not treat Kubernetes pod readiness as a simple container-health signal. Each Typesense pod includes a custom `PodReadinessGate`, and the operator updates that gate only after evaluating the underlying Typesense node and quorum state. A pod is considered `Ready` **only when the operator determines that the corresponding Typesense node is healthy and safe to serve traffic**.

During quorum problems such as split brain, election deadlock, unavailable nodes, or failed recovery, the operator may deliberately mark pods as not ready, scale the `StatefulSet` down to one replica, update the nodes configuration, and under certain circumstances purge the pods as part of its automatic recovery flow.

A `PodDisruptionBudget` works against this model.

When the operator marks pods as not ready during recovery, a PDB would also see fewer healthy pods. As a result, `allowedDisruptions` would typically interfere exactly when the operator is trying to repair the cluster. This does not protect the quorum; instead, it blocks normal eviction-based operations such as node drains, cluster-autoscaler consolidation, and maintenance workflows.

A PDB also does not protect against the operator’s own recovery actions. The operator deletes pods directly when purging or rebuilding quorum state, so a PDB would not provide meaningful protection at the point where recovery is actually happening.

In practice, adding a PDB around the operator-managed `StatefulSet` can cause the opposite of the intended result:

* node drains and autoscaler operations may become stuck;
* quorum recovery may be delayed, blocked or sent to an eternal loop;
* an allowed eviction can remove a peer at the wrong time and force another recovery cycle;
* the operator and the PDB may end up fighting over availability semantics.

For this reason, it is finally recommended **not to add a PDB to the Typesense `StatefulSet` managed by the operator** by yourselves.

Availability should instead be handled through the operator’s quorum-aware reconciliation, appropriate replica count, anti-affinity, topology spread constraints, resource sizing, persistent storage, and careful node maintenance procedures.
4 changes: 2 additions & 2 deletions docs/installation/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Provision one of the samples available in **config/samples**:
| | Generic | | standard |
| azure | Microsoft Azure | disk.csi.azure.com | managed-csi |
| aws | AWS | ebs.csi.aws.com | gp2 |
| opentelekomcloud | Open Telekom Cloud | disk.csi.everest.io<br/>obs.csi.everest.io | csi-disk<br/>csi-obs |
| opentelekomcloud | T Cloud Public | disk.csi.everest.io<br/>obs.csi.everest.io | csi-disk<br/>csi-obs |
| gcp | Google Cloud Platform | pd.csi.storage.gke.io | standard-rwo |
| bm | Bare Metal | democratic-csi-iscsi<br/>democratic-csi-nfs | iscsi<br/>nfs |
| kind | KIND | | rancher.io/local-path |
Expand All @@ -75,7 +75,7 @@ Provision one of the samples available in **config/samples**:
kubectl apply -f config/samples/ts_v1alpha1_typesensecluster_{{Suffix}}.yaml
```

e.g. for Open Telekom Cloud it would look like:
e.g. for T Cloud Public it would look like:

```yaml title=ts_v1alpha1_typesensecluster_opentelekomcloud.yaml
apiVersion: v1
Expand Down
16 changes: 8 additions & 8 deletions docs/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,14 @@ The exporter gathers various metrics from the Typesense /metrics.json endpoint,
## Configuration

| Variable | Type | Default | Required | Description |
| ------------------ | ------ | ------- | -------- | ---------------------------------------------- |
| LOG_LEVEL | int | `0` | No | Log level |
| TYPESENSE_API_KEY | string | — | Yes | API key for accessing each Typesense node |
| TYPESENSE_HOST | string | — | Yes | Hostname or FQDN of the Typesense node |
| TYPESENSE_PORT | uint | `8108` | No | Port for Typesense REST/API Port |
| TYPESENSE_PROTOCOL | string | `http` | No | Protocol for Typesense API (`http` or `https`) |
| TYPESENSE_CLUSTER | string | — | Yes | Cluster identifier label for metrics |
| METRICS_PORT | uint | `8908` | No | Port on which `/metrics` is served |
| ------------------ | ------ | ------- | :------: | ---------------------------------------------- |
| LOG_LEVEL | int | `0` | | Log level |
| TYPESENSE_API_KEY | string | — | 🔴 | API key for accessing each Typesense node |
| TYPESENSE_HOST | string | — | 🔴 | Hostname or FQDN of the Typesense node |
| TYPESENSE_PORT | uint | `8108` | | Port for Typesense REST/API Port |
| TYPESENSE_PROTOCOL | string | `http` | | Protocol for Typesense API (`http` or `https`) |
| TYPESENSE_CLUSTER | string | — | 🔴 | Cluster identifier label for metrics |
| METRICS_PORT | uint | `8908` | | Port on which `/metrics` is served |

:::note
All these values are automatically configured by the operator.
Expand Down
Loading
Loading