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

feat: automatically create Kubernetes Services for apps using a httpserver component #14

Merged
merged 2 commits into from
Apr 9, 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
169 changes: 116 additions & 53 deletions Cargo.lock

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ axum = {workspace = true}
axum-server = {workspace = true}
anyhow = {workspace = true}
ctrlc = {workspace = true}
cloudevents-sdk = {workspace = true}
config = {workspace = true}
futures = {workspace = true}
handlebars = {workspace = true}
json-patch = {workspace = true}
Expand All @@ -42,6 +44,7 @@ serde_yaml = {workspace = true}
thiserror = {workspace = true}
time = {workspace = true}
tokio = {workspace = true}
tokio-util = {workspace = true}
tracing = {workspace = true}
tracing-opentelemetry = {workspace = true}
tracing-subscriber = {workspace = true}
Expand All @@ -56,6 +59,8 @@ async-nats = "0.33"
axum = { version = "0.6", features = ["headers"] }
axum-server = { version = "0.4", features = ["tls-rustls"] }
anyhow = "1"
config = {version = "0.14", default-features = false, features = ["convert-case", "async"]}
cloudevents-sdk = "0.7"
ctrlc = "3"
futures = "0.3"
handlebars = "5.1"
Expand All @@ -73,6 +78,7 @@ serde_yaml = "0.9"
thiserror = "1"
time = "0.3"
tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.7", features = ["rt"] }
tracing = "0.1"
tracing-opentelemetry = "0.20"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,17 @@ command will start WADM as a Kubernetes deployment:
kubectl kustomize build deploy/local | kubectl apply -f -
```

## Automatically Syncing Kubernetes Services

The operator automatically creates Kubernetes Services for wasmCloud
applications. Right now this is limited only to applications that deploy the
wasmCloud httpserver component using a `daemonscaler`, but additional support
for `spreadscalers` will be added in the future.

If you specify host label selectors on the `daemonscaler` then the operator
will honor those labels and will only create a service for the pods that match
those label selectors.

## Argo CD Health Check

Argo CD provides a way to define a [custom health
Expand Down
2 changes: 1 addition & 1 deletion charts/wasmcloud-operator/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0
version: 0.1.1

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
Expand Down
2 changes: 1 addition & 1 deletion charts/wasmcloud-operator/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ spec:
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: RUST_LOG
value: info
value: info,async_nats=error
- name: POD_NAMESPACE
valueFrom:
fieldRef:
Expand Down
12 changes: 12 additions & 0 deletions deploy/base/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ rules:
- services
- configmaps
- serviceaccounts
- pods
verbs:
- get
- list
Expand Down Expand Up @@ -104,6 +105,17 @@ rules:
- list
- patch
- update
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- create
- delete
- get
- list
- patch
- update
- apiGroups:
- k8s.wasmcloud.dev
resources:
Expand Down
5 changes: 5 additions & 0 deletions deploy/local/local-registry.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
- op: add
path: /spec/template/spec/containers/0/image
value: localhost:5001/wasmcloud-operator:latest
- op: replace
path: /spec/template/spec/containers/0/env/0
value:
name: RUST_LOG
value: info,controller::services=debug,async_nats=warn,controller::controller=debug
64 changes: 64 additions & 0 deletions hack/run-kind-cluster.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/bin/sh
set -o errexit

# 1. Create registry container unless it already exists
reg_name='kind-registry'
reg_port='5001'
if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then
docker run \
-d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \
registry:2
fi

# 2. Create kind cluster with containerd registry config dir enabled
# TODO: kind will eventually enable this by default and this patch will
# be unnecessary.
#
# See:
# 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.2 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
EOF

# 3. Add the registry config to the nodes
#
# This is necessary because localhost resolves to loopback addresses that are
# network-namespace local.
# In other words: localhost in the container is not localhost on the host.
#
# 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
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"]
EOF
done

# 4. Connect the registry to the cluster network if not already connected
# This allows kind to bootstrap the network but ensures they're on the same network
if [ "$(docker inspect -f='{{json .NetworkSettings.Networks.kind}}' "${reg_name}")" = 'null' ]; then
docker network connect "kind" "${reg_name}"
fi

# 5. Document the local registry
# https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: local-registry-hosting
namespace: kube-public
data:
localRegistryHosting.v1: |
host: "localhost:${reg_port}"
help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF
13 changes: 13 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use serde::{Deserialize, Serialize};

/// Configuration for the operator. If you are configuring the operator using environment variables
/// then all values need to be prefixed with "WASMCLOUD_OPERATOR".
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default)]
pub struct OperatorConfig {
#[serde(default = "default_stream_replicas")]
pub stream_replicas: u16,
}

fn default_stream_replicas() -> u16 {
1
}
Loading
Loading