SAP BTP Kyma headless kubeconfig with SAP Cloud Identity Services and kyma runtime environment bindings.
Table of Contents
- kubeconfig with the authorization-code authentication flow.
- kubeconfig with the password grant type authentication flow
kubeconfig with the authorization-code authentication flow.
This is the default kubeconfig option with kyma clusters and requires named user(s) be defined with the global SAP ID tenant and have RBAC cluster-admin role binding(s) defined for these SAP ID users as well.
oidc kubeconfig
apiVersion: v1
kind: Config
current-context: garden-kyma--<shoot>-external
clusters:
- name: garden-kyma--<shoot>-external
cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQWs2Z0F3SUJBZ0lRYzRZRXZHOTZLdzRS0tLS0tCg==
server: https://api.<shoot>.kyma.ondemand.com
contexts:
- name: garden-kyma--<shoot>-external
context:
cluster: garden-kyma--<shoot>-external
user: garden-kyma--<shoot>-external
users:
- name: garden-kyma--<shoot>-external
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- get-token
- "--oidc-issuer-url=https://<tenant-name>.accounts.ondemand.com"
- "--oidc-client-id=6fcadde1-2660-466a-8d30-***"
- "--oidc-extra-scope=email"
- "--oidc-extra-scope=openid"
command: kubectl-oidc_login
installHint: |
kubelogin plugin is required to proceed with authentication
# Homebrew (macOS and Linux)
brew install int128/kubelogin/kubelogin
# Krew (macOS, Linux, Windows and ARM)
kubectl krew install oidc-login
# Chocolatey (Windows)
choco install kubelogin
However, such an oidc user based kubeconfig is not suitable for use in headless and/or unmanned environments, for instance, in the remote development pipelines, github action workflows, etc.
kubeconfig with the password grant type authentication flow.
A custom SAP Cloud Identity Service tenant with a public client OIDC application are required to achieve this goal.
The SAP IAS application automation details can be found in the following blog post, namely: Configure Custom SAP IAS tenant with SAP BTP Kyma runtime environment.
kyma custom identity application
resource "btp_subaccount_entitlement" "identity_application" {
subaccount_id = data.btp_subaccount.context.id
service_name = "identity"
plan_name = "application"
}
data "btp_subaccount_service_plan" "identity_application" {
depends_on = [btp_subaccount_entitlement.identity_application]
subaccount_id = data.btp_subaccount.context.id
offering_name = "identity"
name = "application"
}
resource "btp_subaccount_service_instance" "identity_application" {
depends_on = [btp_subaccount_trust_configuration.custom_idp]
subaccount_id = data.btp_subaccount.context.id
name = "ias-local"
serviceplan_id = data.btp_subaccount_service_plan.identity_application.id
parameters = jsonencode({
user-access = "public"
oauth2-configuration = {
grant-types = [
"authorization_code",
"authorization_code_pkce_s256",
"password",
"refresh_token"
],
token-policy = {
token-validity = 3600,
refresh-validity = 15552000,
refresh-usage-after-renewal = "off",
refresh-parallel = 3,
access-token-format = "default"
},
public-client = true,
redirect-uris = [
"https://dashboard.kyma.cloud.sap",
"http://localhost:8000"
]
},
subject-name-identifier = {
attribute = "mail",
fallback-attribute = "none"
},
default-attributes = null,
assertion-attributes = {
email = "mail",
groups = "companyGroups",
first_name = "firstName",
last_name = "lastName",
login_name = "loginName",
mail = "mail",
scope = "companyGroups",
user_uuid = "userUuid",
locale = "language"
},
name = "${var.BTP_KYMA_NAME}-${var.BTP_KYMA_PLAN}-${data.btp_subaccount.context.id}",
display-name = "${var.BTP_KYMA_NAME}-${var.BTP_KYMA_PLAN}"
})
}
Last but not least, fetching a short lived kubeconfig user token requires a technical user's name and password with a public OIDC client of a custom SAP Cloud Identity Services tenant.
The technical user and password should be kept in a secured vault.user token headless kubeconfig
---
apiVersion: v1
kind: Config
current-context: garden-kyma--<shoot>-external
clusters:
- name: garden-kyma--<shoot>-external
cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQWs2Z0F3SUJBZ0lRYzRZRXZHOTZLdzRS0tLS0tCg==
server: https://api.<shoot>.kyma.ondemand.com
contexts:
- name: garden-kyma--<shoot>-external
context:
cluster: garden-kyma--<shoot>-external
user: garden-kyma--<shoot>-external
users:
- name: garden-kyma--<shoot>-external
user:
exec:
apiVersion: "client.authentication.k8s.io/v1"
interactiveMode: "Never"
command: "bash"
args:
- "-c"
- |
set -e -o pipefail
ISSUER=$(btp get services/binding --name ias-local-binding | jq -r '.credentials | { clientid, url: (.url+ "/oauth2/token") }' )
echo ::debug:: ISSUER content: "$(echo "$ISSUER" )" >&2
IDTOKEN=$(curl -X POST $(echo $ISSUER | jq -r '. | .url' ) \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=password' \
-d 'username='"$QUOVADIS_USERNAME" \
-d 'password='"$QUOVADIS_PASSWORD" \
-d 'client_id='$(echo $ISSUER | jq -r '. | .clientid' ) \
-d 'scope=groups, email' \
| jq -r '. | .id_token ' )
# Print decoded token information for debugging purposes
echo ::debug:: JWT content: "$(echo "$IDTOKEN" | jq -c -R 'split(".") | .[1] | @base64d | fromjson')" >&2
cat << EOF
{
"apiVersion": "client.authentication.k8s.io/v1",
"kind": "ExecCredential",
"status": {
"token": "$IDTOKEN"
}
}
EOF
kubeconfig with kymaruntime environment service bindings
This mechanism allows to acquire a short-lived, service account token based kubeconfig during the provisioning of a kymaruntime environment.
An instance of a cis-local plan Cloud Management service must be provisioned as well for this to work.
The kymaruntime kubeconfig is returned from the SAP Provisioning Service environment bindings API, as follows:
kymaruntime kubeconfig
---
apiVersion: v1
kind: Config
current-context: garden-kyma--<shoot>-external
clusters:
- name: garden-kyma--<shoot>-external
cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1ekNDQWsrZ0F3SUJBZ0lSQU42Q0VSVElGSUNBVEUtLS0tLQo=
server: https://api.<shoot>.kyma.ondemand.com
contexts:
- name: garden-kyma--<shoot>-external
context:
cluster: garden-kyma--<shoot>-external
user: garden-kyma--<shoot>-external
users:
- name: garden-kyma--<shoot>-external
user:
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjFxQW56bFp2SnlVNmRwdDBYMnhhbVJLOXV3UjNqOgkyKI-xVJ_LUWqAkm3ek1m4eC8DqMO0WAm4xP-dpwOKho-Uu9-Ls7Y
Glossary
-
SAP BTP Kyma Authentication Configurations
-
Password Grant Type Authentication Setup
-
Kyma Runtime Environment Bindings Configuration
Top comments (1)
Nice blog and informative content,
We are providing Best SAP BTP Training in Hyderabad,
Thanks for sharing with us,
SAP BTP Training in Hyderabad
SAP BTP Online Training in Hyderabad
SAP Training in Hyderabad