Skip to content

Commit 101d7ed

Browse files
miguelgilaclaude
andauthored
feat: ReaperPod CRD, reaper-controller, and Helm chart (#31)
* feat(controller): add ReaperPod CRD and reaper-controller binary Introduce a ReaperPod custom resource that provides a simplified, Reaper-native way to run workloads. A new reaper-controller binary watches ReaperPod resources and creates real Pods with runtimeClassName pre-configured, translating the simplified spec (inline volumes, dnsMode, overlayName) into full Pod specs with owner references. - CRD types with own simple structs (avoids k8s-openapi schemars dep) - Pod builder with 9 unit tests covering all field translations - Reconciler using kube::runtime::Controller with owns() for Pod watches - Deployment manifests, Dockerfile, build/generate scripts - Example YAMLs (simple-task, with-volumes, with-node-selector) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test(controller): add Kind integration tests for ReaperPod CRD Phase 4b tests: CRD installation, controller deployment, ReaperPod creation with Pod verification, status mirroring, exit code propagation, annotation translation, kubectl column output, and GC on delete. Also updates build-controller-image.sh to match agent build pattern (--cluster-name, --skip-build, --quiet) and wires controller image build into phase_setup. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update CRD plan — all 10 steps complete Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(test): add --crd-only flag for fast CRD controller test iteration Skips cargo tests, integration tests, and agent tests — runs only Phase 4b controller tests (CRD install, ReaperPod lifecycle, status mirroring, annotation translation, GC). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(test): ensure reaper-system namespace exists for --crd-only runs The controller deployment targets the reaper-system namespace, which is normally created during agent setup. When running with --crd-only, agent setup is skipped, causing "namespace not found" errors. Create the namespace idempotently before applying the controller manifest. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update examples and docs for CRD controller tests - CLAUDE.md: add controller binary, CRD types, scripts, and example 09 to project structure; document Phase 4b in integration test phases - TESTING.md: add --crd-only and --agent-only flags; add Phase 4b controller tests; add CRD iteration example - examples/README.md: add 09-reaperpod section with usage instructions - examples/09-reaperpod/simple-task.yaml: add namespace prerequisite - docs/CRD_PLAN.md: note namespace fix for --crd-only runs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(playground): add --with-controller flag for ReaperPod CRD setup Installs the ReaperPod CRD, builds and loads the controller image into Kind, and deploys the reaper-controller. Adds CRD usage examples to the playground summary output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(playground): make CRD and controller setup the default The ReaperPod CRD and reaper-controller are now installed by default when setting up a playground cluster. Remove the --with-controller flag since this is the standard mode of operation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(playground): add --context to all kubectl examples in summary Use --context=kind-<cluster-name> in all example commands so they work correctly when multiple Kind clusters are running. Also add an inline ReaperPod one-liner example. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(controller): use fixed Pod name matching ReaperPod name Replace generateName with a fixed name so the Pod created by the controller has the same name as the ReaperPod. This enables `kubectl logs <reaperpod-name>` to work directly without needing to look up the Pod name from the ReaperPod status. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(helm): replace Ansible with Helm chart for installation Add a Helm chart (deploy/helm/reaper/) that installs everything needed to run Reaper: node DaemonSet with init container for binary installation, controller Deployment, CRDs, RuntimeClass, and RBAC. - Add Dockerfile.node and scripts/install-node.sh for init container - Add scripts/build-node-image.sh for Kind image builds - Rewrite setup-playground.sh to use Helm instead of Ansible - Update test-phases.sh to use Helm-based setup - Make CRD/controller tests idempotent (work with Helm or standalone) - Mark Ansible deployment as DEPRECATED (kept but no longer default) - Update README.md and CLAUDE.md to reflect Helm as default All 8 CRD integration tests pass with the new Helm-based flow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: update all references from Ansible to Helm Update TESTING.md, RELEASING.md, and deploy/kubernetes/README.md to reflect Helm as the default installation method. Mark Ansible references as deprecated throughout. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: remove playground-release job (--release flag removed) setup-playground.sh no longer supports --release (Helm handles installation). Remove the CI job that tested release resolution modes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: build reaper-controller in CI, replace Ansible with Helm - Add --features controller --bin reaper-controller to musl build step - Include reaper-controller in uploaded artifacts - Replace 'Install Ansible' step with 'Install Helm' for kind-integration The controller binary was missing from CI artifacts, causing build-controller-image.sh --skip-build to fail in kind-integration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(test): replace yield_now with 50ms sleep to avoid ETXTBSY flake yield_now() is insufficient under CI load — the kernel may still hold the inode after chmod. A small sleep reliably avoids the ETXTBSY race when exec'ing a freshly-written shell script. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: increase kind-integration timeout from 20 to 30 minutes With CRD controller tests (Phase 4b) added on top of agent GC tests (some taking 90-120s each), 20 minutes is too tight. Increase to 30 minutes to give the full suite room to complete. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: add CI test runtime optimization to TODO Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: retrigger CI pipeline --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7f41346 commit 101d7ed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3255
-258
lines changed

.github/workflows/ci.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ jobs:
9595
-v ${{ github.workspace }}:/work \
9696
-w /work \
9797
messense/rust-musl-cross:x86_64-musl \
98-
cargo build --release --features agent \
98+
cargo build --release --features agent,controller \
9999
--bin containerd-shim-reaper-v2 \
100100
--bin reaper-runtime \
101101
--bin reaper-agent \
102+
--bin reaper-controller \
102103
--target x86_64-unknown-linux-musl
103104
- uses: actions/upload-artifact@v4
104105
with:
@@ -107,6 +108,7 @@ jobs:
107108
target/x86_64-unknown-linux-musl/release/containerd-shim-reaper-v2
108109
target/x86_64-unknown-linux-musl/release/reaper-runtime
109110
target/x86_64-unknown-linux-musl/release/reaper-agent
111+
target/x86_64-unknown-linux-musl/release/reaper-controller
110112
retention-days: 1
111113

112114
kind-integration:
@@ -136,13 +138,15 @@ jobs:
136138
chmod +x ./kind
137139
sudo mv ./kind /usr/local/bin/kind
138140
139-
- name: Install Ansible
140-
run: pip install ansible
141+
- name: Install Helm
142+
uses: azure/setup-helm@v4
143+
with:
144+
version: "v3.14.0"
141145

142146
- name: Run integration tests
143147
uses: nick-fields/retry@v3
144148
with:
145-
timeout_minutes: 20
149+
timeout_minutes: 30
146150
max_attempts: 2
147151
command: ./scripts/run-integration-tests.sh --skip-cargo
148152

@@ -155,10 +159,6 @@ jobs:
155159
path: /tmp/reaper-integration-logs/
156160
retention-days: 7
157161

158-
playground-release:
159-
name: Playground Release Tests
160-
runs-on: ubuntu-latest
161-
steps:
162-
- uses: actions/checkout@v4
163-
- name: Test --release resolution modes
164-
run: ./scripts/test-playground-release.sh
162+
# playground-release job removed: setup-playground.sh now uses Helm
163+
# instead of --release flag. The release-utils.sh library is retained
164+
# for the deprecated install-reaper.sh script.

CLAUDE.md

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,18 @@ reaper/
190190
├── src/
191191
│ ├── config.rs # Shared config file loader (/etc/reaper/reaper.conf)
192192
│ ├── annotations.rs # Shared pod annotation parsing and validation
193+
│ ├── crds/ # ReaperPod CRD types (feature-gated: controller)
193194
│ └── bin/
194195
│ ├── containerd-shim-reaper-v2/
195196
│ │ └── main.rs # Shim implementation (ttrpc server, Task trait)
196-
│ └── reaper-runtime/
197-
│ ├── main.rs # OCI runtime CLI (fork-first architecture)
198-
│ ├── state.rs # State persistence (/run/reaper/<id>/)
199-
│ └── overlay.rs # Overlay filesystem (Linux-only)
197+
│ ├── reaper-controller/ # CRD controller binary
198+
│ │ ├── main.rs # Entry point, CRD watcher setup
199+
│ │ ├── reconciler.rs # ReaperPod → Pod reconciliation
200+
│ │ └── pod_builder.rs # ReaperPod spec → Pod spec translation
201+
│ └── reaper-runtime/
202+
│ ├── main.rs # OCI runtime CLI (fork-first architecture)
203+
│ ├── state.rs # State persistence (/run/reaper/<id>/)
204+
│ └── overlay.rs # Overlay filesystem (Linux-only)
200205
├── tests/ # Integration tests
201206
│ ├── integration_basic_binary.rs
202207
│ ├── integration_io.rs # FIFO stdout/stderr
@@ -213,15 +218,28 @@ reaper/
213218
│ ├── 05-kubemix/ # Jobs, DaemonSets, and Deployments on 10-node cluster
214219
│ ├── 06-ansible-jobs/ # Sequential Jobs: install Ansible, then run playbook
215220
│ ├── 07-ansible-complex/ # DaemonSet bootstrap + role-based Ansible playbooks
216-
│ └── 08-mix-container-runtime-engines/ # Mixed runtimes: OpenLDAP (default) + SSSD (Reaper)
221+
│ ├── 08-mix-container-runtime-engines/ # Mixed runtimes: OpenLDAP (default) + SSSD (Reaper)
222+
│ └── 09-reaperpod/ # ReaperPod CRD: simplified Reaper-native workloads
217223
├── scripts/
218-
│ ├── run-integration-tests.sh # Full integration test suite
219-
│ └── install-reaper.sh # Installation script (Ansible wrapper)
224+
│ ├── run-integration-tests.sh # Full integration test suite
225+
│ ├── install-reaper.sh # Installation script (Ansible, DEPRECATED)
226+
│ ├── build-node-image.sh # Build node installer image for Kind
227+
│ ├── build-controller-image.sh # Build controller Docker image for Kind
228+
│ ├── install-node.sh # Init container script for node DaemonSet
229+
│ └── generate-crds.sh # Generate CRD YAML from Rust types
220230
├── deploy/
221-
│ ├── ansible/
222-
│ │ └── install-reaper.yml # Deployment playbook
231+
│ ├── helm/reaper/ # Helm chart (recommended installation)
232+
│ │ ├── Chart.yaml
233+
│ │ ├── values.yaml
234+
│ │ ├── crds/ # CRD definitions
235+
│ │ └── templates/ # DaemonSet, Controller, RBAC, RuntimeClass
236+
│ ├── ansible/ # DEPRECATED — use Helm chart instead
237+
│ │ └── install-reaper.yml
223238
│ └── kubernetes/
224-
│ └── runtimeclass.yaml # RuntimeClass definition
239+
│ ├── runtimeclass.yaml
240+
│ ├── reaper-controller.yaml
241+
│ └── crds/
242+
│ └── reaperpods.reaper.io.yaml
225243
└── docs/
226244
├── SHIMV2_DESIGN.md # Shim v2 protocol implementation
227245
├── SHIM_ARCHITECTURE.md # Architecture deep-dive
@@ -259,12 +277,13 @@ reaper/
259277
260278
Key environment variables:
261279
- `CI`: Set by GitHub Actions automatically. Enables CI-specific behavior.
262-
- `REAPER_BINARY_DIR`: Override the binary directory location for Ansible installer.
280+
- `REAPER_BINARY_DIR`: Override the binary directory location (legacy Ansible installer).
263281
264282
Files involved:
265-
- [scripts/run-integration-tests.sh](scripts/run-integration-tests.sh): Detects CI mode and sets `REAPER_BINARY_DIR`
266-
- [scripts/install-reaper.sh](scripts/install-reaper.sh): Accepts `REAPER_BINARY_DIR` and passes it to Ansible
267-
- [deploy/ansible/install-reaper.yml](deploy/ansible/install-reaper.yml): Uses `local_binary_dir` variable (set from `REAPER_BINARY_DIR`)
283+
- [scripts/setup-playground.sh](scripts/setup-playground.sh): Creates Kind cluster and installs via Helm
284+
- [scripts/build-node-image.sh](scripts/build-node-image.sh): Builds reaper-node installer image for Kind
285+
- [scripts/build-controller-image.sh](scripts/build-controller-image.sh): Builds reaper-controller image for Kind
286+
- [deploy/helm/reaper/](deploy/helm/reaper/): Helm chart (DaemonSet, Controller, CRD, RuntimeClass)
268287
269288
### Building Binaries for Integration Tests
270289
@@ -287,14 +306,15 @@ See [MEMORY.md](.claude/projects/-Users-miguelgi-Documents-CODE-Explorations-rea
287306

288307
## Integration Test Structure
289308

290-
The integration test suite ([scripts/run-integration-tests.sh](scripts/run-integration-tests.sh)) has four phases:
309+
The integration test suite ([scripts/run-integration-tests.sh](scripts/run-integration-tests.sh)) has five phases:
291310

292311
1. **Phase 1**: Rust cargo tests (unit and integration tests)
293-
2. **Phase 2**: Infrastructure setup (Kind cluster, build binaries, install Reaper via Ansible)
312+
2. **Phase 2**: Infrastructure setup (Kind cluster, build images, install Reaper via Helm)
294313
3. **Phase 3**: Kubernetes readiness checks (API server, RuntimeClass, ServiceAccount)
295314
4. **Phase 4**: Integration tests (DNS, overlay, process cleanup, exec support, etc.)
315+
5. **Phase 4b**: Controller tests (ReaperPod CRD lifecycle, status mirroring, exit codes, annotations, GC)
296316

297-
All tests must pass for the suite to succeed.
317+
Use `--crd-only` or `--agent-only` to run subsets. All tests must pass for the suite to succeed.
298318

299319
## Development Workflow
300320

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ axum = { version = "0.8", optional = true }
3131
futures = { version = "0.3", optional = true }
3232
chrono = { version = "0.4", optional = true }
3333

34+
# reaper-controller dependencies
35+
schemars = { version = "0.8", optional = true }
36+
3437
[features]
3538
agent = ["kube", "k8s-openapi", "prometheus-client", "axum", "futures", "chrono"]
39+
controller = ["kube", "k8s-openapi", "schemars", "futures", "chrono"]
3640

3741
[dev-dependencies]
3842
tempfile = "3"
@@ -51,6 +55,11 @@ name = "reaper-agent"
5155
path = "src/bin/reaper-agent/main.rs"
5256
required-features = ["agent"]
5357

58+
[[bin]]
59+
name = "reaper-controller"
60+
path = "src/bin/reaper-controller/main.rs"
61+
required-features = ["controller"]
62+
5463
[lints.rust]
5564
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }
5665

Dockerfile.controller

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## Build stage: cross-compile static musl binary
2+
ARG RUST_TARGET=x86_64-unknown-linux-musl
3+
ARG MUSL_IMAGE=x86_64-musl
4+
5+
FROM messense/rust-musl-cross:${MUSL_IMAGE} AS builder
6+
ARG RUST_TARGET
7+
8+
WORKDIR /work
9+
COPY . .
10+
11+
# Set build metadata
12+
RUN export GIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") && \
13+
export BUILD_DATE=$(date -u '+%Y-%m-%d') && \
14+
cargo build --release --features controller --bin reaper-controller --target "${RUST_TARGET}"
15+
16+
RUN cp target/${RUST_TARGET}/release/reaper-controller /reaper-controller
17+
18+
## Runtime stage: distroless static (no shell, no libc needed for musl)
19+
FROM gcr.io/distroless/static-debian12:nonroot
20+
21+
COPY --from=builder /reaper-controller /usr/local/bin/reaper-controller
22+
23+
USER nonroot:nonroot
24+
25+
ENTRYPOINT ["/usr/local/bin/reaper-controller"]

Dockerfile.node

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Multi-stage build for reaper-node installer image.
2+
# Contains containerd-shim-reaper-v2, reaper-runtime, and an install script.
3+
# Used as an init container in the Helm chart's DaemonSet to install
4+
# Reaper binaries onto cluster nodes.
5+
6+
# --- Builder stage (amd64) ---
7+
FROM messense/rust-musl-cross:x86_64-musl AS builder-amd64
8+
WORKDIR /work
9+
COPY . .
10+
RUN cargo build --release \
11+
--bin containerd-shim-reaper-v2 \
12+
--bin reaper-runtime \
13+
--target x86_64-unknown-linux-musl
14+
15+
# --- Builder stage (arm64) ---
16+
FROM messense/rust-musl-cross:aarch64-musl AS builder-arm64
17+
WORKDIR /work
18+
COPY . .
19+
RUN cargo build --release \
20+
--bin containerd-shim-reaper-v2 \
21+
--bin reaper-runtime \
22+
--target aarch64-unknown-linux-musl
23+
24+
# --- Runtime stage ---
25+
FROM alpine:3.19
26+
27+
ARG TARGETARCH=amd64
28+
29+
# Copy both architectures, select based on TARGETARCH
30+
COPY --from=builder-amd64 /work/target/x86_64-unknown-linux-musl/release/containerd-shim-reaper-v2 /binaries/amd64/containerd-shim-reaper-v2
31+
COPY --from=builder-amd64 /work/target/x86_64-unknown-linux-musl/release/reaper-runtime /binaries/amd64/reaper-runtime
32+
COPY --from=builder-arm64 /work/target/aarch64-unknown-linux-musl/release/containerd-shim-reaper-v2 /binaries/arm64/containerd-shim-reaper-v2
33+
COPY --from=builder-arm64 /work/target/aarch64-unknown-linux-musl/release/reaper-runtime /binaries/arm64/reaper-runtime
34+
35+
COPY scripts/install-node.sh /install.sh
36+
RUN chmod +x /install.sh
37+
38+
ENTRYPOINT ["/install.sh"]

README.md

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,15 @@ Reaper is a containerd shim that runs processes directly on the host system whil
3939

4040
### Playground (try it locally)
4141

42-
Spin up a 3-node Kind cluster with Reaper pre-installed. No Rust toolchain needed.
43-
44-
**Quickest way** — download pre-built binaries from the latest [GitHub Release](https://github.com/miguelgila/reaper/releases):
45-
46-
```bash
47-
# Prerequisites: Docker, kind, kubectl, ansible (pip install ansible)
48-
./scripts/setup-playground.sh --release
49-
```
50-
51-
**Build from source** — compiles inside Docker (still no local Rust needed):
42+
Spin up a 3-node Kind cluster with Reaper pre-installed. Compiles inside Docker — no local Rust toolchain needed.
5243

5344
```bash
45+
# Prerequisites: Docker, kind, kubectl, helm
5446
./scripts/setup-playground.sh
5547
```
5648

57-
Both create a Kind cluster with 1 control-plane + 2 worker nodes, install the
58-
runtime on all nodes, and run a smoke test. Once ready, try:
49+
This creates a Kind cluster with 1 control-plane + 2 worker nodes, installs
50+
Reaper via Helm (node DaemonSet + controller + CRDs + RuntimeClass), and runs a smoke test. Once ready, try:
5951

6052
```bash
6153
kubectl run hello --rm -it --image=busybox --restart=Never \
@@ -91,25 +83,16 @@ docker run --rm -v "$(pwd)":/work -w /work \
9183

9284
### 1. Install Reaper on a Kubernetes Cluster
9385

94-
**For Kind clusters (testing/CI):**
86+
**Via Helm (recommended):**
9587
```bash
96-
# Install Ansible if not already installed
97-
pip install ansible # or: brew install ansible
98-
99-
# Install to Kind cluster
100-
./scripts/install-reaper.sh --kind <cluster-name>
88+
helm upgrade --install reaper deploy/helm/reaper/ \
89+
--namespace reaper-system --create-namespace \
90+
--wait --timeout 120s
10191
```
10292

103-
**For production clusters:**
104-
```bash
105-
# Create inventory file (see deploy/ansible/inventory.ini.example)
106-
vim inventory.ini
107-
108-
# Install via Ansible
109-
ansible-playbook -i inventory.ini deploy/ansible/install-reaper.yml
110-
```
93+
This installs the node DaemonSet (binary installer), CRD, controller, RuntimeClass, and RBAC — everything needed to run Reaper workloads.
11194

112-
See [deploy/kubernetes/README.md](deploy/kubernetes/README.md) for detailed installation instructions.
95+
See [deploy/helm/reaper/](deploy/helm/reaper/) for chart values and configuration.
11396

11497
### 2. Run a Command on the Host
11598

@@ -284,7 +267,7 @@ The [examples/](examples/) directory contains runnable demos, each with a `setup
284267
- [Docker](https://docs.docker.com/get-docker/)
285268
- [kind](https://kind.sigs.k8s.io/) (Kubernetes in Docker)
286269
- [kubectl](https://kubernetes.io/docs/tasks/tools/)
287-
- [Ansible](https://docs.ansible.com/ansible/latest/installation_guide/) (`pip install ansible`)
270+
- [Helm](https://helm.sh/docs/intro/install/)
288271

289272
**Local development (building from source natively):**
290273
- All of the above, plus [Rust](https://www.rust-lang.org/tools/install) (toolchain version pinned in `rust-toolchain.toml`)
@@ -305,7 +288,7 @@ cargo test
305288

306289
## Configuration
307290

308-
Reaper reads configuration from `/etc/reaper/reaper.conf` on each node. The Ansible installer creates this file automatically. Environment variables of the same name override file values.
291+
Reaper reads configuration from `/etc/reaper/reaper.conf` on each node. The Helm chart creates this file automatically via the node DaemonSet init container. Environment variables of the same name override file values.
309292

310293
```ini
311294
# /etc/reaper/reaper.conf

deploy/ansible/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Ansible Playbooks for Reaper Runtime
22

3+
> **DEPRECATED**: Ansible-based installation is deprecated in favor of the **Helm chart** (`deploy/helm/reaper/`).
4+
> The Helm chart handles binary installation via DaemonSet init containers, CRD installation, controller deployment,
5+
> and RuntimeClass creation — all in a single `helm install`. See the [Helm chart README](../helm/reaper/README.md).
6+
>
7+
> These playbooks remain available for legacy workflows but are no longer actively tested in CI.
8+
39
This directory contains Ansible playbooks for deploying and managing Reaper runtime on Kubernetes cluster nodes.
410

511
## Overview

deploy/helm/reaper/Chart.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: v2
2+
name: reaper
3+
description: Reaper — lightweight Kubernetes runtime for direct host execution
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.2.10"
7+
keywords:
8+
- kubernetes
9+
- runtime
10+
- containerd
11+
- host-execution
12+
home: https://github.com/miguelgila/reaper
13+
sources:
14+
- https://github.com/miguelgila/reaper
15+
maintainers:
16+
- name: Miguel Gil Álvarez

0 commit comments

Comments
 (0)