https://github.com/hashmap-kz/katomik
❄️Atomic apply of multiple Kubernetes manifests with rollback on failure.
https://github.com/hashmap-kz/katomik
cicd devops golang kubectl kubernetes
Last synced: about 2 months ago
JSON representation
❄️Atomic apply of multiple Kubernetes manifests with rollback on failure.
- Host: GitHub
- URL: https://github.com/hashmap-kz/katomik
- Owner: hashmap-kz
- License: apache-2.0
- Created: 2025-06-21T06:32:39.000Z (12 months ago)
- Default Branch: master
- Last Pushed: 2026-04-20T05:38:12.000Z (2 months ago)
- Last Synced: 2026-04-20T07:30:58.396Z (2 months ago)
- Topics: cicd, devops, golang, kubectl, kubernetes
- Language: Go
- Homepage:
- Size: 264 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# katomik (WIP)
`katomik` - Atomic Apply for Kubernetes Manifests with Rollback Support.
Applies multiple Kubernetes manifests with **all-or-nothing** guarantees. Like `kubectl apply -f`, but transactional:
if any resource fails to apply or become ready, all previously applied resources are rolled back automatically.
---
## Features
* **Atomic behavior**: Applies multiple manifests as a unit. If anything fails, restores the original state.
* **Server-Side Apply** (SSA): Uses `PATCH` with SSA to minimize conflicts and preserve intent.
* **Status tracking**: Waits for all resources to become `Current` (Ready/Available) before succeeding.
* **Rollback support**: Automatically restores previous state if apply or wait fails.
* **Recursive**: Like `kubectl`, supports directories and `-R` for recursive traversal.
* **STDIN support**: Use `-f -` to read from `stdin`.

---
## Installation
### Manual Installation
1. Download the latest binary for your platform from
the [Releases page](https://github.com/hashmap-kz/katomik/releases).
2. Place the binary in your system's `PATH` (e.g., `/usr/local/bin`).
### Installation script
```bash
(
set -euo pipefail
OS="$(uname | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')"
TAG="$(curl -s https://api.github.com/repos/hashmap-kz/katomik/releases/latest | jq -r .tag_name)"
curl -L "https://github.com/hashmap-kz/katomik/releases/download/${TAG}/katomik_${TAG}_${OS}_${ARCH}.tar.gz" |
tar -xzf - -C /usr/local/bin && \
chmod +x /usr/local/bin/katomik
)
```
### Homebrew installation
```bash
brew tap hashmap-kz/homebrew-tap
brew install katomik
```
---
## Usage
```bash
# Apply multiple files atomically
katomik apply -f manifests/
# Read from stdin
katomik apply -f - < all.yaml
# Apply recursively
katomik apply -R -f ./deploy/
# Set a custom timeout (default: 5m)
katomik apply --timeout 2m -f ./manifests/
# Process and apply a manifest located on a remote server
katomik apply \
-f https://raw.githubusercontent.com/user/repo/refs/heads/master/manifests/deployment.yaml
```
---
## Example Output
```
# katomik apply -f test/integration/k8s/manifests/
┌───────────────────────────────────────┬──────────────┐
│ RESOURCE │ NAMESPACE │
├───────────────────────────────────────┼──────────────┤
│ Namespace/katomik-test │ (cluster) │
│ ConfigMap/postgresql-init-script │ katomik-test │
│ ConfigMap/postgresql-envs │ katomik-test │
│ ConfigMap/postgresql-conf │ katomik-test │
│ Service/postgres │ katomik-test │
│ PersistentVolumeClaim/postgres-data │ katomik-test │
│ StatefulSet/postgres │ katomik-test │
│ ConfigMap/prometheus-config │ katomik-test │
│ PersistentVolumeClaim/prometheus-data │ katomik-test │
│ Service/prometheus │ katomik-test │
│ StatefulSet/prometheus │ katomik-test │
│ PersistentVolumeClaim/grafana-data │ katomik-test │
│ Service/grafana │ katomik-test │
│ ConfigMap/grafana-datasources │ katomik-test │
│ Deployment/grafana │ katomik-test │
└───────────────────────────────────────┴──────────────┘
+ watching
| Service/grafana katomik-test Unknown
| Deployment/grafana katomik-test Unknown
| StatefulSet/postgres katomik-test InProgress
| StatefulSet/prometheus katomik-test InProgress
+ watching
✓ Success
```
---
## Quick Start
```
cd test/integration/k8s
bash 00-setup-kind.sh
katomik apply -f manifests/
```
---
## 🔒 Rollback Guarantees
On failure (bad manifest, missing dependency, timeout, etc.):
* Existing objects are reverted to their exact pre-apply state.
* New objects are deleted.
This guarantees your cluster remains consistent - no partial updates.
---
## Flags
| Flag | Description |
|-------------|-----------------------------------|
| `-f` | File, directory, or `-` for stdin |
| `-R` | Recurse into directories |
| `--timeout` | Timeout to wait for readiness |
---
## License
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
---
## Feedback
Have a feature request or issue? Feel free to [open an issue](https://github.com/hashmap-kz/katomik/issues)
or submit a PR!