From 025a38c93e84ac10ab7597fa129c72764fd4be7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Thu, 5 Dec 2024 14:33:28 +0100 Subject: [PATCH 1/6] wrote about getting kind up with keycloak, crossplane and a client in keycloak for crossplane to use --- .../assets/replace-user-banner.png | Bin 0 -> 62502 bytes .../assets/service-account-crossplane.png | Bin 0 -> 25004 bytes docs/getting-started/getting-started.md | 94 ++++++++++++++++++ .../kind-kustomize/cluster/cluster.yaml | 9 ++ .../crossplane/create-client.sh | 45 +++++++++ .../crossplane/create-client.yaml | 59 +++++++++++ .../kind-kustomize/keycloak/keycloak.yaml | 69 +++++++++++++ 7 files changed, 276 insertions(+) create mode 100644 docs/getting-started/assets/replace-user-banner.png create mode 100644 docs/getting-started/assets/service-account-crossplane.png create mode 100644 docs/getting-started/getting-started.md create mode 100644 docs/getting-started/kind-kustomize/cluster/cluster.yaml create mode 100644 docs/getting-started/kind-kustomize/crossplane/create-client.sh create mode 100644 docs/getting-started/kind-kustomize/crossplane/create-client.yaml create mode 100644 docs/getting-started/kind-kustomize/keycloak/keycloak.yaml diff --git a/docs/getting-started/assets/replace-user-banner.png b/docs/getting-started/assets/replace-user-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..b68b9df7479331004019a354a14d822be4e5bf8f GIT binary patch literal 62502 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 literal 0 HcmV?d00001 diff --git a/docs/getting-started/assets/service-account-crossplane.png b/docs/getting-started/assets/service-account-crossplane.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c274b9230235718fee3f3ec9d5da8cc90bad0c GIT binary patch literal 25004 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 Si{#&W5E_qlAHg3!fBPTwagIy? literal 0 HcmV?d00001 diff --git a/docs/getting-started/getting-started.md b/docs/getting-started/getting-started.md new file mode 100644 index 0000000..dc35036 --- /dev/null +++ b/docs/getting-started/getting-started.md @@ -0,0 +1,94 @@ + +prereqs: ctlptl, kind, kubectl + +## Keycloak up and running + +This is an express installation of keycloak on new kind cluster. + +``` sh +ctlptl apply -f kind-kustomize/cluster/cluster.yaml + +kubectl apply -f kind-kustomize/keycloak/keycloak.yaml + +kubectl port-forward -n keycloak svc/keycloak 8080:80 +``` + + +``` +❯ ctlptl apply -f kind-kustomize/cluster/cluster.yaml +No kind clusters found. +Creating cluster "provider-keycloak-cluster" ... + ✓ Ensuring node image (kindest/node:v1.31.0) 🖼 + ✓ Preparing nodes 📦 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Joining worker nodes 🚜 +Set kubectl context to "kind-provider-keycloak-cluster" +You can now use your cluster with: + +kubectl cluster-info --context kind-provider-keycloak-cluster + +Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂 +Switched to context "kind-provider-keycloak-cluster". + 🔌 Connected cluster kind-provider-keycloak-cluster to registry ctlptl-registry at localhost:52145 + 👐 Push images to the cluster like 'docker push localhost:52145/alpine' +cluster.ctlptl.dev/kind-provider-keycloak-cluster created + +> kubectl config get-contexts +CURRENT NAME CLUSTER AUTHINFO NAMESPACE +* kind-provider-keycloak-cluster kind-provider-keycloak-cluster kind-provider-keycloak-cluster + +``` + +``` +> kubectl apply -f kind-kustomize/keycloak/keycloak.yaml +namespace/keycloak created +configmap/keycloak-cm created +service/keycloak created +deployment.apps/kc created + +``` + +``` +> kubectl port-forward -n keycloak svc/keycloak 8080:80 +Forwarding from 127.0.0.1:8080 -> 8080 +Forwarding from [::1]:8080 -> 8080 +Handling connection for 8080 +``` + +When surfing into the keycloak UI at http://localhost:8080 you can logon as admin/admin. You are then prompted to replace the temporary admin account with a permanent one. For the purpose of demonstrating or getting started with this crossplane provider you can skip this step. Make sure the new user can log on and has the correct access (typically the admin role) before deleting the temporary user. + +![An orange banner at the top urging the temporary user to be replaced](replace-user-banner.png) + +Refer to the keycloak documentation on how to best harden security for your setup of keycloak and consider using an external database. https://www.keycloak.org/docs/latest/server_admin/#proc-creating-user_server_administration_guide + + +## Installing crossplane + +This is described in better detail on the crossplane main repository, and on their webpage: https://docs.crossplane.io/latest/software/install/ + +``` sh +helm repo add crossplane-stable https://charts.crossplane.io/stable +helm repo update +helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane + +``` + +This will bootstrap a working crossplane client in the master realm with the admin role. You should consider learning to set up a similar client through the UI or through the API in a manner which fits your security practices. + +``` sh +# creates a config map with the script to run +kubectl create configmap client-script -n keycloak --from-file=kind-kustomize/crossplane/create-client.sh + +# creates a job to run the script from within kubernetes. +kubectl apply -f kind-kustomize/crossplane/create-client.yaml + +``` + +This will create the keycloak-provider and configure it to use a client withing the master realm to perform actions there. + +The settings for the client will also make it appear as a service-account user in the realm. + +![Displays the crossplane service-account user](assets/service-account-crossplane.png) diff --git a/docs/getting-started/kind-kustomize/cluster/cluster.yaml b/docs/getting-started/kind-kustomize/cluster/cluster.yaml new file mode 100644 index 0000000..e391d33 --- /dev/null +++ b/docs/getting-started/kind-kustomize/cluster/cluster.yaml @@ -0,0 +1,9 @@ +apiVersion: ctlptl.dev/v1alpha1 +kind: Cluster +product: kind +registry: ctlptl-registry +kindV1Alpha4Cluster: + name: provider-keycloak-cluster + nodes: + - role: worker + - role: control-plane \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/crossplane/create-client.sh b/docs/getting-started/kind-kustomize/crossplane/create-client.sh new file mode 100644 index 0000000..ff2b24c --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/create-client.sh @@ -0,0 +1,45 @@ +# uses curl to invoke the keycloak REST api for crossplane +# gets a token for the master realm +echo "Logging on as admin in keycloak to create the crossplane client and grant it the admin role in the master realm" +mastertoken=$(curl -k -g -d "client_id=admin-cli" -d "username=admin" -d "password=admin" -d "grant_type=password" -d "client_secret=" "http://keycloak.keycloak:80/realms/master/protocol/openid-connect/token" | sed 's/.*access_token":"//g' | sed 's/".*//g'); +# echo $mastertoken; + +id="9d2308c3-8972-40cf-9cca-1256745c16d4"; +url="http://keycloak.keycloak:80/admin/realms/master"; +clienturl="$url/clients/$id"; + +# creates a new client named "crossplane" +curl -X POST -k -g "$url/clients" \ +-H "Authorization: Bearer $mastertoken" \ +-H "Content-Type: application/json" \ +--data-raw ' +{ + "id":"'$id'", + "name":"crossplane", + "clientId":"crossplane", + "secret":"xppw_OJKzQjuBoyPlIEePgiWg", + "clientAuthenticatorType":"client-secret", + "serviceAccountsEnabled":"true", + "standardFlowEnabled":"false" +}' + +# GETs the service-account-user for the client - GET $url/clients/{id}/service-account-user +userid=$(curl -X GET -k -g "$clienturl/service-account-user" -H "Authorization: Bearer $mastertoken" | sed 's/.*id":"//g' | sed 's/".*//g') + +# lists available realm roles +# GET /{realm}/users/{id}/role-mappings/realm/available +roles=$(curl -X GET -k -g -H "Authorization: Bearer $mastertoken" "$url/roles") + +# gets the id of the admin role +admin_id=$(echo $roles | jq -r '.[] | select(.name == "admin") | .id') + +# adds service account role admin to the client's user +curl -X POST -k -g "$url/users/$userid/role-mappings/realm/" \ +-H "Authorization: Bearer $mastertoken" \ +-H "Content-Type: application/json" \ +--data-raw '[ +{ + "id":"'$admin_id'", + "name":"admin" +} +]' \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/crossplane/create-client.yaml b/docs/getting-started/kind-kustomize/crossplane/create-client.yaml new file mode 100644 index 0000000..2e9be63 --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/create-client.yaml @@ -0,0 +1,59 @@ +# The pod for this job should mount a volume that will be created from a config map containing a file with a bash script that it runs +apiVersion: batch/v1 +kind: Job +metadata: + name: create-client-crossplane + namespace: keycloak +spec: + backoffLimit: 1 + template: + spec: + restartPolicy: Never + initContainers: + - command: + - sh + - -c + - | + set -x; + echo "Waiting for master realm to become ready..." + while [ $(curl -sw '%{http_code}' "http://keycloak.keycloak/realms/master" -o /dev/null) -ne 200 ]; do + sleep 15; + done; + + echo "$SVC_HOST:$SVC_PORT connection OK ✓" + image: dwdraju/alpine-curl-jq + imagePullPolicy: IfNotPresent + name: svcchecker + resources: + limits: + cpu: 20m + memory: 32Mi + requests: + cpu: 20m + memory: 32Mi + securityContext: + allowPrivilegeEscalation: false + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + containers: + - name: bash + image: dwdraju/alpine-curl-jq + command: ["bash"] + args: ["/opt/script/create-client.sh"] + volumeMounts: + - name: client-script + mountPath: /opt/script/ + resources: + limits: + cpu: 100m + memory: 32Mi + requests: + cpu: 100m + memory: 32Mi + volumes: + - name: client-script + configMap: + name: client-script diff --git a/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml b/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml new file mode 100644 index 0000000..9b522b2 --- /dev/null +++ b/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml @@ -0,0 +1,69 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: keycloak +--- +apiVersion: v1 +data: + KC_BOOTSTRAP_ADMIN_PASSWORD: admin + KC_BOOTSTRAP_ADMIN_USERNAME: admin + KC_HOSTNAME: http://localhost:8080 + KC_LOG_LEVEL: info +kind: ConfigMap +metadata: + labels: + app: keycloak + name: keycloak-cm + namespace: keycloak +--- +apiVersion: v1 +kind: Service +metadata: + name: keycloak + namespace: keycloak +spec: + ports: + - name: http + port: 80 + targetPort: 8080 + selector: + app: keycloak + type: ClusterIP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + await: service + labels: + app: keycloak + name: kc + namespace: keycloak +spec: + replicas: 1 + selector: + matchLabels: + app: keycloak + template: + metadata: + labels: + app: keycloak + app.kubernetes.io/name: keycloak + spec: + containers: + - args: + - start-dev + envFrom: + - configMapRef: + name: keycloak-cm + image: quay.io/keycloak/keycloak:26.0.2 + name: keycloak + ports: + - containerPort: 8080 + resources: + limits: + cpu: 1000m + memory: 2Gi + requests: + cpu: 250m + memory: 500Mi From 70e880e5ab6a841a534b78c630368661fa90cb23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Thu, 5 Dec 2024 14:50:32 +0100 Subject: [PATCH 2/6] wrote about configuring the provider --- docs/getting-started/getting-started.md | 23 +++++++++++++--- .../kind-kustomize/crossplane/provider.yaml | 6 +++++ .../crossplane/providerconfig.yaml | 26 +++++++++++++++++++ .../kind-kustomize/test-realm/realm.yaml | 10 +++++++ 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 docs/getting-started/kind-kustomize/crossplane/provider.yaml create mode 100644 docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml create mode 100644 docs/getting-started/kind-kustomize/test-realm/realm.yaml diff --git a/docs/getting-started/getting-started.md b/docs/getting-started/getting-started.md index dc35036..615dddc 100644 --- a/docs/getting-started/getting-started.md +++ b/docs/getting-started/getting-started.md @@ -67,7 +67,9 @@ Refer to the keycloak documentation on how to best harden security for your setu ## Installing crossplane -This is described in better detail on the crossplane main repository, and on their webpage: https://docs.crossplane.io/latest/software/install/ +The procedure to install crossplane is described in better detail on the crossplane main repository, and on their webpage: https://docs.crossplane.io/latest/software/install/ + +Here is a minimal example to get up and running with everything you need. ``` sh helm repo add crossplane-stable https://charts.crossplane.io/stable @@ -76,7 +78,7 @@ helm install crossplane --namespace crossplane-system --create-namespace crosspl ``` -This will bootstrap a working crossplane client in the master realm with the admin role. You should consider learning to set up a similar client through the UI or through the API in a manner which fits your security practices. +The following step will bootstrap a working client in the master realm with the admin role that crossplane will use in a future step. You should consider learning to set up a similar client through the UI or through the API in a manner which fits your security practices. ``` sh # creates a config map with the script to run @@ -87,8 +89,23 @@ kubectl apply -f kind-kustomize/crossplane/create-client.yaml ``` -This will create the keycloak-provider and configure it to use a client withing the master realm to perform actions there. +We can now create the keycloak crossplane provider and configure it to use the client withing the master realm to perform actions there. The settings for the client will also make it appear as a service-account user in the realm. ![Displays the crossplane service-account user](assets/service-account-crossplane.png) + +``` sh +# deploys the keycloak provider +kubectl apply -f ./kind-kustomize/crossplane/provider.yaml + +# awaits the creation of the custom resource defintions, before creating the keycloak provider configuration +kubectl wait --for=condition=established crd providerconfigs.keycloak.crossplane.io --timeout=30s +kubectl apply -f ./kind-kustomize/crossplane/providerconfig.yaml +``` + +Finally we can try out using our keycloak crossplane provider, here is an example of creating a new realm. + +``` sh +kubectl apply -f ./kind-kustomize/test-realm/realm.yaml +``` diff --git a/docs/getting-started/kind-kustomize/crossplane/provider.yaml b/docs/getting-started/kind-kustomize/crossplane/provider.yaml new file mode 100644 index 0000000..5941dae --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/provider.yaml @@ -0,0 +1,6 @@ +apiVersion: pkg.crossplane.io/v1 +kind: Provider +metadata: + name: provider-keycloak +spec: + package: xpkg.upbound.io/crossplane-contrib/provider-keycloak:v1.8.0 diff --git a/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml b/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml new file mode 100644 index 0000000..1cd8f5d --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml @@ -0,0 +1,26 @@ +apiVersion: v1 +kind: Secret +metadata: + name: keycloak-credentials + namespace: crossplane-system + labels: + type: provider-credentials +type: Opaque +stringData: + client_id: "crossplane" + client_secret: "xppw_OJKzQjuBoyPlIEePgiWg" + url: "http://keycloak.keycloak.svc.cluster.local" + realm: "master" +--- +apiVersion: keycloak.crossplane.io/v1beta1 +kind: ProviderConfig +metadata: + name: keycloak-config + namespace: crossplane-system +spec: + credentials: + source: Secret + secretRef: + name: keycloak-credentials + key: credentials + namespace: crossplane-system \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/test-realm/realm.yaml b/docs/getting-started/kind-kustomize/test-realm/realm.yaml new file mode 100644 index 0000000..2ba1376 --- /dev/null +++ b/docs/getting-started/kind-kustomize/test-realm/realm.yaml @@ -0,0 +1,10 @@ +apiVersion: realm.keycloak.crossplane.io/v1alpha1 +kind: Realm +metadata: + name: test-realm + namespace: keycloak +spec: + forProvider: + realm: "test-realm" + providerConfigRef: + name: "keycloak-config" \ No newline at end of file From 66cff457c9decfbb70bea0a7897975828ca45ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Thu, 5 Dec 2024 16:19:31 +0100 Subject: [PATCH 3/6] wrote about using built in objects XR to showcase some more automation --- .../assets/update-temporary-password.png | Bin 0 -> 69656 bytes docs/getting-started/getting-started.md | 40 ++++++++++-- .../composition.yaml | 46 ++++++++++++++ .../keycloak-built-in-objects/functions.yaml | 34 +++++++++++ .../xr-test-realm.yaml | 20 ++++++ .../keycloak-built-in-objects/xrd.yaml | 57 ++++++++++++++++++ .../crossplane/providerconfig.yaml | 13 ++-- .../kind-kustomize/test-realm/admin-user.yaml | 47 +++++++++++++++ 8 files changed, 246 insertions(+), 11 deletions(-) create mode 100644 docs/getting-started/assets/update-temporary-password.png create mode 100644 docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/composition.yaml create mode 100644 docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/functions.yaml create mode 100644 docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xr-test-realm.yaml create mode 100644 docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xrd.yaml create mode 100644 docs/getting-started/kind-kustomize/test-realm/admin-user.yaml diff --git a/docs/getting-started/assets/update-temporary-password.png b/docs/getting-started/assets/update-temporary-password.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd395c5bcd1f1c5158b633f7e62f65127e93464 GIT binary patch literal 69656 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

iz{T}9$^zF zO!12#@V)Qe8|{h5A4qkJIMsXGh173(PAG3m`L@A=d(^Ul2)3-?DPp5hg3f#kY8KeXBgZzl@bIa>s4V5~ymaM=2dbX#G z{m*{zBTH+aAJIHO zDxi4-K&8Uc@oEWUN+r<}^;TWvWc_1vR&{&C7aQHS*7VIj=s-27 zK6LMzBd#Hw|0kkNV&ZMo!j(ixuFEUpee@W7?%~gsq3oJGRfCv9sxw_uQXwQsJTvF) z=tD}yK*A5h;6f|W`_Qck;XnkCnzqZUZ2U?bKl;LDf5uQ>_k3HYtIal=KGk1Qt5w7M zhx_@9#j~YNn>sD1zClwwKMKRs{`3lq0t<@&FbqOcrB_=BqUh9Dcqk=DjC@gLeCRL6 zqNhRrK^lJ2xP`$3f6}3k(NxhBkKJdFJaW4|`mpHHJ8b^EXH_QE&74g25{7vSc_X}n zMr|HW#y|OS)ij5@B40#3os#+!ALMrK=-;_hHuz^PFqY&&XSqfGNgTY{xMAps^$i2V z0GB*?l}2Cqm?NIPSHJLeOE#rkruQE)k}<;1xCmZ;wLy%i4_RY#6^nU_cW=^0$Sonr zLH-5Wl-_yUot`HF*-}27+@tRLCSRd`H>FTG8A-wAKu36!pZCi9$&ai-zOhAk+)U`4 zHn`AG5-a*D0qJ6skcjnzf3Xl!+3+%Sx;p$9IH`*($h<%Zz41&8bJRBp zu*|IZ@bvOPKGIZ< zmqqdH1#b&YKZDJyr17i&-PJ~`5hgvk{@Un{He0}NWlWjA>8DVdpV&~7r1R6TFNV=! zu0B^QjhV9kbe+yMIlN(-6lC?5=pP2&3F7IW@Ku^CL*1AsHin1$hdgCJNoif;>_S8UxQez&XvctRjK)QQ2gqV*;i2 zFywrIa%qi)*yG&sG|JPK6owBBvx^tW37`wYa+r`@((wEB__@FBCtr1lWT16?8-btW zl*Lf?o~&oU-gsTl*gOGUusf{_sjTf4A5fg z>&WlFHLit?uR^8!*ePH97Pk8(hm*INIIki9x#ry%qha6C660-?U;o%*?>(=O@s`IE zIbBt$hZAr4RTpif{g_6UdW3DCFwq`(bha%(9}_2O3@R@tdnPOGLRROKJ{6Jv)mgp> zYb?2uWK5w3?c$xcW@xm8@s!%-f+>^gke+*F$eBRsihF*2-Sc#kpJ!|7D8K1?(`=Hu zG`-YF6BlA)X#DU~zuLY?y zR(a+6=}IL$FMeF5@kTqwKHTU#f9HjGvI+Brn(Fgk+GL6t|IS>bJWk#Z%B47;BN!Eg z&3uzD^{X$Qg!REgTH_4Gs#_%OCd=yXpnFnK%@!|2rF;-o7sV*N&%H#8h zNaB>of5lKhU(~j^mpLH6!i#j`qyN!?_XVZMl>3I$Ut*=Xr;N-oZ)d8YUq<95?6E56 zX-OA^e2gof_ati;y+K&xFKt55BhP^-&dVT2;+Qs2go#aUai6!}hc3fbe$|9Ohuui{ zANiBZ8VC>9r+lO!w6o^J6_6>9I|zx9f^n35sZZ%0A2%t=)xr-WrH4C{tTDD+3(_G! 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

qwZz1vm$NLAQ)8F$@o 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 kubectl config get-contexts -CURRENT NAME CLUSTER AUTHINFO NAMESPACE -* kind-provider-keycloak-cluster kind-provider-keycloak-cluster kind-provider-keycloak-cluster - ``` ``` @@ -52,6 +48,9 @@ deployment.apps/kc created ``` ``` +> kubectl wait --for=condition=Available deployment kc -n keycloak --timeout=180s +deployment.apps/kc condition met + > kubectl port-forward -n keycloak svc/keycloak 8080:80 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080 @@ -60,7 +59,7 @@ Handling connection for 8080 When surfing into the keycloak UI at http://localhost:8080 you can logon as admin/admin. You are then prompted to replace the temporary admin account with a permanent one. For the purpose of demonstrating or getting started with this crossplane provider you can skip this step. Make sure the new user can log on and has the correct access (typically the admin role) before deleting the temporary user. -![An orange banner at the top urging the temporary user to be replaced](replace-user-banner.png) +![An orange banner at the top urging the temporary user to be replaced](assets/replace-user-banner.png) Refer to the keycloak documentation on how to best harden security for your setup of keycloak and consider using an external database. https://www.keycloak.org/docs/latest/server_admin/#proc-creating-user_server_administration_guide @@ -100,6 +99,7 @@ The settings for the client will also make it appear as a service-account user i kubectl apply -f ./kind-kustomize/crossplane/provider.yaml # awaits the creation of the custom resource defintions, before creating the keycloak provider configuration +# todo: Error from server (NotFound): customresourcedefinitions.apiextensions.k8s.io "providerconfigs.keycloak.crossplane.io" not found kubectl wait --for=condition=established crd providerconfigs.keycloak.crossplane.io --timeout=30s kubectl apply -f ./kind-kustomize/crossplane/providerconfig.yaml ``` @@ -109,3 +109,31 @@ Finally we can try out using our keycloak crossplane provider, here is an exampl ``` sh kubectl apply -f ./kind-kustomize/test-realm/realm.yaml ``` + +If we want to observe the new realm to be able to use data generated inside it we can leverage existing functions for the provider. + +``` +kubectl apply -f ./kind-kustomize/crossplane/keycloak-built-in-objects/xrd.yaml +kubectl apply -f ./kind-kustomize/crossplane/keycloak-built-in-objects/composition.yaml +kubectl apply -f ./kind-kustomize/crossplane/keycloak-built-in-objects/functions.yaml +# written specifically for the test-realm +kubectl apply -f ./kind-kustomize/crossplane/keycloak-built-in-objects/xr-test-realm.yaml +``` + +Once synced the observable default items will all be available through kube-api. + +``` sh +kubectl get roles.role.keycloak.crossplane.io +``` + +This will then allow us to reference them in crossplane like in the example below that creates a user in the new role and assigns them the administrative role. The format is `builtin---`. Thus for role *realm-admin* in the realm *test-realm* which is a client role for the client *realm-management* the name would be `builtin-test-realm-realm-management-realm-admin` :) + +``` sh +kubectl apply -f ./kind-kustomize/test-realm/admin-user.yaml +``` + +Once this has synched, you can surf to the security admin console of the test-realm, sign in with testadmin/testadmin and you will be prompted to update your temporary password for the user testadmin. + +http://localhost:8080/admin/test-realm/console/ + +![update-temporary-password](assets/update-temporary-password.png) \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/composition.yaml b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/composition.yaml new file mode 100644 index 0000000..338fc04 --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/composition.yaml @@ -0,0 +1,46 @@ +apiVersion: apiextensions.crossplane.io/v1 +kind: Composition +metadata: + name: keycloak-builtin-objects +spec: + compositeTypeRef: + apiVersion: keycloak.crossplane.io/v1alpha1 + kind: XBuiltinObjects + mode: Pipeline + pipeline: + - step: pull-provider-configs + functionRef: + name: function-extra-resources + input: + apiVersion: extra-resources.fn.crossplane.io/v1beta1 + kind: Input + spec: + extraResources: + - kind: Secret + into: secrets + apiVersion: v1 + type: Selector + selector: + minMatch: 1 + maxMatch: 100 + matchLabels: + - key: type + type: Value + value: provider-credentials + - kind: Role + into: roles + apiVersion: role.keycloak.crossplane.io/v1alpha1 + type: Selector + selector: + minMatch: 0 + maxMatch: 20 + matchLabels: + - key: type + type: Value + value: modifiedrole + - step: keycloak-builtin-objects + functionRef: + name: function-keycloak-builtin-objects + - step: automatically-detect-ready-composed-resources + functionRef: + name: function-auto-ready \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/functions.yaml b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/functions.yaml new file mode 100644 index 0000000..e2bc3f4 --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/functions.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: pkg.crossplane.io/v1beta1 +kind: Function +metadata: + name: function-extra-resources + annotations: + # This tells crossplane beta render to connect to the function locally. + #render.crossplane.io/runtime: Development +spec: + # This is ignored when using the Development runtime. + package: xpkg.upbound.io/crossplane-contrib/function-extra-resources:v0.0.3 +--- +apiVersion: pkg.crossplane.io/v1beta1 +kind: Function +metadata: + name: function-auto-ready + annotations: + # This tells crossplane beta render to connect to the function locally. + #render.crossplane.io/runtime: Development +spec: + # This is ignored when using the Development runtime. + package: xpkg.upbound.io/crossplane-contrib/function-auto-ready:v0.2.1 +--- +apiVersion: pkg.crossplane.io/v1beta1 +kind: Function +metadata: + name: function-keycloak-builtin-objects + #annotations: + # # This tells crossplane beta render to connect to the function locally. + # render.crossplane.io/runtime: Development +spec: + # This is ignored when using the Development runtime. + package: registry.gitlab.com/corewire/images/crossplane/function-keycloak-builtin-objects:v1.0.0 + packagePullPolicy: Always diff --git a/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xr-test-realm.yaml b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xr-test-realm.yaml new file mode 100644 index 0000000..779c802 --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xr-test-realm.yaml @@ -0,0 +1,20 @@ +--- +# Example for a custom realm (custom realms have different builtin clients/roles than the master realm) +apiVersion: keycloak.crossplane.io/v1alpha1 +kind: XBuiltinObjects +metadata: + name: keycloak-builtin-objects-dev +spec: + providerConfigName: keycloak-config + providerSecretName: keycloak-credentials + realm: test-realm + builtinClients: + - account + - account-console + - admin-cli + - broker + - realm-management + - security-admin-console + builtinRealmRoles: + - offline_access + - uma_authorization \ No newline at end of file diff --git a/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xrd.yaml b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xrd.yaml new file mode 100644 index 0000000..5930757 --- /dev/null +++ b/docs/getting-started/kind-kustomize/crossplane/keycloak-built-in-objects/xrd.yaml @@ -0,0 +1,57 @@ +apiVersion: apiextensions.crossplane.io/v1 +kind: CompositeResourceDefinition +metadata: + name: xbuiltinobjects.keycloak.crossplane.io +spec: + group: keycloak.crossplane.io + names: + kind: XBuiltinObjects + plural: xbuiltinobjects + versions: + - name: v1alpha1 + served: true + referenceable: true + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + properties: + realm: + type: string + description: Realm to import the builtin clients/roles from + builtinClients: + type: array + items: + type: string + description: List of clients to import from the realm + builtinRealmRoles: + type: array + items: + type: string + enum: + - offline_access + - uma_authorization + - admin + - create-realm + - default-roles-master + description: List of realm roles to import from the realm + builtinAuthenticationFlows: + type: array + items: + type: string + description: List of authentication flows to import from the realm + providerConfigName: + type: string + description: Name of the provider config to attach to the imported clients/roles + providerSecretName: + type: string + description: Name of the secret containing the provider credentials (Secret must have a label with key=type and value=provider-credentials to be found) + required: + - providerConfigName + - providerSecretName + - realm + required: + - spec + diff --git a/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml b/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml index 1cd8f5d..e2c2cc2 100644 --- a/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml +++ b/docs/getting-started/kind-kustomize/crossplane/providerconfig.yaml @@ -6,11 +6,14 @@ metadata: labels: type: provider-credentials type: Opaque -stringData: - client_id: "crossplane" - client_secret: "xppw_OJKzQjuBoyPlIEePgiWg" - url: "http://keycloak.keycloak.svc.cluster.local" - realm: "master" +stringData: # these have to be in a credentials json when used with the xrd XBuiltinObjects + credentials: | + { + "client_id": "crossplane", + "client_secret": "xppw_OJKzQjuBoyPlIEePgiWg", + "url": "http://keycloak.keycloak.svc.cluster.local", + "realm": "master" + } --- apiVersion: keycloak.crossplane.io/v1beta1 kind: ProviderConfig diff --git a/docs/getting-started/kind-kustomize/test-realm/admin-user.yaml b/docs/getting-started/kind-kustomize/test-realm/admin-user.yaml new file mode 100644 index 0000000..4bb3f43 --- /dev/null +++ b/docs/getting-started/kind-kustomize/test-realm/admin-user.yaml @@ -0,0 +1,47 @@ +apiVersion: user.keycloak.crossplane.io/v1alpha1 +kind: User +metadata: + name: testadmin + namespace: keycloak +spec: + forProvider: + realmId: "test-realm" + username: "testadmin" + firstName: "Test" + lastName: "Admin" + email: "testadmin@keycloak.keycloak" + initialPassword: + - temporary: true + valueSecretRef: + namespace: "keycloak" + name: "testadmin-temp-credentials" + key: "password" + providerConfigRef: + name: "keycloak-config" +--- +apiVersion: v1 +kind: Secret +metadata: + name: testadmin-temp-credentials + namespace: keycloak + labels: + type: user-temporary-credentials +type: Opaque +stringData: + password: "testadmin" +--- +apiVersion: user.keycloak.crossplane.io/v1alpha1 +kind: Roles +metadata: + name: test-realm-testadmin + namespace: keycloak +spec: + forProvider: + realmId: "test-realm" + roleIdsRefs: + - name: builtin-test-realm-realm-management-realm-admin + - name: builtin-test-realm-account-manage-account + userIdRef: + name: testadmin + providerConfigRef: + name: "keycloak-config" From 7adfc8ea97eb620d5623079958e299e7325ef55f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Fri, 6 Dec 2024 13:13:24 +0100 Subject: [PATCH 4/6] added readiness probe for the master realm to avoid the service port forward to fail connection --- docs/getting-started/kind-kustomize/keycloak/keycloak.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml b/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml index 9b522b2..993412a 100644 --- a/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml +++ b/docs/getting-started/kind-kustomize/keycloak/keycloak.yaml @@ -67,3 +67,10 @@ spec: requests: cpu: 250m memory: 500Mi + readinessProbe: + httpGet: + path: /realms/master + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 6 From 2f9110516468cbef436e40518228b1b3d492be82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Fri, 6 Dec 2024 13:13:39 +0100 Subject: [PATCH 5/6] Rewrote intro / prereq --- docs/getting-started/getting-started.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/getting-started/getting-started.md b/docs/getting-started/getting-started.md index 01ec40b..84b2689 100644 --- a/docs/getting-started/getting-started.md +++ b/docs/getting-started/getting-started.md @@ -1,5 +1,12 @@ +# Getting started -prereqs: ctlptl, kind, kubectl +This guide will let you set up everything to try out crossplane-contrib/provider-keycloak on a fresh kind cluster. + +## Prerequisites + +[ctlptl](https://github.com/tilt-dev/ctlptl), [kind](https://kind.sigs.k8s.io/), [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl), [helm](https://helm.sh/docs/intro/install/) + +This example is written with linux in mind, but it will work on Windows with PowerShell 7 as well. ## Keycloak up and running @@ -97,9 +104,7 @@ The settings for the client will also make it appear as a service-account user i ``` sh # deploys the keycloak provider kubectl apply -f ./kind-kustomize/crossplane/provider.yaml - -# awaits the creation of the custom resource defintions, before creating the keycloak provider configuration -# todo: Error from server (NotFound): customresourcedefinitions.apiextensions.k8s.io "providerconfigs.keycloak.crossplane.io" not found +sleep 3 kubectl wait --for=condition=established crd providerconfigs.keycloak.crossplane.io --timeout=30s kubectl apply -f ./kind-kustomize/crossplane/providerconfig.yaml ``` @@ -136,4 +141,12 @@ Once this has synched, you can surf to the security admin console of the test-re http://localhost:8080/admin/test-realm/console/ -![update-temporary-password](assets/update-temporary-password.png) \ No newline at end of file +![update-temporary-password](assets/update-temporary-password.png) + +## clean up + +To delete the cluster you created with ctlptl, run the following. + +``` sh +ctlptl delete -f kind-kustomize/cluster/cluster.yaml +``` \ No newline at end of file From 798c511ada8c8b98854827a1debb7973afbb9379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Fri, 6 Dec 2024 13:37:03 +0100 Subject: [PATCH 6/6] set up a longer wait to ensure the crd would not throw an error. --- docs/getting-started/getting-started.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/getting-started.md b/docs/getting-started/getting-started.md index 84b2689..f1bc577 100644 --- a/docs/getting-started/getting-started.md +++ b/docs/getting-started/getting-started.md @@ -104,8 +104,10 @@ The settings for the client will also make it appear as a service-account user i ``` sh # deploys the keycloak provider kubectl apply -f ./kind-kustomize/crossplane/provider.yaml -sleep 3 -kubectl wait --for=condition=established crd providerconfigs.keycloak.crossplane.io --timeout=30s +echo "Waiting for the required CRDs to show up..." +sleep 10 +kubectl wait --for=condition=established crd providerconfigs.keycloak.crossplane.io --timeout=15s + kubectl apply -f ./kind-kustomize/crossplane/providerconfig.yaml ```