Skip to content

Commit 9505582

Browse files
authored
Merge pull request #310 from jumpstarter-dev/docs/operator-install-and-release-workflow
docs: document operator install flow and release installer workflow
2 parents 24aa76c + 292923f commit 9505582

File tree

7 files changed

+619
-399
lines changed

7 files changed

+619
-399
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Release operator installer
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
permissions:
8+
contents: write
9+
10+
jobs:
11+
publish-operator-installer:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout repository
15+
uses: actions/checkout@v4
16+
with:
17+
fetch-depth: 0
18+
19+
- name: Set up Go
20+
uses: actions/setup-go@v5
21+
with:
22+
go-version-file: controller/deploy/operator/go.mod
23+
24+
- name: Build operator installer manifest
25+
env:
26+
RELEASE_TAG: ${{ github.event.release.tag_name }}
27+
run: |
28+
VERSION="${RELEASE_TAG#v}"
29+
IMG="quay.io/jumpstarter-dev/jumpstarter-operator:${VERSION}"
30+
make -C controller/deploy/operator build-installer IMG="${IMG}"
31+
cp controller/deploy/operator/dist/install.yaml operator-installer.yaml
32+
33+
- name: Upload installer to release assets
34+
env:
35+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36+
RELEASE_TAG: ${{ github.event.release.tag_name }}
37+
run: |
38+
gh release upload "${RELEASE_TAG}" operator-installer.yaml --clobber

python/docs/source/getting-started/configuration/authentication.md

Lines changed: 94 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ Jumpstarter uses internally issued JWT tokens to authenticate clients and
44
exporters by default. You can also configure Jumpstarter to use external OpenID
55
Connect (OIDC) providers.
66

7+
When installing with the operator, authentication is configured directly on the
8+
`Jumpstarter` custom resource, under `spec.authentication`.
9+
10+
For operator installation context, see
11+
[Install with Operator](../installation/service/service-operator.md).
12+
713
To use OIDC with your Jumpstarter installation:
814

9-
1. Set the helm value `jumpstarter-controller.authenticationConfiguration` to a
10-
valid `AuthenticationConfiguration` yaml configuration
15+
1. Set `spec.authentication.jwt` on your `Jumpstarter` resource
1116
2. Configure your OIDC provider to work with Jumpstarter
1217
3. Create users with appropriate OIDC usernames
1318

@@ -22,22 +27,21 @@ Set up Keycloak for Jumpstarter authentication:
2227
- `Valid redirect URIs`: `http://localhost/callback`
2328
- Leave remaining fields as default
2429

25-
2. Use this configuration for
26-
`jumpstarter-controller.authenticationConfiguration` during installation:
30+
2. Configure `spec.authentication.jwt` on your `Jumpstarter` resource:
2731

2832
```yaml
29-
apiVersion: jumpstarter.dev/v1alpha1
30-
kind: AuthenticationConfiguration
31-
jwt:
32-
- issuer:
33-
url: https://<keycloak domain>/realms/<realm name>
34-
certificateAuthority: <PEM encoded CA certificates>
35-
audiences:
36-
- jumpstarter-cli
37-
claimMappings:
38-
username:
39-
claim: preferred_username
40-
prefix: "keycloak:"
33+
spec:
34+
authentication:
35+
jwt:
36+
- issuer:
37+
url: https://<keycloak domain>/realms/<realm name>
38+
certificateAuthority: <PEM encoded CA certificates>
39+
audiences:
40+
- jumpstarter-cli
41+
claimMappings:
42+
username:
43+
claim: preferred_username
44+
prefix: "keycloak:"
4145
```
4246
4347
Note, the HTTPS URL is mandatory, and you only need to include
@@ -172,20 +176,20 @@ $ helm install --namespace dex --wait -f values.yaml dex dex/dex
172176
`jumpstarter-controller.authenticationConfiguration` during installation:
173177

