Pattern 6: API-M Deployment with IS as Key Manager¶
This deployment consists of a single API-M node with a single API-M runtime with IS configured as a third party key manager.
Contents¶
- Pattern 6: API-M Deployment with IS as Key Manager
- Contents
- Prerequisites
- Minimal Configuration
- Further IS Customizations
- Configuration
Prerequisites¶
Before you begin, ensure you have the following prerequisites in place:
Set Up Basic Configurations¶
Info
The following tools and configurations are necessary for deploying WSO2 API-M in a Kubernetes environment.
- Install the required tools:
- Git
- Helm
-
Ensure you have a running Kubernetes cluster.
-
Install the NGINX Ingress Controller.
-
Add the WSO2 Helm chart repository:
Build WSO2 Identity Server Docker Image¶
- This deployment pattern uses WSO2 Identity Server 7.x as a third-party Key Manager.
- Download the WSO2 Identity Server Docker image from DockerHub or use the WSO2 Private Docker Registry if you have an active WSO2 subscription.
- Since WSO2 IS 7.x needs to be configured as a Key Manager for WSO2 API Manager, you need to create a custom Docker image with the necessary configurations and extensions.
-
Below is a sample Dockerfile to build a custom WSO2 IS image for use as a Key Manager:
FROM docker.wso2.com/wso2is:7.1.0.0 ARG USER=wso2carbon ARG USER_HOME=/home/${USER} ARG WSO2_SERVER_NAME=wso2is ARG WSO2_SERVER_VERSION=7.1.0 ARG WSO2_SERVER=${WSO2_SERVER_NAME}-${WSO2_SERVER_VERSION} ARG WSO2_SERVER_HOME=${USER_HOME}/${WSO2_SERVER} # Add notification event handler JAR for API Manager integration ADD --chown=wso2carbon:wso2 https://maven.wso2.org/nexus/content/repositories/releases/org/wso2/km/ext/wso2is/wso2is.notification.event.handlers/2.0.5/wso2is.notification.event.handlers-2.0.5.jar ${WSO2_SERVER_HOME}/repository/components/dropins
-
After building your custom Docker image, push it to your container registry so it can be accessed by your Kubernetes cluster:
Configure WSO2 Identity Server as Key Manager¶
This section explains how to configure WSO2 Identity Server 7.x as a Key Manager for WSO2 API Manager. In this deployment pattern, both API Manager and Identity Server run as separate containerized applications in the Kubernetes cluster.
Info
Before you begin: You need to import the public certificate of the WSO2 Identity Server 7.x to the truststore of the WSO2 API Manager, and vice-versa. For information on importing the certificates, see the Importing certificates to the truststore guide.
To configure WSO2 Identity Server 7.x to work as a Key Manager with WSO2 API Manager, you need to apply the following configurations:
-
Configure WSO2 Identity Server using the Helm chart's values.yaml file:
deploymentToml: extraConfigs: | [oauth] authorize_all_scopes = true [[resource.access_control]] context="(.*)/scim2/Me" secure=true http_method="GET" cross_tenant=true permissions=[] scopes=[] [[event_listener]] id = "token_revocation" type = "org.wso2.carbon.identity.core.handler.AbstractIdentityHandler" name = "org.wso2.is.notification.ApimOauthEventInterceptor" order = 1 [event_listener.properties] notification_endpoint = "https://<APIM_HOST>:<APIM_PORT>/internal/data/v1/notify" username = "${admin.username}" password = "${admin.password}" 'header.X-WSO2-KEY-MANAGER' = "WSO2-IS"
Minimal Configuration¶
If you want to quickly try out WSO2 API Manager with WSO2 Identity Server 7.x as a Key Manager on Kubernetes with minimal configuration, you can use the default values provided in the default_values.yaml
file.
Quick Start Configuration
This minimal configuration includes:
- H2 database (embedded)
- Default keystore and truststore
- Basic settings for testing purposes
Note: This configuration is ideal for development environments or quick evaluation but is not recommended for production use.
Before you begin
You need to import the public certificate of the WSO2 Identity Server 7.x to the truststore of the WSO2 API Manager, and vice-versa. For information on importing the certificates, see the Importing certificates to the truststore guide.
Follow the steps in the 1.2 Mount Keystore and Truststore section to create a Kubernetes secret containing the keystore and truststore files. Here you will need two keystores: one for the API Manager and one for the Identity Server. The truststore should contain the public certificate of the Identity Server.
- To add external keystores and truststores to IS, you can enable
externalJKS
and define thesecretName
- To add external keystores and truststores to API Manager, you can specify
jksSecretName
-
First download the IS values.yaml
-
Update the IS
default_values.yaml
file with the above configurations. -
Deploy IS with minimal configuration using the following command:
- Deploy API Manager with minimal configuration using the following command:
helm install apim wso2/wso2am-all-in-one --version 4.5.0-3 -f https://raw.githubusercontent.com/wso2/helm-apim/main/docs/am-pattern-0-all-in-one/default_values.yaml
Once the service is up and running, make sure you have the NGINX Ingress Controller deployed by following the steps outlined in the Add Ingress Controller section.
For this pattern, you will need to deploy both API Manager and Identity Server in your Kubernetes cluster. Configure the values files for both API Manager and Identity Server with the necessary settings and deploy them using Helm.
Further IS Customizations¶
For advanced deployment scenarios and further customizations of WSO2 Identity Server on Kubernetes, refer to the official WSO2 Identity Server Kubernetes deployment documentation. This guide covers topics such as:
- Customizing Helm chart values for production
- Enabling persistence and external databases
- Integrating with external identity providers
- Configuring monitoring and logging
- Scaling and high availability options
Review these resources to tailor your deployment to your specific requirements and production standards.
Configuration¶
1. General Configuration of Helm Charts¶
The Helm charts for the API Manager deployment are available in the WSO2 Helm Chart Repository. You can either use the charts from the repository or clone the repository and use the charts from the local copy.
Resource Naming Convention
The helm naming convention for APIM follows a simple pattern:
1.1 Add Ingress Controller¶
The recommendation is to use NGINX Ingress Controller suitable for your cloud environment or local deployment. Some sample annotations that could be used with the ingress resources are as follows.
- The ingress class should be set to nginx in the ingress resource if you are using the NGINX Ingress Controller.
-
Following are some of the recommended annotations to include in the helm charts for ingresses. These may vary depending on the requirements. Please refer to the documentation for more information about the annotations.
- You need to create a kubernetes secret including the certificate and the private key and include the name of the secret in the helm charts. This will be used for TLS termination in load balancer level by the ingress controller. Please refer to the documentation for more information.ingressClass: "nginx" ingress: tlsSecret: "" ratelimit: enabled: false zoneName: "" burstLimit: "" controlPlane: hostname: "am.wso2.com" annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "route" nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
1.2 Mount Keystore and Truststore¶
- If you are not including the keystore and truststore into the docker image, you can mount them using a Kubernetes secret. Following steps shows how to mount the keystore and truststore using a Kubernetes secret.
- Create a Kubernetes secret with the keystore and truststore files. The secret should contain the primary keystore file, secondary keystore file, internal keystore file, and the truststore file. Note that the secret should be created in the same namespace in which you will be setting up the deployment.
- Make sure to use the same secret name when creating the secret and when configuring the helm chart.
- If you are using a different keystore file name and alias, make sure to update the helm chart configurations accordingly. In addition to the primary, internal keystores and truststore files, you can also include the keystores for HTTPS transport as well.
- Refer the following sample command to create the secret and use it in the APIM.
kubectl create secret generic apim-keystore-secret --from-file=wso2carbon.jks --from-file=client-truststore.jks --from-file=wso2internal.jks -n <namespace>
By default, this deployment uses the default keystores and truststores provided by the relevant WSO2 product. For advanced details with regards to managing custom Java keystores and truststores in a container based WSO2 product deployment please refer to the official WSO2 container guide.
1.3 Encrypting Secrets¶
- If you need to use cipher tool to encrypt the passwords in the secret, first you need to encrypt the passwords using the cipher tool. The cipher tool can be found in the bin directory of the product pack. The following command can be used to encrypt the password.
- Also the apictl can be used to encrypt password as well. Reference can be found in following.
- Then the encrypted values should be filled in the the relevant fields of values.yaml.
- Since internal keystore password is required to resolve the encrypted value in runtime, we need to store the value in the cloud provider's secret manager. You can use the cloud provider's secret store to store the password of the internal keystore. The following section can be used to add the cloud provider's credentials to fetch the internal keystore password. Configuration for aws can be at as below.
internalKeystorePassword: # -- AWS Secrets Manager secret name secretName: "" # -- AWS Secrets Manager secret key secretKey: ""
Please note that currently AWS, Azure and GCP Secrets Managers are only supported for this.
1.4 Configure Docker Image and Databases¶
-
Add the following configurations to reflect the docker image created previously in the helm chart.
wso2: deployment: image: imagePullSecrets: enabled: false username: "" password: "" registry: "" repository: "" digest: ""
If you are using a private Docker registry, you must enable
imagePullSecrets.enabled
and provide the username and password. - Provide the database configurations under the following section.- If you need to change the hostnames, update them under the Kubernetes ingress section. - Update the keystore passwords in the security section of thewso2: apim: configurations: databases: apim_db: url: "" username: "" password: "" shared_db: url: "" username: "" password: ""
values.yaml
file. - Review the descriptions of other configurations and modify them as needed to meet your requirements. A simple deployment can be achieved using the basic configurations provided in thevalues.yaml
file. All configuration options for each Helm chart are documented in their respective component guides: - All-in-one - Universal Gateway - Update the admin credentials in the configuration directory.
1.5 Configure SSL in Service Exposure¶
SSL Configuration Best Practices
For WSO2 recommended best practices in configuring SSL when exposing internal services to outside of the Kubernetes cluster, refer to the official WSO2 container guide.
Proper SSL configuration is critical for securing API traffic and maintaining compliance with security standards.
2. Add WSO2 Identity Server as Key Manager¶
After setting up WSO2 Identity Server 7.x, you need to configure API Manager to use it as a Key Manager:
-
Access the API Manager Admin Portal:
https://<API-M-HOSTNAME>:9443/admin
-
Navigate to Key Managers and click Add Key Manager.
-
Configure the Key Manager with the following settings:
Field | Value |
---|---|
Name | WSO2IS7 |
Display Name | WSO2 Identity Server 7 |
Key Manager Type | WSO2 Identity Server 7 |
Well-known URL | https://wso2is.km:9443/oauth2/token/.well-known/openid-configuration |
Issuer | https://wso2is.km:9443/oauth2/token |
Client Registration Endpoint | https://wso2is.km:9443/api/identity/oauth2/dcr/v1.1/register |
Introspection Endpoint | https://wso2is.km:9443/oauth2/introspect |
Token Endpoint | https://wso2is.km:9443/oauth2/token |
Display Token Endpoint | https://wso2is.km:9443/oauth2/token |
Revoke Endpoint | https://wso2is.km:9443/oauth2/revoke |
Display Revoke Endpoint | https://wso2is.km:9443/oauth2/revoke |
UserInfo Endpoint | https://wso2is.km:9443/scim2/Me |
Authorize Endpoint | https://wso2is.km:9443/oauth2/authorize |
Scope Management Endpoint | https://wso2is.km:9443/api/identity/oauth2/v1.0/scopes |
Certificate Type | JWKS |
JWKS URL | https://wso2is.km:9443/oauth2/jwks |
Username (connector config) | admin |
Password (connector config) | admin |
WSO2 Identity Server 7 API Resource Management Endpoint | https://wso2is.km:9443/api/server/v1/api-resources |
WSO2 Identity Server 7 Roles Endpoint | https://wso2is.km:9443/scim2/v2/Roles |
Create roles in WSO2 Identity Server 7 | Enable if needed |
-
For all these configurations to work correctly in Kubernetes, you must ensure proper service discovery between API Manager and Identity Server pods. Configure the necessary Kubernetes services and ingresses to enable communication between these components.
-
Update your Helm chart values to include the Identity Server deployment and services along with API Manager.
Note
When using WSO2 IS 7.x as a Key Manager, note the following limitations: - Tenancy is not supported. - WSO2 IS 7.x cannot be set up as a Resident Key Manager. It can only be set up as a Third-party Key Manager. - Role creation in WSO2 Identity Server 7.x is supported from WSO2 API Manager 4.4.0.5 update level onwards.
3. Add a DNS record mapping the hostnames and the external IP¶
Obtain the external IP (EXTERNAL-IP) of the API Manager Ingress resources, by listing down the Kubernetes Ingresses.
If the defined hostnames (in the previous step) are backed by a DNS service, add a DNS record mapping the hostnames and
the external IP (EXTERNAL-IP
) in the relevant DNS service.
If the defined hostnames are not backed by a DNS service, for the purpose of evaluation you may add an entry mapping the
hostnames and the external IP in the /etc/hosts
file at the client-side.
<EXTERNAL-IP> <kubernetes.ingress.management.hostname> <kubernetes.ingress.gateway.hostname> <kubernetes.ingress.websub.hostname> <kubernetes.ingress.websocket.hostname>
4. Access Management Consoles¶
-
API Manager Publisher:
https://<kubernetes.ingress.management.hostname>/publisher
-
API Manager DevPortal:
https://<kubernetes.ingress.management.hostname>/devportal
-
API Manager Carbon Console:
https://<kubernetes.ingress.management.hostname>/carbon
-
Universal Gateway:
https://<kubernetes.ingress.gateway.hostname>
-
Identity Server Management Console:
https://<kubernetes.ingress.is.hostname>/carbon
-
Universal Gateway:
https://<kubernetes.ingress.gateway.hostname>
-
Identity Server Management Console:
https://<kubernetes.ingress.is.hostname>/carbon