Itamar Shpak
10/22/2025, 11:52 AMItamar Shpak
10/22/2025, 11:54 AMDan
10/22/2025, 11:57 AMDan
10/22/2025, 11:58 AMAsk Inkeep
10/22/2025, 11:58 AMAsk Inkeep
10/22/2025, 11:58 AMserver.dataConfigSources has no entries, the Helm chart automatically sets OPAL_DATA_UPDATER_ENABLED: False to prevent the client from reporting an unhealthy state (2) .
To resolve this, you need to configure your data sources in your Helm values file. Here's the minimum configuration needed (1) :
server:
dataConfigSources:
config:
entries:
- url: "<https://api.permit.io/v1/policy-config>"
topics: ["policy_data"]
config:
headers:
Authorization: "Bearer YOUR-SECRET-TOKEN"
The key configuration variables for the Helm chart include (2) :
β’ server.policyRepoUrl - Git repository with your policy code
β’ server.dataConfigSources - Data sources for the clients
β’ server.broadcastUri - Backend for broadcasting updates (needed if replicas > 1)
For a complete working example with proper data sources (3) :
export OPAL_DATA_CONFIG_SOURCES='{"config": {"entries": [{"url": "<https://api.permit.io/v1/policy-config>", "topics": ["policy_data"], "config": {"headers": {"Authorization": "Bearer FAKE-SECRET"}}}]}}'
Make sure your values file includes at least one data source entry, otherwise the client won't be able to complete its initialization and will remain unhealthy.Ask Inkeep
10/22/2025, 11:58 AMItamar Shpak
10/22/2025, 12:22 PMItamar Shpak
10/22/2025, 12:24 PMItamar Shpak
10/22/2025, 12:24 PMDan
10/22/2025, 12:42 PMOPAL_DATA_UPDATER_ENABLED=false is to disable real-time updates, but the OPAL Client would still load in the statically configured Data Source Entires configured.
See Trigger Data Update tutorial for reference
Check the Data Updates FAQ for more detailsItamar Shpak
10/22/2025, 12:56 PMItamar Shpak
10/30/2025, 11:27 AMAsk Inkeep
10/30/2025, 11:27 AMAsk Inkeep
10/30/2025, 11:27 AMOPAL_DATA_CONFIG_SOURCES contains the "complete picture" data sources - fetched after OPAL client loads and after every disconnect .
For Kubernetes-level Authorization
If you're using OPAL just for Kubernetes authorization without external data, you can configure a minimal data source. Here's an example from the documentation :
{
"config": {
"entries": [
{
"url": "<http://example-api-server.com/policy-config>",
"config": {
"headers": {
"Authorization": "Bearer YOUR-SECRET-HERE"
}
},
"topics": [
"policy_data"
],
"dst_path": "/"
}
]
}
}
The data source URL should point to an API that returns your Kubernetes authorization data (like namespace permissions, RBAC rules, etc.) . If you don't have external data yet, you could start with a simple static JSON file served via HTTP containing your initial authorization rules.Ask Inkeep
10/30/2025, 11:28 AMOr Weis
10/30/2025, 11:30 AM{} ) - @Ask Inkeep please provide and exampleAsk Inkeep
10/30/2025, 11:30 AMAsk Inkeep
10/30/2025, 11:30 AMOPAL_DATA_CONFIG_SOURCES like this (1) :
{
"config": {
"entries": [
{
"url": "<https://api.permit.io/v1/policy-config>",
"topics": [
"policy_data"
],
"config": {
"headers": {
"Authorization": "Bearer FAKE-SECRET"
}
}
}
]
}
}
The data source configuration tells OPAL clients β*what to fetch*β (url) and β*where to put it*β in OPA data document hierarchy (destination path) . Each entry in the configuration is a directive for the OPAL client to fetch data and place it in OPA cache using the Data API .
If you want to provide static empty data, your API endpoint (specified in the url field) would simply need to return {} when called. The entry uses the default dst_path of / which places data at the root of OPA document hierarchy .
For encoding this in an environment variable :
export OPAL_DATA_CONFIG_SOURCES='{"config": {"entries": [{"url": "<https://api.permit.io/v1/policy-config>", "topics": ["policy_data"], "config": {"headers": {"Authorization": "Bearer FAKE-SECRET"}}}]}}'
The key point is that even with "empty" data, OPAL still needs a valid data source configuration - it's just that your endpoint would return minimal or empty JSON data.Ask Inkeep
10/30/2025, 11:30 AMAsk Inkeep
10/30/2025, 11:30 AMAsk Inkeep
10/30/2025, 11:30 AMOPAL_DATA_CONFIG_SOURCES like this (1) :
{
"config": {
"entries": [
{
"url": "<https://api.permit.io/v1/policy-config>",
"topics": [
"policy_data"
],
"config": {
"headers": {
"Authorization": "Bearer FAKE-SECRET"
}
}
}
]
}
}
Each entry in the entries array is a directive that tells the OPAL client to fetch data and place it in OPA cache using the Data API . The configuration specifies:
β’ β*From where to fetch:*β The URL endpoint to retrieve data from
β’ β*How to fetch (optional) :*β Configuration like HTTP headers for authentication
β’ β*Where to place the data in OPA cache:*β Uses the default / path at the root of OPA document hierarchy if not specified
If you want to provide static empty data, your API endpoint (specified in the url field) would need to return {} when called. The OPAL client will fetch this empty object and place it in the OPA cache, allowing the client to start successfully even without actual data.
For encoding this as an environment variable, you can use Python's json.dumps() to get a one-line string :
{
"config": {
"entries": [
{
"url": "<https://api.permit.io/v1/policy-config>",
"topics": [
"policy_data"
],
"config": {
"headers": {
"Authorization": "Bearer FAKE-SECRET"
}
}
}
]
}
}Ask Inkeep
10/30/2025, 11:31 AMOr Weis
10/30/2025, 11:35 AMOPAL_DATA_CONFIG_SOURCES={"config":{"entries":[{"url":"<http://opal_server:7002/policy-data>","topics":["policy_data"],"dst_path":"/static", "data":{} }]}}Itamar Shpak
10/30/2025, 12:41 PMItamar Shpak
10/30/2025, 1:52 PMItamar Shpak
10/30/2025, 1:53 PMItamar Shpak
10/30/2025, 1:56 PMOmer Zuarets
10/30/2025, 2:53 PMItamar Shpak
11/02/2025, 9:48 AMAlon Boshi
11/02/2025, 10:43 AMItamar Shpak
11/02/2025, 11:16 AMItamar Shpak
11/03/2025, 11:41 AMAlon Boshi
11/03/2025, 11:43 AMItamar Shpak
11/03/2025, 11:46 AMDan
11/03/2025, 12:19 PMextraEnv:
- name: OPAL_DATA_UPDATER_ENABLED
value: "FALSE"
- name: OPAL_OPA_HEALTH_CHECK_POLICY_ENABLED
value: "FALSE"
The issue is with OPAL Client not applying any data update on boot, therefor making the service considered as not healthy.
Is this something intentional? I would like to understand better the use-case you are trying to setup to guide you best how to configure it properly.Itamar Shpak
11/03/2025, 1:07 PMDan
11/03/2025, 1:13 PMItamar Shpak
11/03/2025, 1:18 PMItamar Shpak
11/03/2025, 1:18 PMItamar Shpak
11/03/2025, 1:20 PMItamar Shpak
11/03/2025, 1:20 PMDan
11/03/2025, 3:31 PMDan
11/03/2025, 3:35 PMOPAL_DATA_CONFIG_SOURCES is not configured correctly, notice the server-deployment.yaml at lines 57-58 with empty entries for data sources. I'm checking it out and let you know what I find out β¨Eli Moshkovich
11/04/2025, 3:37 AMItamar Shpak
11/04/2025, 11:18 AMEli Moshkovich
11/05/2025, 6:55 PMItamar Shpak
11/06/2025, 9:04 AMItamar Shpak
11/06/2025, 2:10 PMItamar Shpak
11/10/2025, 9:49 AMAlon Boshi
11/10/2025, 9:55 AMAlon Boshi
11/10/2025, 10:16 AMItamar Shpak
11/10/2025, 11:58 AM