Ctrl K
ComunidadGuías…

kubernetes/README.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Calibre Web Automated — Kubernetes Deployment

This directory contains a working, opinionated example for deploying Calibre Web Automated (CWA) to Kubernetes. It includes:

- A `Deployment` and `Service`
- Two `PersistentVolumeClaim`s for configuration and the Calibre library
- An ingest directory (hostPath by default) for automatic imports
- Optional Istio Gateway API manifests (HTTPS + redirect)

Adjust storage classes, hostnames, and paths to match your cluster.

---

## Prerequisites

- Kubernetes cluster with `kubectl` access
- Namespace (defaults to `media` in several manifests)
- Storage provisioners for RWX volumes (e.g., Longhorn, NFS)
  - Example uses `longhorn-retain` and `nfs-client` storage classes
- Optional: Istio (Gateway API) and cert-manager if using `gateway-istio.yaml`
  - GatewayClass `istio` available
  - A `ClusterIssuer` named `letsencrypt` (or update the annotation)
  - cert-manager installed with Gateway API support to auto-provision certs. See: [cert-manager documentation](https://cert-manager.io/docs/usage/gateway/)
- Optional: DIUN if you want automated image update notifications (annotation is included in the Deployment)

---

## What’s in this folder

- `deployment.yaml`: Runs `crocodilestick/calibre-web-automated:latest` on port `8083` with a single replica and `Recreate` strategy. Mounts:
  - `/config` from PVC `calibre-web-automated-config`
  - `/calibre-library` from PVC `calibre-library-pvc`
  - `/cwa-book-ingest` from a hostPath (edit this to your NAS or use a PVC)
  - Sets `PUID`, `PGID`, and `TZ`. Add any other CWA envs you need.
- `service.yaml`: ClusterIP service exposing port `8083` with selector `app.service=calibre-web-automated`.
- `pvc-config.yaml`: RWX claim for CWA config data. Uses `longhorn-retain` (100Gi) in namespace `media`.
- `pvc-library.yml`: RWX claim for the Calibre library. Uses `nfs-client` (100Gi) in namespace `media`.
- `gateway-istio.yaml` (optional): Gateway + HTTPRoutes using Gateway API. Redirects HTTP→HTTPS and terminates TLS for your hostname via cert-manager.

---

## Quick Start

1) Configure variables and paths
- Edit `deployment.yaml`:
  - Set `TZ` to your timezone and adjust `PUID`/`PGID` to match file ownership on your volumes.
  - Update the ingest `hostPath` (`/nas/path/to/import-ebooks`) to an existing path on cluster nodes (or convert to PVC — see below).
  - Optionally add more environment variables. 
  
- Edit storage classes in `pvc-*` files to match your cluster.

1) Create the namespace

```bash
kubectl create namespace media
```

3) Create PersistentVolumeClaims

```bash
kubectl apply -n media -f pvc-config.yaml -f pvc-library.yml
```

4) Deploy the app and service

```bash
kubectl apply -n media -f deployment.yaml -f service.yaml
```

5) (Optional) Expose via Istio Gateway
- Edit `kubernetes/gateway-istio.yaml`:
  - Set your hostname (e.g., `books.example.com`).
  - Ensure the `cert-manager.io/cluster-issuer` annotation references an issuer that exists (e.g., `letsencrypt`).
  - Set `certificateRefs.name` to the name of a TLS secret that cert-manager will create.
- Apply it:

```bash
kubectl apply -f kubernetes/gateway-istio.yaml
```

6) Access the UI
- Port-forward:

```bash
kubectl -n media port-forward svc/calibre-web-automated 8083:8083
```

  Then open http://localhost:8083

- Or via your Gateway/hostname once DNS and TLS are ready.

---

## Storage and Data

- `/config` (PVC: `calibre-web-automated-config`) holds application configuration and state.
- `/calibre-library` (PVC: `calibre-library-pvc`) holds the Calibre library data.
- `/cwa-book-ingest` is an ingest folder. Files dropped here are imported and then removed after processing. By default this is a `hostPath` you must edit; consider switching to a PVC if you prefer.

