Skip to content

Instantly share code, notes, and snippets.

@ruo91
Last active August 18, 2025 04:03
Show Gist options
  • Save ruo91/69fc0aeb50c60593d09be9c44b323396 to your computer and use it in GitHub Desktop.
Save ruo91/69fc0aeb50c60593d09be9c44b323396 to your computer and use it in GitHub Desktop.
Example - KeyCloak Operator
# Step 1. Create Secret
# oc create secret generic keycloak-temp-admin --from-literal=username=temp-admin --from-literal=password='Test12#$' -n keycloak
# oc create secret generic keycloak-db --from-literal=username=keycloak --from-literal=password='Test12#$' -n keycloak
#
# Step 2. Initialize the Admin Account
# oc rsh keycloak-0
# /opt/keycloak/bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user temp-admin
# /opt/keycloak/bin/kcadm.sh create users -r master -s username=admin -s enabled=true
# /opt/keycloak/bin/kcadm.sh set-password -r master --username admin --new-password 'Test12#$'
# /opt/keycloak/bin/kcadm.sh add-roles --uusername admin --rolename admin
#
# Step 3. Delete the temp-admin Account
# ID=$(/opt/keycloak/bin/kcadm.sh get users -r master -q username=temp-admin | grep '"id"' | head -1 | cut -d'"' -f4)
# /opt/keycloak/bin/kcadm.sh delete users/$ID -r master
#
## 2Core, 2GiB Memory ##
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
labels:
apps: sso
name: keycloak
namespace: keycloak
spec:
proxy:
headers: xforwarded
#trustAddresses:
# - 172.16.0.0/16
# - 10.128.0.0/14
# - 100.64.0.0/16
additionalOptions:
- name: quarkus.http.idle-timeout
value: "60S"
- name: quarkus.http.read-timeout
value: "30S"
- name: quarkus.http.http2
value: "true"
- name: quarkus.http.limits.max-headers
value: "200"
- name: quarkus.http.limits.max-header-size
value: "40K"
- name: quarkus.http.enable-compression
value: "false"
- name: quarkus.http.limits.max-connections
value: "20000"
- name: kc.events.enabled
value: "false"
- name: quarkus.http.threads
value: "64"
- name: quarkus.otel.enabled
value: "false"
- name: quarkus.thread-pool.max-threads
value: "80"
- name: quarkus.thread-pool.core-threads
value: "16"
- name: quarkus.thread-pool.queue-size
value: "4096"
- name: quarkus.thread-pool.growth-resistance
value: "0.4"
- name: quarkus.vertx.event-loops-pool-size
value: "8"
- name: quarkus.vertx.prefer-native-transport
value: "true"
- name: quarkus.transaction-manager.default-transaction-timeout
value: "30S"
- name: metrics-enabled
value: "false"
- name: quarkus.datasource.jdbc.additional-jdbc-properties.preferQueryMode
value: "simple"
- name: quarkus.datasource.jdbc.additional-jdbc-properties.prepareThreshold
value: "1"
- name: http-management-relative-path
value: "/management"
- name: log
value: "console"
- name: log.level
value: "info"
- name: log-console-level
value: "info"
resources:
requests:
cpu: 4
memory: 4Gi
limits:
cpu: 4
memory: 4Gi
unsupported:
podTemplate:
spec:
volumes:
- name: keycloak-credentials-dir
emptyDir:
sizeLimit: 1Mi
containers:
- env:
- name: JAVA_OPTS_KC_HEAP
value: "-Xms2g -Xmx2500m"
- name: JAVA_OPTS_APPEND
value: >-
-XX:-UseG1GC
-XX:+UseZGC
-XX:+ZGenerational
-XX:MaxDirectMemorySize=1g
-XX:+AlwaysPreTouch
-XX:+ExitOnOutOfMemoryError
-XX:+DisableExplicitGC
-XX:ReservedCodeCacheSize=256m
-XX:ActiveProcessorCount=4
-XX:+PerfDisableSharedMem
-Dsun.net.inetaddr.ttl=60
-Dsun.net.inetaddr.negative.ttl=10
-Djava.net.preferIPv4Stack=true
volumeMounts:
- name: keycloak-credentials-dir
mountPath: /.keycloak
db:
port: 5432
schema: public
usernameSecret:
key: username
name: keycloak-db
vendor: postgres
host: postgresql
poolInitialSize: 150
poolMinSize: 150
poolMaxSize: 400
passwordSecret:
key: password
name: keycloak-db
database: keycloakdb
bootstrapAdmin:
user:
secret: keycloak-temp-admin
transaction:
xaEnabled: false
networkPolicy:
enabled: true
ingress:
enabled: true
hostname:
hostname: 'https://keycloak.apps.ocp4.local'
admin: 'https://keycloak.apps.ocp4.local'
strict: true
backchannelDynamic: false
http:
httpEnabled: true
httpPort: 8080
httpsPort: 8443
#tlsSecret: keycloak-certs
httpManagement:
port: 9000
image: 'registry.ocp4.local:5000/keycloak/keycloak:26.1.4'
instances: 1
scheduling:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: Exists
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/worker
operator: Exists
startOptimized: false
---
## 8Core, 8GiB Memory ##
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
labels:
apps: sso
name: keycloak
namespace: keycloak
spec:
proxy:
headers: xforwarded
#trustAddresses:
# - 172.16.0.0/16
# - 10.128.0.0/14
# - 100.64.0.0/16
additionalOptions:
- name: quarkus.http.idle-timeout
value: "60S"
- name: quarkus.http.read-timeout
value: "30S"
- name: quarkus.http.http2
value: "true"
- name: quarkus.http.limits.max-headers
value: "200"
- name: quarkus.http.limits.max-header-size
value: "40K"
- name: quarkus.http.enable-compression
value: "false"
- name: quarkus.http.limits.max-connections
value: "20000"
- name: kc.events.enabled
value: "false"
- name: quarkus.http.threads
value: "128"
- name: quarkus.otel.enabled
value: "false"
- name: quarkus.thread-pool.max-threads
value: "80"
- name: quarkus.thread-pool.core-threads
value: "32"
- name: quarkus.thread-pool.queue-size
value: "8192"
- name: quarkus.thread-pool.growth-resistance
value: "0.4"
- name: quarkus.vertx.event-loops-pool-size
value: "16"
- name: quarkus.vertx.prefer-native-transport
value: "true"
- name: quarkus.transaction-manager.default-transaction-timeout
value: "30S"
- name: metrics-enabled
value: "false"
- name: quarkus.datasource.jdbc.additional-jdbc-properties.preferQueryMode
value: "simple"
- name: quarkus.datasource.jdbc.additional-jdbc-properties.prepareThreshold
value: "1"
- name: http-management-relative-path
value: "/management"
- name: log
value: "console"
- name: log.level
value: "info"
- name: log-console-level
value: "info"
resources:
requests:
cpu: 8
memory: 8Gi
limits:
cpu: 8
memory: 8Gi
unsupported:
podTemplate:
spec:
volumes:
- name: keycloak-credentials-dir
emptyDir:
sizeLimit: 1Mi
containers:
- env:
- name: JAVA_OPTS_KC_HEAP
value: "-Xms6g -Xmx6g"
- name: JAVA_OPTS_APPEND
value: >-
-XX:-UseG1GC
-XX:+UseZGC
-XX:+ZGenerational
-XX:MaxDirectMemorySize=512m
-XX:+AlwaysPreTouch
-XX:+ExitOnOutOfMemoryError
-XX:+DisableExplicitGC
-XX:ReservedCodeCacheSize=256m
-XX:ActiveProcessorCount=8
-XX:+PerfDisableSharedMem
-Dsun.net.inetaddr.ttl=60
-Dsun.net.inetaddr.negative.ttl=10
-Djava.net.preferIPv4Stack=true
volumeMounts:
- name: keycloak-credentials-dir
mountPath: /.keycloak
db:
port: 5432
schema: public
usernameSecret:
key: username
name: keycloak-db
vendor: postgres
host: postgresql
poolInitialSize: 150
poolMinSize: 150
poolMaxSize: 400
passwordSecret:
key: password
name: keycloak-db
database: keycloakdb
bootstrapAdmin:
user:
secret: keycloak-temp-admin
transaction:
xaEnabled: false
networkPolicy:
enabled: true
ingress:
enabled: true
hostname:
hostname: 'https://keycloak.apps.ocp4.local'
admin: 'https://keycloak.apps.ocp4.local'
strict: true
backchannelDynamic: false
http:
httpEnabled: true
httpPort: 8080
httpsPort: 8443
#tlsSecret: keycloak-certs
httpManagement:
port: 9000
image: 'registry.ocp4.local:5000/keycloak/keycloak:26.1.4'
instances: 1
scheduling:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: Exists
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/worker
operator: Exists
startOptimized: false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment