F# microservice template for Kubernetes
Last updated Dec 21, 2022
14
Stars
1
Forks
1
Issues
0
Stars/day
Attention Score
1
Language breakdown
F# 55.4%
HTML 20.5%
Shell 10.3%
Smarty 7.4%
Dockerfile 3.2%
Makefile 3.2%
▸ Files
click to expand
README
fodinfo
fodinfo is a tiny web application made with Go F# that showcases best practices of running microservices in Kubernetes. fodinfo is a F# port of the great work of @stefanprodan in https://github.com/stefanprodan/podinfo to F#.
Why?
Im using this as a project to learn F# and potentially create a usefull template for F# project.
Stack
Specifications:
- [x] Health checks (readiness and liveness)
- [ ] Instrumented with Prometheus (In Progress)
- [ ] 12-factor app (In Progress)
- [ ] File watcher for secrets and configmaps
- [ ] Tracing with Istio and Jaeger
- [ ] Linkerd service profile
- [x] Structured logging
- [ ] Fault injection (random errors and latency)
- [ ] Swagger docs
- [ ] Helm and Kustomize installers
- [ ] End-to-End testing with Kubernetes Kind and Helm
- [ ] Kustomize testing with GitHub Actions and Open Policy Agent
- [ ] Multi-arch container image with Docker buildx and Github Actions
- [ ] CVE scanning with trivy
- [ ] Graceful shutdown on interrupt signals
Web API:
- [ ]
GET /prints runtime information - [x]
GET /versionprints fodinfo version and git commit hash - [x]
GET /metricsreturn HTTP requests duration and Go runtime metrics - [x]
GET /healthzused by Kubernetes liveness probe - [x]
GET /readyzused by Kubernetes readiness probe - [x]
POST /readyz/enablesignals the Kubernetes LB that this instance is ready to receive traffic - [x]
POST /readyz/disablesignals the Kubernetes LB to stop sending requests to this instance - [x]
GET /status/{code}returns the status code - [x]
GET /paniccrashes the process with exit code 255 - [x]
POST /echoforwards the call to the backend service and echos the posted content - [x]
GET /envreturns the environment variables as a JSON array - [x]
GET /headersreturns a JSON with the request HTTP headers - [x]
GET /delay/{seconds}waits for the specified period - [ ]
POST /tokenissues a JWT token valid for one minuteJWT=$(curl -sd 'anon' fodinfo:5000/token | jq -r .token) - [ ]
GET /token/validatevalidates the JWT tokencurl -H "Authorization: Bearer $JWT" fodinfo:5000/token/validate - [ ]
GET /configsreturns a JSON with configmaps and/or secrets mounted in theconfigvolume - [ ]
POST/PUT /cache/{key}saves the posted content to Redis - [ ]
GET /cache/{key}returns the content from Redis if the key exists - [ ]
DELETE /cache/{key}deletes the key from Redis if exists - [x]
POST /storewrites the posted content to disk at /data/hash and returns the SHA1 hash of the content - [x]
GET /store/{hash}returns the content of the file /data/hash if exists - [ ]
GET /ws/echoechos content via websocketspodcli ws ws://localhost:5000/ws/echo - [ ]
GET /chunked/{seconds}usestransfer-encodingtypechunkedto give a partial response and then waits for the specified period - [ ]
GET /swagger.jsonreturns the API Swagger docs, used for Linkerd service profiling and Gloo routes discovery
🔗 More in this category