Note: If you use the Calibre Web Automated Book Downloader, you can mount the same ingest volume into that downloader so finished downloads are written directly into `/cwa-book-ingest` for automatic import by CWA. Make sure the PVC is Reads Write Many (`RWX`) so it can be mounted by more than one deployment. See the project: [Calibre Web Automated Book Downloader](https://github.com/calibrain/calibre-web-automated-book-downloader).

Example: switch ingest from hostPath to a PVC

```yaml
# Replace the hostPath volume in deployment.yaml with:
volumes:
  - name: calibre-web-automated-ingest
    persistentVolumeClaim:
      claimName: calibre-web-automated-ingest

# And create a matching PVC (adjust storageClassName as needed):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: calibre-web-automated-ingest
  namespace: media
spec:
  accessModes: ["ReadWriteMany"]
  storageClassName: nfs-client
  resources:
    requests:
      storage: 50Gi
```

Note on RWX: Both example PVCs request `ReadWriteMany`. Ensure your storage supports RWX (e.g., Longhorn with share manager, or NFS). If not, use `ReadWriteOnce` or change provisioners accordingly.

---

## Networking

- `service.yaml` creates a ClusterIP on port `8083`.
- For external access you can either:
  - Use `port-forward` for local access/testing,
  - Configure an Ingress/Gateway (example uses Gateway API with Istio), or
  - Change the Service to `NodePort` or `LoadBalancer` if that suits your environment.

### Using the provided Istio Gateway (optional)
- `gateway-istio.yaml` creates:
  - A `Gateway` with HTTP (80) and HTTPS (443) listeners
  - An `HTTPRoute` that redirects HTTP→HTTPS
  - An `HTTPRoute` that routes HTTPS traffic to the `calibre-web-automated` service on port `8083`
- TLS termination: The Gateway references a secret via `certificateRefs`. You typically manage this secret using cert-manager. A minimal Certificate example:

Note: cert-manager must be deployed with Gateway API support enabled so it can watch Gateway/HTTPRoute resources and provision certificates automatically. Docs: https://cert-manager.io/docs/usage/gateway-api/

```yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: calibre-web-automated-cert
  namespace: media
spec:
  secretName: calibre-web-automated-tls  # must match certificateRefs.name
  dnsNames:
    - books.example.com
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt
```

Apply this after cert-manager is installed and your issuer exists.

---

## Scaling and Updates

- The Deployment uses `strategy: Recreate` and `replicas: 1`.
  - Calibre libraries are file-based; concurrent writers risk corruption. Single replica is recommended.
- Image updates:
  - `imagePullPolicy: Always` ensures new tags are pulled on rollout.
  - DIUN annotation (`diun.enable: "true"`) is present if you run DIUN to monitor for updates.

---

## Troubleshooting

- PVC Pending:
  - Confirm your `storageClassName` exists and supports `ReadWriteMany`.
  - Change to an available class or adjust access modes.
- Permission denied / read-only:
  - Ensure `PUID`/`PGID` match ownership of files on the backing storage.
  - For NFS, verify export permissions (e.g., `no_root_squash` if needed).
- Pod CrashLoopBackOff:
  - `kubectl -n media logs deploy/calibre-web-automated` to inspect errors.
- Gateway returns 404:
  - Verify hostname matches the request and `HTTPRoute` `parentRefs` section names.
  - Check the `GatewayClass` exists and is `Accepted` by Istio.
- TLS not provisioning:
  - Ensure cert-manager is installed, issuer/ClusterIssuer exists, and a `Certificate` resource was created pointing to your DNS name.
- Ingest not working / files not removed:
  - Confirm the ingest volume path is correct and writable; check CWA settings in the UI.

---

## Uninstall

Delete resources (PVCs may retain data depending on your storage policy):

```bash
kubectl delete -n media -f service.yaml -f deployment.yaml
kubectl delete -n media -f pvc-config.yaml -f pvc-library.yml
# If used:
kubectl delete -f gateway-istio.yaml
```

If your storage class uses a Retain policy, delete PVs or underlying data as appropriate.

---

## Notes and Recommendations

- Replace `hostPath` for ingest with a PVC or CSI-backed volume when possible; `hostPath` ties you to a node path.
- Keep replicas at 1 unless you fully understand the implications for Calibre’s file-based library.
- Consider resource requests/limits in `deployment.yaml` for more predictable scheduling.
- Back up `/config` and your library regularly.