Source: docker.com/resources/what-container/
Source: https://memory-beta.fandom.com/wiki/Borg_cube
Source: https://aws.plainenglish.io/kubernetes-architecture-c93cb9c798d8

import fastapi
import nhs_number
@app.get("/validate", response_model=ValidationResponse)
def validate(number: str = Query(..., description="NHS number to validate")):
return {"valid": nhs_number.is_valid(number)}
...
$ uvicorn nhs_number_api.main:app --host 0.0.0.0 --port 8888

FROM python:3.11-slim
WORKDIR /app
COPY pyproject.toml ./
COPY src ./src
RUN pip install --no-cache-dir .
CMD ["uvicorn", "nhs_number_api.main:app", "--host", "0.0.0.0", "--port", "8888"]
$ docker build -f Containerfile -t nhs-number-api:v0.0.1 .
$ docker run --rm -p 8888:8888 --read-only nhs-number-api:v0.0.1
$ docker push ghcr.io/amadeuspzs/nhs-number-api/nhs-number-api:v0.0.1

apiVersion: apps/v1
kind: Deployment
metadata:
name: nhs-number-api
spec:
replicas: 1
template:
spec:
containers:
- name: nhs-number-api
image: ghcr.io/amadeuspzs/nhs-number-api/nhs-number-api
tag: v0.0.1
ports:
- containerPort: 8888
name: http
$ kubectl apply -f deployment.yaml
$ kubectl get pods -n nhsrpysoc
apiVersion: v1
kind: Service
metadata:
name: nhs-number-api
spec:
type: ClusterIP
selector:
app: nhs-number-api
ports:
- name: http
port: 80
targetPort: 8888
protocol: TCP
$ kubectl apply -f service.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nhs-number-api
spec:
rules:
- host: nhs-rpysoc.rsna.newtonstree.ai
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nhs-number-api
port:
name: http
tls:
- hosts:
- nhs-rpysoc.rsna.newtonstree.ai
$ kubectl apply -f ingress.yaml