174178
```yaml
175-
apiVersion: jumpstarter.dev/v1alpha1
176-
kind: AuthenticationConfiguration
177-
jwt:
178-
- issuer:
179-
url: https://dex.dex.svc.cluster.local:5556
180-
audiences:
181-
- jumpstarter-cli
182-
audienceMatchPolicy: MatchAny
183-
certificateAuthority: |
184-
<content of pki/ca.crt>
185-
claimMappings:
186-
username:
187-
claim: "name"
188-
prefix: "dex:"
179+
spec:
180+
authentication:
181+
jwt:
182+
- issuer:
183+
url: https://dex.dex.svc.cluster.local:5556
184+
audiences:
185+
- jumpstarter-cli
186+
audienceMatchPolicy: MatchAny
187+
certificateAuthority: |
188+
<content of pki/ca.crt>
189+
claimMappings:
190+
username:
191+
claim: "name"
192+
prefix: "dex:"
189193
```
190194

191195
4. Create clients and exporters with appropriate OIDC usernames. Prefix the full
@@ -225,9 +229,8 @@ $ jmp login --exporter <exporter alias> \
225229

226230
## Reference
227231

228-
The reference section provides a complete example of an
229-
`AuthenticationConfiguration` resource with detailed comments. Use this as a
230-
template for creating your own configuration.
232+
The reference section provides a complete example of `spec.authentication.jwt`
233+
with detailed comments. Use this as a template for your `Jumpstarter` resource.
231234

232235
Key components include:
233236

@@ -237,62 +240,62 @@ Key components include:
237240
- User validation rules
238241

239242
```yaml
240-
apiVersion: jumpstarter.dev/v1alpha1
241-
kind: AuthenticationConfiguration
242-
# JWT authenticators for OIDC-issued tokens
243-
jwt:
244-
- issuer:
245-
# URL of the OIDC provider (must use https://)
246-
url: https://example.com
247-
# Optional: override URL for discovery information
248-
discoveryURL: https://discovery.example.com/.well-known/openid-configuration
249-
# Optional: PEM encoded CA certificates for validation
250-
certificateAuthority: <PEM encoded CA certificates>
251-
# List of acceptable token audiences
252-
audiences:
253-
- my-app
254-
- my-other-app
255-
# Required when multiple audiences are specified
256-
audienceMatchPolicy: MatchAny
257-
# rules applied to validate token claims to authenticate users.
258-
claimValidationRules:
259-
# Validate specific claim values
260-
- claim: hd
261-
requiredValue: example.com
262-
# Alternative: use CEL expressions for complex validation
263-
- expression: 'claims.hd == "example.com"'
264-
message: the hd claim must be set to example.com
265-
- expression: 'claims.exp - claims.nbf <= 86400'
266-
message: total token lifetime must not exceed 24 hours
267-
# Map OIDC claims to Jumpstarter user properties
268-
claimMappings:
269-
# Required: configure username mapping
270-
username:
271-
# JWT claim to use as username
272-
claim: "sub"
273-
# Prefix for username (required when claim is set)
274-
prefix: ""
275-
# Alternative: use CEL expression (mutually exclusive with claim+prefix)
276-
# expression: 'claims.username + ":external-user"'
277-
# Optional: configure groups mapping
278-
groups:
279-
claim: "sub"
280-
prefix: ""
281-
# Alternative: use CEL expression
282-
# expression: 'claims.roles.split(",")'
283-
# Optional: configure UID mapping
284-
uid:
285-
claim: 'sub'
286-
# Alternative: use CEL expression
287-
# expression: 'claims.sub'
288-
# Optional: add extra attributes to UserInfo
289-
extra:
290-
- key: 'example.com/tenant'
291-
valueExpression: 'claims.tenant'
292-
# validation rules applied to the final user object.
293-
userValidationRules:
294-
- expression: "!user.username.startsWith('system:')"
295-
message: 'username cannot used reserved system: prefix'
296-
- expression: "user.groups.all(group, !group.startsWith('system:'))"
297-
message: 'groups cannot used reserved system: prefix'
243+
spec:
244+
authentication:
245+
# JWT authenticators for OIDC-issued tokens
246+
jwt:
247+
- issuer:
248+
# URL of the OIDC provider (must use https://)
249+
url: https://example.com
250+
# Optional: override URL for discovery information
251+
discoveryURL: https://discovery.example.com/.well-known/openid-configuration
252+
# Optional: PEM encoded CA certificates for validation
253+
certificateAuthority: <PEM encoded CA certificates>
254+
# List of acceptable token audiences
255+
audiences:
256+
- my-app
257+
- my-other-app
258+
# Required when multiple audiences are specified
259+
audienceMatchPolicy: MatchAny
260+
# rules applied to validate token claims to authenticate users.
261+
claimValidationRules:
262+
# Validate specific claim values
263+
- claim: hd
264+
requiredValue: example.com
265+
# Alternative: use CEL expressions for complex validation
266+
- expression: 'claims.hd == "example.com"'
267+
message: the hd claim must be set to example.com
268+
- expression: 'claims.exp - claims.nbf <= 86400'
269+
message: total token lifetime must not exceed 24 hours
270+
# Map OIDC claims to Jumpstarter user properties
271+
claimMappings:
272+
# Required: configure username mapping
273+
username:
274+
# JWT claim to use as username
275+
claim: "sub"
276+
# Prefix for username (required when claim is set)
277+
prefix: ""
278+
# Alternative: use CEL expression (mutually exclusive with claim+prefix)
279+
# expression: 'claims.username + ":external-user"'
280+
# Optional: configure groups mapping
281+
groups:
282+
claim: "sub"
283+
prefix: ""
284+
# Alternative: use CEL expression
285+
# expression: 'claims.roles.split(",")'
286+
# Optional: configure UID mapping
287+
uid:
288+
claim: 'sub'
289+
# Alternative: use CEL expression
290+
# expression: 'claims.sub'
291+
# Optional: add extra attributes to UserInfo
292+
extra:
293+
- key: 'example.com/tenant'
294+
valueExpression: 'claims.tenant'
295+
# validation rules applied to the final user object.
296+
userValidationRules:
297+
- expression: "!user.username.startsWith('system:')"
298+
message: 'username cannot use reserved system: prefix'
299+
- expression: "user.groups.all(group, !group.startsWith('system:'))"
300+
message: 'groups cannot use reserved system: prefix'
298301
```

