Skip to content
Open
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
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ bin/
target/
Dockerfile
Makefile
.devbox/
14 changes: 11 additions & 3 deletions Dockerfile.local
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
# syntax=docker/dockerfile:1
FROM rust:1.77-bookworm as builder
FROM ghcr.io/rust-cross/cargo-zigbuild:0.20.1 AS builder

ARG TARGETARCH=x86_64

WORKDIR /tmp

RUN rustup target add ${TARGETARCH}-unknown-linux-musl

WORKDIR /app

COPY . .
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/app/target \
cargo build --release && cp target/release/wasmcloud-operator .
cargo zigbuild --release --target x86_64-unknown-linux-musl --locked && \
cp target/${TARGETARCH}-unknown-linux-musl/release/wasmcloud-operator .

FROM gcr.io/distroless/cc-debian12
FROM scratch
COPY --from=builder /app/wasmcloud-operator /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/wasmcloud-operator"]
22 changes: 21 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
repo := ghcr.io/wasmcloud/wasmcloud-operator
local_repo := localhost:5001/wasmcloud-operator
version := $(shell git rev-parse --short HEAD)
platforms := linux/amd64,linux/arm64

.PHONY: build-dev-image build-image buildx-image
.PHONY: build-dev-image build-image buildx-image setup teardown build-local-dev-image push-local-dev-image deploy-local-dev-image update-local-dev-image
build-image:
docker build -t $(repo):$(version) .

Expand All @@ -11,3 +12,22 @@ buildx-image:

build-dev-image:
docker build -t $(repo):$(version)-dev -f Dockerfile.local .

setup:
cd hack && bash ./run-kind-cluster.sh

teardown:
cd hack && bash ./teardown-kind-cluster.sh

build-local-dev-image:
docker build -t $(local_repo):latest -f Dockerfile.local .

push-local-dev-image:
docker push $(local_repo):latest

deploy-local-dev-image:
kubectl kustomize deploy/local | kubectl apply -f -

# deleting pod makes it pull a new version thanks to pullPolicy always
update-local-dev-image:
kubectl delete pod -n wasmcloud-operator -l "app=wasmcloud-operator"
58 changes: 55 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,61 @@ data:

## Testing

- Make sure you have a Kubernetes cluster running locally. Some good options
include [Kind](https://kind.sigs.k8s.io/) or Docker Desktop.
- `RUST_LOG=info cargo run`
### KinD

Make sure you have `kind`, `kubectl`, and `helm` installed. Then you can run `make setup` to create
a KinD cluster with NATS and wadm installed.

### Deploy Local Code

Once KinD is set up, run the following:

```sh
# build a docker image from the current code
make build-local-dev-image
# push the image to a registry available to kind
make push-local-dev-image
# deploy the operator using the pushed image
make deploy-local-dev-image
```

### Deploying Test Custom Resources

You can deploy custom resources to test the operator using the following commands:

```sh
# deploy a host configuration
kubectl apply -f hack/wasmcloud-hostconfig-sample.yaml
# once the hosts are available, deploy a sample application
kubectl apply -f https://raw.githubusercontent.com/wasmCloud/wasmcloud-operator/main/examples/quickstart/hello-world-application.yaml
```

### Update the Image

After performing local changes to the code, you can update the operator running in the KinD cluster
using:

```sh
# re-build a docker image from the current code
make build-local-dev-image
# re-push the image to a registry available to kind
make push-local-dev-image
# update the existing deployment with the new image
make update-local-dev-image
```

### Local Deployment of the Operator

You can locally run the operator outside any Kubernetes cluster using:

```sh
RUST_LOG=info cargo run --bin wasmcloud-operator
```

> Note that the operator will try to connect to NATS using the configured URI from the
> `WasmCloudHostConfig` resources. Since this is likely a DNS entry only resolvable within the
> Kuberntees cluster, you will need to ensure traffic is correctly routed to NATS in order for this
> to work (e.g. using an entry in your `/etc/hosts` and a port-forward to the NATS service.

## Types crate

Expand Down
13 changes: 13 additions & 0 deletions hack/nats-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
config:
cluster:
enabled: true
replicas: 3
leafnodes:
enabled: true
jetstream:
enabled: true
fileStore:
pvc:
size: 10Gi
merge:
domain: default
16 changes: 14 additions & 2 deletions hack/run-kind-cluster.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fi
# https://github.com/kubernetes-sigs/kind/issues/2875
# https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration
# See: https://github.com/containerd/containerd/blob/main/docs/hosts.md
cat <<EOF | kind create cluster --image kindest/node:v1.29.4 --config=-
cat <<EOF | kind create cluster -n wasmcloud-operator-test --image kindest/node:v1.34.0 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
Expand All @@ -36,7 +36,7 @@ EOF
# We want a consistent name that works from both ends, so we tell containerd to
# alias localhost:${reg_port} to the registry container when pulling images
REGISTRY_DIR="/etc/containerd/certs.d/localhost:${reg_port}"
for node in $(kind get nodes); do
for node in $(kind get nodes -n wasmcloud-operator-test); do
docker exec "${node}" mkdir -p "${REGISTRY_DIR}"
cat <<EOF | docker exec -i "${node}" cp /dev/stdin "${REGISTRY_DIR}/hosts.toml"
[host."http://${reg_name}:5000"]
Expand All @@ -62,3 +62,15 @@ data:
host: "localhost:${reg_port}"
help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

# 6. Wait for cluster to come up
sleep 5s
kubectl -n kube-system wait --for=condition=Ready --timeout=60s pod -l "component=kube-apiserver"

# 7. Install NATS
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm upgrade --install -f ./nats-values.yaml nats nats/nats
kubectl wait --for=condition=Ready --timeout=600s pod -l "app.kubernetes.io/name=nats"

# 8. Install WADM
helm install wadm -f ./wadm-values.yaml --version 0.2.0 oci://ghcr.io/wasmcloud/charts/wadm
9 changes: 9 additions & 0 deletions hack/teardown-kind-cluster.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/sh
set -o errexit

# 1. Delete kind cluster
kind delete cluster -n wasmcloud-operator-test

# 2. Delete local registry
docker stop kind-registry
docker rm kind-registry
4 changes: 4 additions & 0 deletions hack/wadm-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
wadm:
config:
nats:
server: "nats.default.svc.cluster.local:4222"
17 changes: 17 additions & 0 deletions hack/wasmcloud-hostconfig-sample.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
apiVersion: k8s.wasmcloud.dev/v1alpha1
kind: WasmCloudHostConfig
metadata:
name: my-wasmcloud-cluster
spec:
# The number of wasmCloud host pods to run
hostReplicas: 2
# The lattice to connect the hosts to
lattice: default
# Additional labels to apply to the host other than the defaults set in the operator
hostLabels:
some-label: value
# The address to connect to nats
natsAddress: nats://nats.default.svc.cluster.local
# Which wasmCloud version to use
version: 1.0.4