From e6ad9b5077c3a6357ff8aa95dc5911cb813f6fa8 Mon Sep 17 00:00:00 2001 From: Slawomir Koszewski Date: Sat, 25 Jul 2026 22:49:46 +0200 Subject: [PATCH] feat: add k3s deployment and service configurations for ok-server --- README.md | 44 +++++++++++++++++++++++++++++++++++++++ k3s/deployment.yaml | 20 ++++++++++++++++++ k3s/expose-ingress.yaml | 26 +++++++++++++++++++++++ k3s/expose-servicelb.yaml | 11 ++++++++++ 4 files changed, 101 insertions(+) create mode 100644 k3s/deployment.yaml create mode 100644 k3s/expose-ingress.yaml create mode 100644 k3s/expose-servicelb.yaml diff --git a/README.md b/README.md index 931e9be..2fda80b 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,50 @@ container run --rm -d --name ok-server -c 1 -m 256m -p 8080:8080 ok-server This will start the server and expose it on port 8080. The container will run until stopped, and will be removed when stopped. You can stop it with `container stop ok-server`. +### nerdctl with BuildKit on a k3s server + +Build the image directly into the containerd instance used by k3s: + +```bash +sudo nerdctl build -t ok-server . +sudo nerdctl images +``` + +On a single-node k3s cluster the image is now available to the kubelet without a +registry. The [k3s/deployment.yaml](k3s/deployment.yaml) Deployment references +it with `imagePullPolicy: Never`: + +```bash +kubectl apply -f k3s/deployment.yaml +``` + +Expose the app with one of the two options below. + +#### Option 1: Traefik Ingress + +k3s includes the Traefik ingress controller. The ClusterIP Service and Ingress +in [k3s/expose-ingress.yaml](k3s/expose-ingress.yaml) expose the app on port 80 +of the node's IP address: + +```bash +kubectl apply -f k3s/expose-ingress.yaml +curl -si "http:///" +``` + +#### Option 2: ServiceLB + +k3s also includes the ServiceLB load balancer. The single `LoadBalancer` +Service in [k3s/expose-servicelb.yaml](k3s/expose-servicelb.yaml) exposes the +app on port 8080 of the node's IP address, without an Ingress: + +```bash +kubectl apply -f k3s/expose-servicelb.yaml +curl -si "http://:8080" +``` + +On a multi-node cluster, push the image to a registry instead, so every node can +pull it. + ## License This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. diff --git a/k3s/deployment.yaml b/k3s/deployment.yaml new file mode 100644 index 0000000..7b44c47 --- /dev/null +++ b/k3s/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ok-server +spec: + replicas: 1 + selector: + matchLabels: + app: ok-server + template: + metadata: + labels: + app: ok-server + spec: + containers: + - name: ok-server + image: ok-server + imagePullPolicy: Never + ports: + - containerPort: 8080 diff --git a/k3s/expose-ingress.yaml b/k3s/expose-ingress.yaml new file mode 100644 index 0000000..fb3c3cc --- /dev/null +++ b/k3s/expose-ingress.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Service +metadata: + name: ok-server +spec: + selector: + app: ok-server + ports: + - port: 8080 + targetPort: 8080 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ok-server +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: ok-server + port: + number: 8080 diff --git a/k3s/expose-servicelb.yaml b/k3s/expose-servicelb.yaml new file mode 100644 index 0000000..b745e81 --- /dev/null +++ b/k3s/expose-servicelb.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: ok-server +spec: + type: LoadBalancer + selector: + app: ok-server + ports: + - port: 8080 + targetPort: 8080