python/docs/source/getting-started/installation/service/index.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ For most users, we recommend starting with a **local installation** to get famil
1111
1212
service-local.md
1313
service-production.md
14+
service-operator.md
1415
```
1516

1617
## Quick Start
1718

1819
**New to Jumpstarter?** Start with the [Local Installation](service-local.md) guide to get up and running quickly on your development machine.
1920

2021
**Ready for production?** See the [Production Deployment](service-production.md) guide for Kubernetes and OpenShift clusters with proper security, monitoring, and ingress configurations.
22+
23+
**Installing with the Kubernetes operator?** Use [Install with Operator](service-operator.md) for `Jumpstarter` CR examples using Kubernetes Ingress or OpenShift Routes.

python/docs/source/getting-started/installation/service/service-local.md

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ Before installing locally, ensure you have:
88

99
- Docker or Podman installed (for kind)
1010
- `kubectl` installed and configured to access your cluster
11-
- [Helm](https://helm.sh/docs/intro/install/) (version 3.x or newer)
1211
- Administrator access to your cluster (required for CRD installation)
1312

1413
## Install with Jumpstarter CLI
@@ -56,7 +55,6 @@ Additional options for cluster creation:
5655
5756
- Custom cluster name: Specify as the first argument (default: `jumpstarter-lab`)
5857
- `--kind <PATH>`: Path to the kind binary to use for cluster management
59-
- `--helm <PATH>`: Path to the Helm binary to install the Jumpstarter service with
6058
- `--force-recreate`: Force recreate the cluster if it already exists (destroys all data)
6159
- `--kind-extra-args`: Pass additional arguments to kind cluster creation
6260
- `--skip-install`: Create the cluster without installing Jumpstarter
@@ -72,7 +70,6 @@ Additional options for cluster creation:
7270
7371
- Custom cluster name: Specify as the first argument (default: `jumpstarter-lab`)
7472
- `--minikube <PATH>`: Path to the minikube binary to use for cluster management
75-
- `--helm <PATH>`: Path to the Helm binary to install the Jumpstarter service with
7673
- `--force-recreate`: Force recreate the cluster if it already exists (destroys all data)
7774
- `--minikube-extra-args`: Pass additional arguments to minikube cluster creation
7875
- `--skip-install`: Create the cluster without installing Jumpstarter
@@ -211,61 +208,12 @@ $ minikube start --extra-config=apiserver.service-node-port-range=8000-9000
211208
```
212209
````
213210

