From f0b388764f888d850ae3769975ab51428f5695c7 Mon Sep 17 00:00:00 2001 From: SammyOina Date: Thu, 15 Jan 2026 16:49:31 +0300 Subject: [PATCH 1/3] feat: Add Kubernetes deployment manifests, configuration, a helper script, and documentation for Proplet on Confidential Containers. Signed-off-by: SammyOina --- coco/README.md | 103 +++++++++++++++++++++++++++++++++++++++ coco/deploy_coco.sh | 43 ++++++++++++++++ coco/proplet-config.yaml | 25 ++++++++++ coco/proplet.yaml | 52 ++++++++++++++++++++ 4 files changed, 223 insertions(+) create mode 100644 coco/README.md create mode 100755 coco/deploy_coco.sh create mode 100644 coco/proplet-config.yaml create mode 100644 coco/proplet.yaml diff --git a/coco/README.md b/coco/README.md new file mode 100644 index 00000000..1f7a0d65 --- /dev/null +++ b/coco/README.md @@ -0,0 +1,103 @@ +# Proplet on Confidential Containers (CoCo) + +This directory contains resources for deploying Proplet on a Kubernetes cluster enabled with Confidential Containers (Kata Containers). + +## Prerequisites + +* A Kubernetes cluster with [Confidential Containers](https://confidentialcontainers.org/) (Kata Containers) installed. +* `kubectl` configured to access the cluster. +* `docker` for building images (or another OCI builder). +* A default StorageClass for handling ephemeral storage (optional but recommended). + +## Cluster Setup (Quick Start) + +To set up a local testing environment with Kind and Confidential Containers: + +1. **Create a Kind Cluster**: + ```bash + kind create cluster --name coco-test --config - < /dev/null; then + echo "Detected Kind cluster, loading image..." + kind load docker-image "${IMAGE_NAME}:${IMAGE_TAG}" || echo "Warning: Failed to load image into Kind, continuing..." +fi + +# 3. Apply Kubernetes manifests +echo "Applying Kubernetes manifests..." +# Temporarily update runtimeClassName if overridden +if [ "$RUNTIME_CLASS" != "kata" ]; then + echo "Updating runtimeClassName to $RUNTIME_CLASS..." + sed -i "s/runtimeClassName: kata/runtimeClassName: $RUNTIME_CLASS/g" "$K8S_DIR/proplet.yaml" +fi + +kubectl apply -f "$K8S_DIR/proplet-config.yaml" +kubectl apply -f "$K8S_DIR/proplet.yaml" + +echo "=== Deployment Submitted ===" +echo "Check status:" +echo " kubectl get pods -l app=proplet" +echo " kubectl logs -l app=proplet" diff --git a/coco/proplet-config.yaml b/coco/proplet-config.yaml new file mode 100644 index 00000000..b1f9d0bf --- /dev/null +++ b/coco/proplet-config.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: proplet-config +data: + config.toml: | + # SuperMQ Configuration + + [manager] + domain_id = "4bae1a76-afc4-4054-976c-5427c49fbbf3" + client_id = "cdaccb11-7209-4fb9-8df1-3c52e9d64284" + client_key = "507d687d-51f8-4c71-8599-4273a5d75429" + channel_id = "34a616c3-8817-4995-aade-a383e64766a8" + + [proplet1] + domain_id = "4bae1a76-afc4-4054-976c-5427c49fbbf3" + client_id = "0deb859f-973d-4e2e-93cf-ec756f4fc3c8" + client_key = "17c03d05-b55d-4a05-88ec-cadecb2130c4" + channel_id = "34a616c3-8817-4995-aade-a383e64766a8" + + [proxy] + domain_id = "4bae1a76-afc4-4054-976c-5427c49fbbf3" + client_id = "0deb859f-973d-4e2e-93cf-ec756f4fc3c8" + client_key = "17c03d05-b55d-4a05-88ec-cadecb2130c4" + channel_id = "34a616c3-8817-4995-aade-a383e64766a8" diff --git a/coco/proplet.yaml b/coco/proplet.yaml new file mode 100644 index 00000000..edce43de --- /dev/null +++ b/coco/proplet.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: proplet + labels: + app: proplet +spec: + replicas: 1 + selector: + matchLabels: + app: proplet + template: + metadata: + labels: + app: proplet + spec: + runtimeClassName: kata + containers: + - name: proplet + image: proplet:latest + imagePullPolicy: IfNotPresent + env: + - name: PROPLET_LOG_LEVEL + value: "info" + - name: PROPLET_INSTANCE_ID + value: "proplet-k8s-001" + - name: PROPLET_CONFIG_FILE + value: "/etc/proplet/config.toml" + - name: PROPLET_CONFIG_SECTION + value: "proplet1" + - name: PROPLET_EXTERNAL_WASM_RUNTIME + value: "/usr/local/bin/wasmtime" + - name: PROPLET_MANAGER_K8S_NAMESPACE + value: "default" + - name: PROPLET_MQTT_ADDRESS + value: "tcp://localhost:1883" + - name: PROPLET_MQTT_TIMEOUT + value: "30" + - name: PROPLET_MQTT_QOS + value: "2" + - name: PROPLET_LIVELINESS_INTERVAL + value: "10" + # Since AA runs in the guest VM in CoCo (not sidecar), we access it via localhost + # if the network namespace is shared or via specific socket. + # Assuming standard loopback availability in the Pod for guest components provided by Kata 3.x+ + volumeMounts: + - name: config-volume + mountPath: /etc/proplet + volumes: + - name: config-volume + configMap: + name: proplet-config From d352c2131ee7d0aeb6b6c499d5134c2af65b1949 Mon Sep 17 00:00:00 2001 From: Sammy Oina Date: Fri, 16 Jan 2026 18:03:49 +0300 Subject: [PATCH 2/3] refactor: Update Proplet build process to use Makefile and specify the full image name. Signed-off-by: Sammy Oina --- coco/README.md | 8 +++++--- coco/deploy_coco.sh | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/coco/README.md b/coco/README.md index 1f7a0d65..d24f0496 100644 --- a/coco/README.md +++ b/coco/README.md @@ -75,10 +75,12 @@ Use the helper script to build and deploy: Or manually: ```bash -# 1. Build image -docker build -f ../docker/Dockerfile.proplet -t proplet:latest .. +# 1. Build image (from repository root) +cd .. +make docker_proplet -# 2. Apply manifests +# 2. Apply manifests (from coco directory) +cd coco kubectl apply -f proplet-config.yaml kubectl apply -f proplet.yaml ``` diff --git a/coco/deploy_coco.sh b/coco/deploy_coco.sh index a4af2ed4..ed3805d0 100755 --- a/coco/deploy_coco.sh +++ b/coco/deploy_coco.sh @@ -9,16 +9,16 @@ ROOT_DIR=$(dirname "$SCRIPT_DIR") K8S_DIR="$SCRIPT_DIR" # Configuration -IMAGE_NAME="proplet" +IMAGE_NAME="ghcr.io/absmach/propeller/proplet" IMAGE_TAG="latest" RUNTIME_CLASS=${RUNTIME_CLASS:-kata} echo "=== Proplet CoCo Deployment ===" -# 1. Build the Proplet container image +# 1. Build the Proplet container image using Makefile echo "Building Proplet container image..." cd "$ROOT_DIR" -docker build -f docker/Dockerfile.proplet -t "${IMAGE_NAME}:${IMAGE_TAG}" . +make docker_proplet # 2. (Optional) Load into Kind if using Kind if kind get clusters &> /dev/null; then From 60c762d86589182e7efe01675761d1cadc35c0df Mon Sep 17 00:00:00 2001 From: Sammy Oina Date: Fri, 23 Jan 2026 17:43:05 +0300 Subject: [PATCH 3/3] docs: Add comment to clarify RUNTIME_CLASS configuration in deploy_coco.sh Signed-off-by: Sammy Oina --- coco/deploy_coco.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/coco/deploy_coco.sh b/coco/deploy_coco.sh index ed3805d0..5373cb6d 100755 --- a/coco/deploy_coco.sh +++ b/coco/deploy_coco.sh @@ -11,6 +11,7 @@ K8S_DIR="$SCRIPT_DIR" # Configuration IMAGE_NAME="ghcr.io/absmach/propeller/proplet" IMAGE_TAG="latest" +# Define RUNTIME_CLASS with the runtime class you want to use with CoCo (e.g., kata, ccruntime) RUNTIME_CLASS=${RUNTIME_CLASS:-kata} echo "=== Proplet CoCo Deployment ==="