在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收
/auth 前缀;如果你通过反向代理或 http-relative-path 明确把 Keycloak 暴露在 /auth 下,以 discovery document 里返回的 endpoint 为准。准备工作
- 一个可用的 Kubernetes 集群和当前
kubectlcontext。 - 本地有
helm、curl、jq(方便简单处理Json)。 - 已经准备好自己的
keycloak-values-staging.yaml和keycloak-secret-staging.yaml。 - 知道目标 Realm 名称,或者安装后先在 Admin Console 里创建。
拉取 Helm chart
在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
helm pull bitnami/keycloak --version 25.2.0 --untar --destination ./在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
helm pull oci://registry-1.docker.io/bitnamicharts/keycloak \
--version 25.2.0 \
--untar \
--destination ./准备 namespace 和 Secret
在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
kubectl create namespace infra-keycloak
kubectl apply -f ./keycloak-secret-staging.yamladmin/admin 是为了本地入门,不应该出现在生产环境。安装 Keycloak
bitnamilegacy/*:在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
helm install keycloak ./keycloak \
--namespace infra-keycloak \
--create-namespace \
--values ./keycloak-values-staging.yaml \
--set image.repository=bitnamilegacy/keycloak \
--set keycloakConfigCli.image.repository=bitnamilegacy/keycloak-config-cli \
--set postgresql.image.repository=bitnamilegacy/postgresql \
--set postgresql.volumePermissions.image.repository=bitnamilegacy/os-shell \
--set postgresql.metrics.image.repository=bitnamilegacy/postgres-exporter \
--set global.security.allowInsecureImages=truehelm upgrade:在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
helm upgrade keycloak ./keycloak \
--namespace infra-keycloak \
--values ./keycloak-values-staging.yaml \
--set image.repository=bitnamilegacy/keycloak \
--set keycloakConfigCli.image.repository=bitnamilegacy/keycloak-config-cli \
--set postgresql.image.repository=bitnamilegacy/postgresql \
--set postgresql.volumePermissions.image.repository=bitnamilegacy/os-shell \
--set postgresql.metrics.image.repository=bitnamilegacy/postgres-exporter \
--set global.security.allowInsecureImages=true在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
kubectl -n infra-keycloak get pods
kubectl -n infra-keycloak get svc在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
kubectl -n infra-keycloak port-forward svc/keycloak 8080:80在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (text)
http://localhost:8080kubectl -n infra-keycloak get svc 的结果为准。先验收路径,不要猜 /auth
在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (text)
http://localhost:8080/realms/<realm>在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (text)
http://localhost:8080/realms/<realm>/.well-known/openid-configuration在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
export KC="http://localhost:8080"
export REALM="my-realm"
curl -fsSL "$KC/realms/$REALM/.well-known/openid-configuration" \
| jq '{issuer, authorization_endpoint, token_endpoint, userinfo_endpoint}'token_endpoint 会长这样:在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (text)
http://localhost:8080/realms/my-realm/protocol/openid-connect/token/auth/realms/...,说明你的部署或反向代理确实把 Keycloak 放在了 /auth 下。反过来,如果你只是照旧文章写了 /auth,但 discovery document 里没有它,后面的 token 请求就会错。这里不要靠记忆,直接信 discovery。用最小 token flow 验收
- Realm 的 OIDC metadata 能正常返回。
- 一个 confidential client 能通过
client_credentials换到 access token。
在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (text)
Client ID: payment-service
Client authentication: On
Service accounts roles: On
Standard flow: Off
Direct access grants: Off在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
export CLIENT_ID="payment-service"
export CLIENT_SECRET="<client-secret>"
curl -s -X POST "$KC/realms/$REALM/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
--data-urlencode "client_secret=$CLIENT_SECRET" \
| jq '{token_type, expires_in, access_token}'access_token,至少说明这几件事已经搞定了:Realm 存在,token endpoint 路径正确,client 是 confidential client,client secret 生效,Keycloak 的 OIDC 基本链路可用。Admin token
master realm 的 admin-cli 换一个 admin token:在 Kubernetes 上安装 Keycloak:从 Helm 到 OIDC 验收 (shell)
export ADMIN_USER="admin"
export ADMIN_PASSWORD="<admin-password>"
export ADMIN_TOKEN=$(
curl -s -X POST "$KC/realms/master/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=admin-cli" \
-d "grant_type=password" \
-d "username=$ADMIN_USER" \
--data-urlencode "password=$ADMIN_PASSWORD" \
| jq -r '.access_token'
)
curl -fsSL "$KC/admin/realms/$REALM/clients" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
| jq 'length'重点检查这几项
helm装的是你想要的 chart,镜像 tag 和 Keycloak 应用版本单独核对过。bitnamilegacy/*只作为临时 fallback,没有被当成长期生产来源。kubectl -n infra-keycloak get pods里 Pod 稳定运行,Service 端口和 port-forward 命令对得上。/.well-known/openid-configuration能返回,并且issuer、token_endpoint是你准备给业务系统使用的地址。- Keycloak 26.x 默认路径没有
/auth;只有你显式配置了反向代理路径或http-relative-path时才带/auth。 client_credentials能拿到 access token。- 如果用了 Admin API 验收,
ADMIN_TOKEN不为空,且能访问目标 Realm 的 clients 列表。