Podinfo is a tiny web application made with Go that showcases best practices of running microservices in Kubernetes.
Specifications:
- Health checks (readiness and liveness)
- Graceful shutdown on interrupt signals
- File watcher for secrets and configmaps
- Instrumented with Prometheus
- Tracing with Istio and Jaeger
- Linkerd service profile
- Structured logging with zap
- 12-factor app with viper
- 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
Web API:
GET /
prints runtime informationGET /version
prints podinfo version and git commit hashGET /metrics
return HTTP requests duration and Go runtime metricsGET /healthz
used by Kubernetes liveness probeGET /readyz
used by Kubernetes readiness probePOST /readyz/enable
signals the Kubernetes LB that this instance is ready to receive trafficPOST /readyz/disable
signals the Kubernetes LB to stop sending requests to this instanceGET /status/{code}
returns the status codeGET /panic
crashes the process with exit code 255POST /echo
forwards the call to the backend service and echos the posted contentGET /env
returns the environment variables as a JSON arrayGET /headers
returns a JSON with the request HTTP headersGET /delay/{seconds}
waits for the specified periodPOST /token
issues a JWT token valid for one minuteJWT=$(curl -sd 'anon' podinfo:9898/token | jq -r .token)
GET /token/validate
validates the JWT tokencurl -H "Authorization: Bearer $JWT" podinfo:9898/token/validate
GET /configs
returns a JSON with configmaps and/or secrets mounted in theconfig
volumePOST/PUT /cache/{key}
saves the posted content to RedisGET /cache/{key}
returns the content from Redis if the key existsDELETE /cache/{key}
deletes the key from Redis if existsPOST /store
writes the posted content to disk at /data/hash and returns the SHA1 hash of the contentGET /store/{hash}
returns the content of the file /data/hash if existsGET /ws/echo
echos content via websocketspodcli ws ws://localhost:9898/ws/echo
GET /chunked/{seconds}
usestransfer-encoding
typechunked
to give a partial response and then waits for the specified periodGET /swagger.json
returns the API Swagger docs, used for Linkerd service profiling and Gloo routes discovery
gRPC API:
/grpc.health.v1.Health/Check
health checking
Web UI:
To access the Swagger UI open <podinfo-host>/swagger/index.html
in a browser.
- GitOps Progressive Deliver with Flagger, Helm v3 and Linkerd
- GitOps Progressive Deliver on EKS with Flagger and AppMesh
- Automated canary deployments with Flagger and Istio
- Kubernetes autoscaling with Istio metrics
- Autoscaling EKS on Fargate with custom metrics
- Managing Helm releases the GitOps way
- Securing EKS Ingress With Contour And Let’s Encrypt The GitOps Way
Helm:
helm repo add podinfo https://stefanprodan.github.io/podinfo
helm upgrade --install --wait frontend \
--namespace test \
--set replicaCount=2 \
--set backend=http://backend-podinfo:9898/echo \
podinfo/podinfo
# Test pods have hook-delete-policy: hook-succeeded
helm test frontend
helm upgrade --install --wait backend \
--namespace test \
--set hpa.enabled=true \
podinfo/podinfo
Kustomize:
kubectl apply -k github.com/stefanprodan/podinfo//kustomize
Docker:
docker run -dp 9898:9898 stefanprodan/podinfo