214-
### Install Local Jumpstarter with Helm
211+
### Install Local Jumpstarter with Operator
215212

216-
For manual installation with Helm, use these commands:
217-
218-
````{tab} kind
219-
```{code-block} console
220-
:substitutions:
221-
$ export IP="X.X.X.X" # Enter the IP address of your computer on the local network
222-
$ export BASEDOMAIN="jumpstarter.${IP}.nip.io"
223-
$ export GRPC_ENDPOINT="grpc.${BASEDOMAIN}:8082"
224-
$ export GRPC_ROUTER_ENDPOINT="router.${BASEDOMAIN}:8083"
225-
$ helm upgrade jumpstarter --install oci://quay.io/jumpstarter-dev/helm/jumpstarter \
226-
--create-namespace --namespace jumpstarter-lab \
227-
--set global.baseDomain=${BASEDOMAIN} \
228-
--set jumpstarter-controller.grpc.endpoint=${GRPC_ENDPOINT} \
229-
--set jumpstarter-controller.grpc.routerEndpoint=${GRPC_ROUTER_ENDPOINT} \
230-
--set global.metrics.enabled=false \
231-
--set jumpstarter-controller.grpc.nodeport.enabled=true \
232-
--set jumpstarter-controller.grpc.mode=nodeport \
233-
--version={{controller_version}}
234-
```
235-
````
236-
237-
````{tab} minikube
238-
```{code-block} console
239-
:substitutions:
240-
$ export IP=$(minikube ip)
241-
$ export BASEDOMAIN="jumpstarter.${IP}.nip.io"
242-
$ export GRPC_ENDPOINT="grpc.${BASEDOMAIN}:8082"
243-
$ export GRPC_ROUTER_ENDPOINT="router.${BASEDOMAIN}:8083"
244-
$ helm upgrade jumpstarter --install oci://quay.io/jumpstarter-dev/helm/jumpstarter \
245-
--create-namespace --namespace jumpstarter-lab \
246-
--set global.baseDomain=${BASEDOMAIN} \
247-
--set jumpstarter-controller.grpc.endpoint=${GRPC_ENDPOINT} \
248-
--set jumpstarter-controller.grpc.routerEndpoint=${GRPC_ROUTER_ENDPOINT} \
249-
--set global.metrics.enabled=false \
250-
--set jumpstarter-controller.grpc.nodeport.enabled=true \
251-
--set jumpstarter-controller.grpc.nodeport.port=8082 \
252-
--set jumpstarter-controller.grpc.nodeport.routerPort=8083 \
253-
--set jumpstarter-controller.grpc.mode=nodeport \
254-
--version={{controller_version}}
255-
```
256-
````
213+
For manual installation after creating the local cluster, follow [Install with Operator](service-operator.md). Use a `baseDomain` and endpoint addresses appropriate for your local environment (for example, `nip.io` based hostnames), then apply your `Jumpstarter` CR.
257214

258215
To check the status of the installation, run:
259216

260217
```{code-block} console
261218
$ kubectl get pods -n jumpstarter-lab --watch
262-
NAME READY STATUS RESTARTS AGE
263-
jumpstarter-controller-cc74d879-6b22b 1/1 Running 0 48s
264-
jumpstarter-secrets-w42z4 0/1 Completed 0 48s
265-
```
266-
267-
To uninstall the Helm release, run:
268-
269-
```{code-block} console
270-
$ helm uninstall jumpstarter --namespace jumpstarter-lab
271219
```

0 commit comments

Comments
 (0)