{"id":15529129,"url":"https://github.com/kazk/cnat-rs","last_synced_at":"2026-05-18T15:09:03.739Z","repository":{"id":43746203,"uuid":"322204501","full_name":"kazk/cnat-rs","owner":"kazk","description":"Cloud Native At. Example from \"Programming Kubernetes\" book in Rust.","archived":false,"fork":false,"pushed_at":"2022-02-20T09:40:30.000Z","size":120,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-12T11:49:59.673Z","etag":null,"topics":["example","kube","kubernetes","kubernetes-controller","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kazk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-17T06:40:29.000Z","updated_at":"2023-02-07T10:38:31.000Z","dependencies_parsed_at":"2022-08-21T21:00:39.364Z","dependency_job_id":null,"html_url":"https://github.com/kazk/cnat-rs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kazk/cnat-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kazk%2Fcnat-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kazk%2Fcnat-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kazk%2Fcnat-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kazk%2Fcnat-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kazk","download_url":"https://codeload.github.com/kazk/cnat-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kazk%2Fcnat-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33181873,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["example","kube","kubernetes","kubernetes-controller","rust"],"created_at":"2024-10-02T11:16:35.629Z","updated_at":"2026-05-18T15:09:03.713Z","avatar_url":"https://github.com/kazk.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cnat\n\nCloud Native [`at`], runs `command` at `schedule` by creating a Pod.\n\n```yaml\napiVersion: example.kazk.dev/v1alpha1\nkind: At\nmetadata:\n  name: example\nspec:\n  schedule: \"2020-12-17T19:21:00Z\"\n  command: [echo, \"will be executed\"]\n```\n\nExample Kubernetes controller [programming-kubernetes/cnat] in Rust using [kube].\n\n## Changes\n\n- Changed `command` to an array\n- Removed `Pending` from `status.phase`. `None` -\u003e `Running` -\u003e `Done`\n- Changed to use `apiextensions.k8s.io/v1` and added the required `schema`\n  - The schema is generated by `kube` ([clux/kube-rs#348])\n  - `schedule` is validated as `date-time`\n\n\u003cdetails\u003e\n\u003csummary\u003eGenerated CRD\u003c/summary\u003e\n\n```yaml\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n  name: ats.example.kazk.dev\nspec:\n  group: example.kazk.dev\n  names:\n    kind: At\n    plural: ats\n    shortNames: []\n    singular: at\n  scope: Namespaced\n  versions:\n    - additionalPrinterColumns: []\n      name: v1alpha1\n      schema:\n        openAPIV3Schema:\n          description: \"Auto-generated derived type for AtSpec via `CustomResource`\"\n          properties:\n            spec:\n              description: Spec for custom resource At.\n              properties:\n                command:\n                  items:\n                    type: string\n                  type: array\n                schedule:\n                  format: date-time\n                  type: string\n              required:\n                - command\n                - schedule\n              type: object\n            status:\n              description: Status for custom resource At.\n              nullable: true\n              properties:\n                phase:\n                  description: Describes the status of the scheduled command.\n                  enum:\n                    - Running\n                    - Done\n                  type: string\n              required:\n                - phase\n              type: object\n          required:\n            - spec\n          title: At\n          type: object\n      served: true\n      storage: true\n      subresources:\n        status: {}\n```\n\n\u003c/details\u003e\n\n## Project Structure\n\n```text\n.\n├── k8s/               CRD and example\n└── src/\n    ├── bin/           Binaries\n    │   ├── cnat.rs    - Run controller (default-run)\n    │   └── crd.rs     - Output CRD YAML\n    ├── controller.rs  Implements the Controller\n    ├── lib.rs\n    └── resource.rs    Defines the Custom Resource\n```\n\n### Commands\n\n- `cargo run`: Run controller\n- `cargo run --bin crd`: Output CRD\n## Running\n\n### Locally\n\n```bash\n# Create CRD\nkubectl apply -f k8s/ats.yml\nkubectl wait --for=condition=NamesAccepted crd/ats.example.kazk.dev\n\n# Start controller\ncargo run\n\n# Create At resource example\nkubectl apply -f k8s/example.yml\n```\n\n### Inside\n\n```bash\n# Set up service account\nkubectl apply -f k8s/rbac.yml\n\n# Create CRD\nkubectl apply -f k8s/ats.yml\nkubectl wait --for=condition=NamesAccepted crd/ats.example.kazk.dev\n\n# Deploy controller\nkubectl apply -f k8s/deployment.yml\n\n# Create At resource example\nkubectl apply -f k8s/example.yml\n```\n## Comparisons\n\n### Binary Size\n\nBuilding on Arch Linux:\n\n- `client-go`: 31MB (23MB with `-ldflags \"-s -w\"`)\n- `kubebuilder`: TBD requires unknown version of [KubeBuilder]\n- `operator-sdk`: TBD requires unknown version of [Operator SDK]\n- `kube`: 8.3MB (5.8MB with `RUSTFLAGS='-C link-arg=-s'`)\n\n### Lines of Code\n\n|   Library     |  Files   |  Lines  |   Code  |  Comments |  Blanks |\n| :-----------: | -------: | ------: | ------: | --------: | ------: | \n| client-go     |    29    |   2161  |   1212  |       658 |     291 |\n| kubebuilder   |    16    |   1013  |    529  |       357 |     127 |\n| operator-sdk  |    13    |    714  |    488  |       134 |      92 |\n| kube          |     5    |    257  |    217  |        15 |      25 |\n\n\n- `client-go`: `tokei -e cnat-client-go/vendor -e cnat-client-go/hack -t Go cnat-client-go`\n- `kubebuilder`: `tokei -e cnat-kubebuilder/vendor -e cnat-kubebuilder/hack -t Go cnat-kubebuilder`\n- `operator-sdk`: `tokei -e cnat-operator/vendor -t Go cnat-operator`\n- `kube`: `tokei -t Rust`\n\n### Project Setup and Dependencies\n\n- `client-go`: Go modules works fine (3 core modules + 1 code geerator + 1 logger). Versioning has improved since [programming-kubernetes/cnat] was written. A lot of generated code.\n- `kubebuilder`: Requires [KubeBuilder] tool. Build failed with `GOPATH` not defined. Uses [dep].\n- `operator-sdk`: Requires [Operator SDK] tool. Haven't tried. Uses [dep].\n- `kube`: Standard Rust project. No separate codegen and very straightforward. CRD v1 schema is generated from the spec struct [clux/kube-rs#348] :)\n\n## References\n\n- [ConfigMapGenerator example](https://github.com/clux/kube-rs/blob/f49fcc4b64ca53091efe15f570e38c6ab3789567/examples/configmapgen_controller.rs)\n- [at_controller.go](https://github.com/programming-kubernetes/cnat/blob/27f8ddba657b803ffb10501a28e003d0febd6387/cnat-kubebuilder/pkg/controller/at/at_controller.go)\n- [h2oai/h2o-kubernetes](https://github.com/h2oai/h2o-kubernetes)\n\n\n[`at`]: https://en.wikipedia.org/wiki/At_(command)\n[programming-kubernetes/cnat]: https://github.com/programming-kubernetes/cnat\n[KubeBuilder]: https://book.kubebuilder.io/quick-start.html\n[Operator SDK]: https://github.com/operator-framework/operator-sdk\n[kube]: https://github.com/clux/kube-rs\n[clux/kube-rs#348]: https://github.com/clux/kube-rs/pull/348\n[dep]: https://github.com/golang/dep\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkazk%2Fcnat-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkazk%2Fcnat-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkazk%2Fcnat-rs/lists"}