This repository demonstrates an automated workflow for updating Docker image tags in k8s manifests. The workflow leverages the following tools:
- GitHub Actions
- Release Please:
release-pleasecreates a new version, and GitHub release with change log. - GoReleaser: A release automation tool for Go projects, used here for building the application and its Docker image.
- Kustomization: build the k8s manifests and update the Docker image tag using the
kustomize editfeature.
This repository also provides a simple HTTP and GRPC service to test various scenarios in the k8s. such as Istio, Service Mesh, etc.
The application exposes the following HTTP endpoints:
-
/: Root endpoint that returns an HTML page with service information including:- Service name
- Version
- Instance hostname
- Host
- Color
- Current timestamp
-
/ping: Health check endpoint that returns a JSON response with:- "pong" message
- Service name
- Version
- Instance hostname
- Current timestamp
-
/hello: Greeting endpoint that returns a text response- Returns a personalized greeting if
NAMEenvironment variable is set - Supports an optional
waitquery parameter (e.g.,/hello?wait=5sor/hello?wait=5) to simulate delay - Includes instance hostname in the response
- Example responses:
- Basic:
Hello, Instance: hostname - With name:
Hello, John!, Instance: hostname - With wait:
Hello, John!, waited 5s, Instance: hostname
- Basic:
- Returns a personalized greeting if
-
/health: Simple health check endpoint that returns "HEALTHY" when the service is running
The application uses the following environment variables:
-
PORT: Specifies the port on which the server will listen. Defaults to8080if not set. The port is prefixed with0.0.0.0:to ensure it listens on all network interfaces. -
PORT_2: Port number for the secondary web server- default is
3000 - Must be different from PORT (primary server). Application will not start if
PORTandPORT_2have same port - Contains identical endpoints to the primary server
- Used to simulate multiple servers in a single Kubernetes Pod
- default is
-
GRPC_PORT: Port number for the GRPC server- default is
9090
- default is
-
SERVICE: The name of the service. This is used in the response data for the root (/) and/pingendpoints. -
VERSION: The version of the service. This is also included in the response data for the root (/) and/pingendpoints. -
NAME: The name used in the/helloendpoint to personalize the greeting message. If not set, the message defaults to "Hello!". -
COLOR: Used in the response data for the root (/) endpoint to specify a color, which can be used for theming or display purposes.
These environment variables allow you to configure the behavior and responses of the application without modifying the code.
grpcurl -plaintext localhost:9090 describe api.HelloServiceservice HelloService {
rpc Ping ( .api.PingRequest ) returns ( .api.PingResponse );
rpc SayHello ( .api.HelloRequest ) returns ( .api.HelloReply );
}grpcurl -plaintext localhost:9090 api.HelloService.Pingresult:
{
"message": "pong",
"instance": "your-host-name",
"timestamp": "2024-12-23T14:22:38-05:00"
}grpcurl -plaintext -d '{"name": "Darth Vader"}' \
localhost:9090 api.HelloService.SayHelloresult:
{
"message": "Hello Darth Vader"
}