Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

incorporate some feedback #14

Merged
merged 1 commit into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,13 @@ push-sandbox-image: image
push-image: image
docker push ${DOCKER_IMAGE}:latest

# if you want to use the sandbox repo, this target puts the files from this service in place. You will
# need to update the sandbox Makefile to get helm to load everything properly.
load-sandbox:
@cp sandbox/service.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-service.yaml"
@cp sandbox/deployment.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-deployment.yaml"
@cp sandbox/configmap.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-configmap.yaml"
@cp helm/values.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-values.yaml"
@cp helm/service.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-service.yaml"
@cp helm/deployment.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-deployment.yaml"
@cp helm/configmap.yaml "${SANDBOX_TEMPLATE_DIR}/skeleton-configmap.yaml"
@echo "Be sure to do a helm (re)load to get the service started"

# https://gist.github.com/prwhite/8168133
Expand Down
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
### What is this?
This is a small service that exposes a toy RESTful API. It is intended to be a template or example for how we write this sort of code in FleetServices.
It also contains example configuration for other useful things such as:
1. Creating a Docker image
2. Launching the service image into our [sandbox](https://github.com/metal-toolbox/sandbox) environment. See the [helm](./helm) directory.
3. Typical pull-request workflow (linting, building, code-analysis)
4. Creating a release image of the software for deployment to Kubernetes.

### How do I use it?
That depends on what you want to do.
- You can clone this repo as a template service, make your modifications, and push it to a new repo on Github.com.
- You can get a sense of how we handle common tasks (like using [gin](https://gin-gonic.com) or [zap](https://pkg.go.dev/go.uber.org/zap)) without being overwhelmed by details of a non-trivial service.
- You can propose new conventions (such as adding a client for [NATS](https://nats.io) or [FleetDB](https://github.com/metal-toolbox/fleetdb))
- You can launch this service into our [kind](https://kind.sigs.k8s.io) sandbox by doing `helm install skeleton-test helm` from the root of this repo. Port-forward to your local environment to test the API by hand, or configure service-to-service tests with other services in kind.

Much of the functionality is encapsulated into `Makefile` targets. On the one hand this is a pretty clear abuse of `make`, but on the other we do it in many other repositories. `make` will tab-prompt the user with potential targets (e.g. `build`, `image`, `push-sandbox-image` et al.)

I hope it serves to reduce the friction of getting a service into production for you.
8 changes: 8 additions & 0 deletions helm/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
apiVersion: v2
name: fleet-skeleton-chart
description: "template service helm chart"
type: application
version: 0.1.0
appVersion: 0.1.0

9 changes: 9 additions & 0 deletions helm/templates/configmap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.app.name }}-config
data:
config.yaml: |
listen_address: 0.0.0.0:{{ .Values.app.containerPort }}
developer_mode: true
55 changes: 55 additions & 0 deletions helm/templates/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-service: {{ .Values.app.serviceName }}
name: {{ .Values.app.name }}
spec:
replicas: 1
selector:
matchLabels:
k8s-service: {{ .Values.app.serviceName }}
template:
metadata:
labels:
k8s-service: {{ .Values.app.serviceName }}
spec:
containers:
- image: "{{ .Values.image.repo }}/{{ .Values.app.name }}:{{ .Values.image.tag }}"
name: {{ .Values.app.name }}
args:
- server
- "--config={{ .Values.app.configPath }}/config.yaml"
ports:
- name: api-port
containerPort: {{ .Values.app.containerPort }}
volumeMounts:
- name: config-volume
mountPath: {{ .Values.app.configPath }}
env:
securityContext:
capabilities:
drop:
- NET_RAW
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
resources:
limits:
cpu: 100m
memory: 100M
requests:
cpu: 100m
memory: 100M
livenessProbe:
httpGet:
path: {{ .Values.app.livenessURI }}
port: api-port
initialDelaySeconds: 30
periodSeconds: 30
volumes:
- name: config-volume
configMap:
name: {{ .Values.app.name}}-config
restartPolicy: Always
14 changes: 14 additions & 0 deletions helm/templates/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-service: {{ .Values.app.serviceName }}
name: {{ .Values.app.name }}
spec:
ports:
- protocol: {{ .Values.app.protocol | default "TCP" }}
port: {{ .Values.app.containerPort }}
targetPort: {{ .Values.app.containerPort }}
selector:
k8s-service: {{ .Values.app.serviceName }}
11 changes: 11 additions & 0 deletions helm/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
image:
repo: localhost:5001
tag: latest

app:
name: fleet-rest-skeleton
serviceName: skeleton-api
configPath: /etc/skeleton
livenessURI: /_health/liveness
containerPort: 7500
Loading