Skip to content

Commit 5c4b341

Browse files
authored
Merge pull request #17 from faroshq/grab.a.bag.part2
Start wiring agent helm
2 parents 4789592 + 2e90d18 commit 5c4b341

12 files changed

Lines changed: 719 additions & 26 deletions

File tree

README.md

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,45 @@ git clone https://github.com/faroshq/kedge.git
4343
cd kedge
4444
make build
4545

46-
# Run the full dev stack locally
47-
make dev
46+
# Terminal 1: Run the hub (embedded kcp + static token auth)
47+
make run-hub-embedded-static
4848

49-
# In another terminal
50-
make dev-login # Authenticate
49+
# Terminal 2: Login and register a site
50+
make dev-login-static # Authenticate with static token
5151
make dev-site-create # Register a site
52-
make dev-run-agent # Start the agent
53-
make dev-create-workload # Deploy a sample workload
52+
make dev-run-agent # Start the agent on a local kind cluster
5453
```
5554

55+
That's it! The hub runs with embedded kcp and static token authentication — no external dependencies required.
56+
57+
### Deploy a test workload
58+
59+
```bash
60+
make dev-create-workload # Deploy a sample nginx workload
61+
```
62+
63+
### Other development modes
64+
65+
Run `make help-dev` to see all available modes:
66+
67+
| Mode | Command | Description |
68+
|------|---------|-------------|
69+
| **Standalone** | `make run-hub-embedded-static` | Embedded kcp + static token (no deps) |
70+
| **With OIDC** | `make run-dex` + `make run-hub-embedded` | Embedded kcp + Dex OIDC |
71+
| **External kcp** | `make dev-run-kcp` + `make run-hub-static` | External kcp + static token |
72+
5673
## Requirements
5774

5875
- Go 1.25+
59-
- kind (for local agent cluster in dev mode)
6076
- Docker
77+
- kind (for local agent cluster)
6178

6279
## Documentation
6380

6481
Full documentation is available at the [docs site](https://faroshq.github.io/kedge/).
6582

6683
- [Getting Started](https://faroshq.github.io/kedge/getting-started.html)
84+
- [Developer Guide](https://faroshq.github.io/kedge/developers.html)
6785
- [Security (tokens & OIDC)](https://faroshq.github.io/kedge/security.html)
6886
- [Ingress Setup](https://faroshq.github.io/kedge/ingress/)
6987
- [Helm Deployment](https://faroshq.github.io/kedge/helm.html)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v2
2+
name: kedge-agent
3+
description: Kedge Agent - connects a site to the hub via reverse tunnel
4+
type: application
5+
version: 0.1.0
6+
appVersion: "0.1.0"
7+
home: https://github.com/faroshq/faros-kedge
8+
sources:
9+
- https://github.com/faroshq/faros-kedge
10+
maintainers:
11+
- name: Faros Authors
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "kedge-agent.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
6+
{{- end }}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
*/}}
11+
{{- define "kedge-agent.fullname" -}}
12+
{{- if .Values.fullnameOverride }}
13+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
14+
{{- else }}
15+
{{- $name := default .Chart.Name .Values.nameOverride }}
16+
{{- if contains $name .Release.Name }}
17+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
18+
{{- else }}
19+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
20+
{{- end }}
21+
{{- end }}
22+
{{- end }}
23+
24+
{{/*
25+
Create chart name and version as used by the chart label.
26+
*/}}
27+
{{- define "kedge-agent.chart" -}}
28+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
29+
{{- end }}
30+
31+
{{/*
32+
Common labels
33+
*/}}
34+
{{- define "kedge-agent.labels" -}}
35+
helm.sh/chart: {{ include "kedge-agent.chart" . }}
36+
{{ include "kedge-agent.selectorLabels" . }}
37+
{{- if .Chart.AppVersion }}
38+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
39+
{{- end }}
40+
app.kubernetes.io/managed-by: {{ .Release.Service }}
41+
{{- end }}
42+
43+
{{/*
44+
Selector labels
45+
*/}}
46+
{{- define "kedge-agent.selectorLabels" -}}
47+
app.kubernetes.io/name: {{ include "kedge-agent.name" . }}
48+
app.kubernetes.io/instance: {{ .Release.Name }}
49+
{{- end }}
50+
51+
{{/*
52+
Create the name of the service account to use
53+
*/}}
54+
{{- define "kedge-agent.serviceAccountName" -}}
55+
{{- if .Values.serviceAccount.create }}
56+
{{- default (include "kedge-agent.fullname" .) .Values.serviceAccount.name }}
57+
{{- else }}
58+
{{- default "default" .Values.serviceAccount.name }}
59+
{{- end }}
60+
{{- end }}
61+
62+
{{/*
63+
Hub kubeconfig secret name
64+
*/}}
65+
{{- define "kedge-agent.hubKubeconfigSecretName" -}}
66+
{{- if .Values.agent.hub.existingSecret }}
67+
{{- .Values.agent.hub.existingSecret }}
68+
{{- else }}
69+
{{- include "kedge-agent.fullname" . }}-hub-kubeconfig
70+
{{- end }}
71+
{{- end }}
72+
73+
{{/*
74+
Agent image
75+
*/}}
76+
{{- define "kedge-agent.image" -}}
77+
{{- $tag := default .Chart.AppVersion .Values.image.tag }}
78+
{{- printf "%s:%s" .Values.image.repository $tag }}
79+
{{- end }}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: {{ include "kedge-agent.fullname" . }}
5+
namespace: {{ .Release.Namespace }}
6+
labels:
7+
{{- include "kedge-agent.labels" . | nindent 4 }}
8+
spec:
9+
replicas: {{ .Values.replicaCount }}
10+
selector:
11+
matchLabels:
12+
{{- include "kedge-agent.selectorLabels" . | nindent 6 }}
13+
template:
14+
metadata:
15+
{{- with .Values.podAnnotations }}
16+
annotations:
17+
{{- toYaml . | nindent 8 }}
18+
{{- end }}
19+
labels:
20+
{{- include "kedge-agent.selectorLabels" . | nindent 8 }}
21+
spec:
22+
{{- with .Values.imagePullSecrets }}
23+
imagePullSecrets:
24+
{{- toYaml . | nindent 8 }}
25+
{{- end }}
26+
serviceAccountName: {{ include "kedge-agent.serviceAccountName" . }}
27+
securityContext:
28+
{{- toYaml .Values.podSecurityContext | nindent 8 }}
29+
containers:
30+
- name: agent
31+
securityContext:
32+
{{- toYaml .Values.securityContext | nindent 12 }}
33+
image: {{ include "kedge-agent.image" . }}
34+
imagePullPolicy: {{ .Values.image.pullPolicy }}
35+
args:
36+
- --site-name={{ required "agent.siteName is required" .Values.agent.siteName }}
37+
- --hub-kubeconfig=/etc/kedge/hub-kubeconfig/kubeconfig
38+
{{- if .Values.agent.hub.context }}
39+
- --hub-context={{ .Values.agent.hub.context }}
40+
{{- end }}
41+
{{- if .Values.agent.tunnelURL }}
42+
- --tunnel-url={{ .Values.agent.tunnelURL }}
43+
{{- end }}
44+
{{- range $key, $value := .Values.agent.labels }}
45+
- --labels={{ $key }}={{ $value }}
46+
{{- end }}
47+
resources:
48+
{{- toYaml .Values.agent.resources | nindent 12 }}
49+
volumeMounts:
50+
- name: hub-kubeconfig
51+
mountPath: /etc/kedge/hub-kubeconfig
52+
readOnly: true
53+
volumes:
54+
- name: hub-kubeconfig
55+
secret:
56+
secretName: {{ include "kedge-agent.hubKubeconfigSecretName" . }}
57+
{{- with .Values.nodeSelector }}
58+
nodeSelector:
59+
{{- toYaml . | nindent 8 }}
60+
{{- end }}
61+
{{- with .Values.affinity }}
62+
affinity:
63+
{{- toYaml . | nindent 8 }}
64+
{{- end }}
65+
{{- with .Values.tolerations }}
66+
tolerations:
67+
{{- toYaml . | nindent 8 }}
68+
{{- end }}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{{- if .Values.rbac.create -}}
2+
apiVersion: rbac.authorization.k8s.io/v1
3+
kind: ClusterRole
4+
metadata:
5+
name: {{ include "kedge-agent.fullname" . }}
6+
labels:
7+
{{- include "kedge-agent.labels" . | nindent 4 }}
8+
rules:
9+
# The agent needs broad permissions to manage workloads on behalf of the hub
10+
- apiGroups: [""]
11+
resources: ["*"]
12+
verbs: ["*"]
13+
- apiGroups: ["apps"]
14+
resources: ["*"]
15+
verbs: ["*"]
16+
- apiGroups: ["batch"]
17+
resources: ["*"]
18+
verbs: ["*"]
19+
- apiGroups: ["networking.k8s.io"]
20+
resources: ["*"]
21+
verbs: ["*"]
22+
- apiGroups: ["rbac.authorization.k8s.io"]
23+
resources: ["*"]
24+
verbs: ["*"]
25+
- apiGroups: ["policy"]
26+
resources: ["*"]
27+
verbs: ["*"]
28+
- apiGroups: ["autoscaling"]
29+
resources: ["*"]
30+
verbs: ["*"]
31+
- apiGroups: ["storage.k8s.io"]
32+
resources: ["*"]
33+
verbs: ["*"]
34+
- apiGroups: ["admissionregistration.k8s.io"]
35+
resources: ["*"]
36+
verbs: ["*"]
37+
- apiGroups: ["apiextensions.k8s.io"]
38+
resources: ["*"]
39+
verbs: ["*"]
40+
- apiGroups: ["coordination.k8s.io"]
41+
resources: ["*"]
42+
verbs: ["*"]
43+
---
44+
apiVersion: rbac.authorization.k8s.io/v1
45+
kind: ClusterRoleBinding
46+
metadata:
47+
name: {{ include "kedge-agent.fullname" . }}
48+
labels:
49+
{{- include "kedge-agent.labels" . | nindent 4 }}
50+
roleRef:
51+
apiGroup: rbac.authorization.k8s.io
52+
kind: ClusterRole
53+
name: {{ include "kedge-agent.fullname" . }}
54+
subjects:
55+
- kind: ServiceAccount
56+
name: {{ include "kedge-agent.serviceAccountName" . }}
57+
namespace: {{ .Release.Namespace }}
58+
{{- end }}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{{- if and (not .Values.agent.hub.existingSecret) .Values.agent.hub.kubeconfig -}}
2+
apiVersion: v1
3+
kind: Secret
4+
metadata:
5+
name: {{ include "kedge-agent.fullname" . }}-hub-kubeconfig
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "kedge-agent.labels" . | nindent 4 }}
9+
type: Opaque
10+
data:
11+
kubeconfig: {{ .Values.agent.hub.kubeconfig | b64enc }}
12+
{{- end }}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{{- if .Values.serviceAccount.create -}}
2+
apiVersion: v1
3+
kind: ServiceAccount
4+
metadata:
5+
name: {{ include "kedge-agent.serviceAccountName" . }}
6+
namespace: {{ .Release.Namespace }}
7+
labels:
8+
{{- include "kedge-agent.labels" . | nindent 4 }}
9+
{{- with .Values.serviceAccount.annotations }}
10+
annotations:
11+
{{- toYaml . | nindent 4 }}
12+
{{- end }}
13+
{{- end }}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# -- Image settings
2+
image:
3+
repository: ghcr.io/faroshq/kedge-agent
4+
tag: "" # defaults to .Chart.AppVersion
5+
pullPolicy: IfNotPresent
6+
7+
imagePullSecrets: []
8+
nameOverride: ""
9+
fullnameOverride: ""
10+
11+
# -- Agent settings
12+
agent:
13+
# -- Site name (required)
14+
siteName: ""
15+
16+
# -- Labels for this site (key=value pairs)
17+
labels: {}
18+
19+
# -- Hub connection settings
20+
hub:
21+
# -- Hub kubeconfig (required)
22+
# Provide via:
23+
# 1. existingSecret - name of a secret containing kubeconfig key
24+
# 2. kubeconfig - inline kubeconfig content (not recommended for production)
25+
existingSecret: ""
26+
kubeconfig: ""
27+
# -- Optional: kubeconfig context to use
28+
context: ""
29+
30+
# -- Optional: separate tunnel URL (defaults to hub URL from kubeconfig)
31+
tunnelURL: ""
32+
33+
resources:
34+
requests:
35+
cpu: 50m
36+
memory: 64Mi
37+
limits:
38+
memory: 256Mi
39+
40+
# -- Service account
41+
serviceAccount:
42+
# -- Create a service account for the agent
43+
create: true
44+
# -- Name of the service account (auto-generated if empty)
45+
name: ""
46+
# -- Annotations for the service account
47+
annotations: {}
48+
49+
# -- RBAC settings
50+
rbac:
51+
# -- Create ClusterRole and ClusterRoleBinding for the agent
52+
# The agent needs cluster-wide permissions to manage workloads
53+
create: true
54+
55+
nodeSelector: {}
56+
tolerations: []
57+
affinity: {}
58+
podAnnotations: {}
59+
podSecurityContext:
60+
fsGroup: 65534
61+
securityContext:
62+
runAsNonRoot: true
63+
runAsUser: 65534
64+
65+
# -- Number of replicas (typically 1 per site)
66+
replicaCount: 1

deploy/charts/kedge-hub/templates/service-hub.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,8 @@ spec:
1111
port: {{ .Values.service.hub.port }}
1212
targetPort: https
1313
protocol: TCP
14+
{{- if and (eq .Values.service.type "NodePort") .Values.service.hub.nodePort }}
15+
nodePort: {{ .Values.service.hub.nodePort }}
16+
{{- end }}
1417
selector:
1518
{{- include "kedge-hub.selectorLabels" . | nindent 4 }}

0 commit comments

Comments
 (0)