Issues when creating an APIRule - various reasons
Symptom
When you create an APIRule, an instant validation error appears, or the APIRule custom resource (CR) has the ERROR status, for example:
kubectl get apirule httpbinNAME STATUS HOSThttpbin ERROR httpbin.xxx.shoot.canary.k8s-hana.ondemand.comThe error may result in an inconsistent state of the APIRule resource in which Ory CR, Istio CR, or both are missing. Your service then cannot be properly exposed. To check the error message of the APIRule resource, run:
kubectl get apirule -n <namespace> <api-rule-name> -o=jsonpath='{.status.APIRuleStatus}'JWT handler's trusted_issuers configuration is missing
Cause
The following APIRule is missing the trusted_issuers configuration for the JWT handler:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: jwtIf your APIRule is missing the trusted_issuers configuration for the JWT handler, the following APIRuleStatus error appears:
{"code":"ERROR","desc":"Validation error: Attribute \".spec.rules[0].accessStrategies[0].config\": supplied config cannot be empty"}Remedy
Add JWT configuration for the trusted_issuers or . Here's an example of a valid configuration:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: jwt config: trusted_issuers: ["https://dev.kyma.local"]Invalid trusted_issuers for the JWT handler
Cause
Here's an example of an APIRule with the trusted_issuers URL configured:
cat <<EOF | kubectl apply -f -apiVersion: gateway.kyma-project.io/v1beta1kind: APIRulemetadata: ...spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: jwt config: trusted_issuers: ["http://unsecured.or.not.valid.url"]EOFIf the trusted_issuers URL is an unsecured HTTP URL, or the trusted_issuers URL is not valid, you get an instant error, and the APIRule resource is not created:
The APIRule "httpbin" is invalid: spec.rules[0].accessStrategies[0].config.trusted_issuers[0]: Invalid value: "some-url": spec.rules[0].accessStrategies[0].config.trusted_issuers[0] in body should match '^(https://|file://).*$'Remedy
The JWT trusted-issuers must be a valid HTTPS URL, for example:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: jwt config: trusted_issuers: ["https://dev.kyma.local"]Unsupported handlers' combination
Cause
The following APIRule has both allow and jwt handlers defined on the same path:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: allow - handler: jwt config: trusted_issuers: ["https://dev.kyma.local"]The handlers' combination in the above example is not supported. If an APIRule has an unsupported handlers' combination defined on the same path, the following APIRuleStatus error appears:
{"code":"ERROR","desc":"Validation error: Attribute \".spec.rules[0].accessStrategies.accessStrategies[0].handler\": allow access strategy is not allowed in combination with other access strategies"}Remedy
Decide on one configuration you want to use. You can either allow access to the specific path or restrict it using the JWT security token. Defining both configuration methods on the same path is not allowed.
Service defined in APIRule is on the block list
Cause
The following APIRule has the istio-ingressgateway service specified:
spec: ... service: name: istio-ingressgateway namespace: istio-systemThe istio-ingressgateway service is included in the block list. If your APIRule has a blocked service defined, the following APIRuleStatus error appears:
{"code":"ERROR","desc":"Validation error: Attribute \".spec.service.name\": Service istio-ingressgateway in namespace istio-system is blocklisted"}Remedy
Read this technical reference to learn more about the block list of services in API Gateway.
To see which services are blocked in Kyma by default, check the serviceBlockList.
Occupied host
Cause
The following APIRules use the same host:
spec: ...spec: host: httpbin.xxx.shoot.canary.k8s-hana.ondemand.comIf your APIRule specifies a host that is already used by another APIRule or Virtual Service, the following APIRuleStatus error appears:
{"code":"ERROR","desc":"Validation error: Attribute \".spec.host\": This host is occupied by another Virtual Service"}Remedy
Use a different host for the second APIRule, for example:
spec: ... host: httpbin-new.xxx.shoot.canary.k8s-hana.ondemand.comConfiguration of noop and allow handlers
Cause
In the following APIRule, the noop handler has the trusted-issuers field configured:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: noop config: trusted_issuers: ["https://dex.kyma.local"]If your APIRule uses either the noop or allow handler and has some further handler's configuration defined, you get the following APIRuleStatus error:
{"code":"ERROR","desc":"Validation error: Attribute \".spec.rules[0].accessStrategies[0].config\": strategy: noop does not support configuration"}Remedy
Use the noop and allow handlers without any further configuration, for example:
spec: ... rules: - path: /.* methods: ["GET"] accessStrategies: - handler: noop