gwctl describe gateway -n example-ns mygatewayName:mygatewayNamespace:example-ns...Status:addresses:- type:IPAddressvalue:100.126.1.2conditions:- lastTransitionTime:"2025-11-26T15:40:15Z"message:Gateway is not licensedobservedGeneration:7reason:Invalidstatus:"False"type:Accepted- lastTransitionTime:"2025-11-26T15:40:15Z"message:Gateway must be accepted firstobservedGeneration:7reason:Pendingstatus:"False"type:Programmed- lastTransitionTime:"2025-11-26T15:40:15Z"message:Novalid Airlock Microgateway license configuredobservedGeneration:7reason:InvalidLicensestatus:"False"type:Licensed...
The example above shows one invalid license state. Other invalid license states are also possible, for example InvalidConfigurationForLicense or ExpiredLicense. To determine the exact cause, check the values of the message and reason fields in the Licensed condition.
Verifying the GatewayParameters
Issues with GatewayParameters cause the Accepted and Programmed conditions to be False. This can happen in the following cases:
The GatewayParameters resource cannot be resolved.
The GatewayParameters contain unresolved references or other errors.
Use gwctl describe to inspect the reason of the Accepted condition for details:
Listener specifications are part of the Gateway resource. gwctl describe lists all listeners with their names, their conditions, and the number of attached routes. Invalid listeners can cause requests to time out.
The gateway itself requires at least one valid listener. As long as at least one listener is valid, the gateway-level Accepted and Programmed conditions remain True. Therefore, a simple gwctl get is not sufficient to detect invalid listeners.
To verify that all listeners work as expected, perform the following steps:
Use gwctl describe gateway to list all listeners and their conditions.
Check each listener’s Accepted, Programmed, and ResolvedRefs conditions for status: “False”.
Use the reason and message fields to identify issues such as invalid secrets or unsupported protocols.
Ensure that all configured listeners are both accepted and programmed. Any listener not in this state indicates a configuration error and must be corrected.
At gateway level, the reason of the Accepted condition indicates that some listeners are invalid. Depending on the error, further details are available in the listener conditions.
The following example shows a gateway with three listeners, two of which are invalid (one with an invalid reference to a secret, one with an unsupported protocol). The message on the gateway’s Accepted condition indicates that only some, yet not all, listeners are valid:
gwctl describe gateway -n example-ns mygatewayName:mygatewayNamespace:example-ns...Status:addresses:- type:IPAddressvalue:100.126.1.3conditions:- lastTransitionTime:"2025-11-27T08:09:20Z"message:Gateway has at least one valid listenerobservedGeneration:21reason:ListenersNotValidstatus:"True"type:Accepted...listeners:- attachedRoutes:2conditions:- lastTransitionTime:"2025-11-27T08:08:44Z"message:Referenced certificate secret 'downstream-server-certificate-invalid'does not existobservedGeneration:21reason:InvalidCertificateRefstatus:"False"type:ResolvedRefs...- lastTransitionTime:"2025-11-27T08:08:44Z"message:Listener must have references resolved firstobservedGeneration:21reason:Pendingstatus:"False"type:Programmedname:httpssupportedKinds:- group:gateway.networking.k8s.iokind:HTTPRoute- attachedRoutes:2conditions:...- lastTransitionTime:"2025-11-27T08:08:44Z"message:'Listener has an unsupported protocol, supported protocols are:[HTTPHTTPS microgateway.airlock.com/http3]'observedGeneration:21reason:UnsupportedProtocolstatus:"False"type:Accepted- lastTransitionTime:"2025-11-27T08:08:44Z"message:Listener must be accepted firstobservedGeneration:21reason:Pendingstatus:"False"type:Programmedname:httpsupportedKinds:- group:gateway.networking.k8s.iokind:HTTPRoute...
The Gateway is still considered accepted (type: Accepted with status: “True”) but reports ListenersNotValid.
The individual listeners show the concrete problem causes — i.e., InvalidCertificateRef and UnsupportedProtocol; the corresponding message fields explain the root causes.
The InvalidCertificateRef causes the affected listener’s ResolvedRefs condition to be False.
The UnsupportedProtocol causes the affected listener’s Accepted condition to be False.
For both invalid listeners, the Programmed condition is also False.
Checking for invalid routes
Microgateway exposes a dedicated AttachedRoutes condition on gateways to help detect issues on attached routes.
Use gwctl describe to inspect this condition and derive the next steps on route level.
Example with all routes valid:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gwctl describe gateway -n example-ns mygatewayName:mygatewayNamespace:example-ns...Status:addresses:- type:IPAddressvalue:100.126.1.3conditions:...- lastTransitionTime:"2025-11-27T07:44:19Z"message:All accepted and attached routes are validobservedGeneration:23reason:AttachedRoutesValidstatus:"True"type:AttachedRoutes...
Example with one or more invalid routes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gwctl describe gateway -n example-ns mygatewayName:mygatewayNamespace:example-ns...Status:addresses:- type:IPAddressvalue:100.126.1.3conditions:...- lastTransitionTime:"2025-11-28T09:59:23Z"message:| Gateway has the following invalid routes attached:
(HTTPRoute) example-ns/backendobservedGeneration:23reason:InvalidRoutesstatus:"False"type:AttachedRoutes...
Check HTTPRoute resource conditions
After the gateway has been thoroughly inspected, analyze the relevant HTTPRoutes. Faulty routes can lead to the following problems:
A route that is not accepted and thus behaves as if it does not exist. Requests that should match this route return HTTP 404.
A partially invalid route or an invalid backend. Requests matching the invalid part of the route return HTTP 500.
Getting a status overview
Use gwctl get for an overview of defined HTTPRoutes including the numbers of parent references and the attached policies as well as the statuses of the Accepted condition, and the ResolvedRefs condition:
Routes managed by the Microgateway operator have the attribute controllerName set to microgateway.airlock.com/gatewayclass-controller in the status overview.
Verifying route attachement
When checking routes for errors, perform the following steps:
Confirm that the number of parent references matches the expected value for each route.
Compare that with the number of HTTPRoutes reported by gwctl get gateway -o wide.
Look for unexpected discrepancies.
If a route contains an incorrect parent reference, the following issues will occur:
The target gateway does not register it.
The Microgateway operator does not reconcile it.
Conditions and status information remain unchanged.
observedGeneration values differ from the route’s generation.
gwctl describe reports such cases in the Analysis section:
Other inconsistencies between an HTTPRoute’s parent reference and the referenced gateway appear in the route’s Accepted condition. For example, a non-matching sectionName:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
gwctl describe httproutes -n example-ns backendName:backendNamespace:example-ns...Status:parents:- conditions:...- lastTransitionTime:"2025-11-28T13:19:37Z"message:ParentRef section name does not match any listener name on the GatewayobservedGeneration:2reason:NoMatchingParentstatus:"False"type:Accepted...
Checking faulty references
References from an HTTPRoute to other objects (besides its parent) are another common error source. The ResolvedRefs condition indicates faulty references.
Use gwctl describe to list the policies attached to an HTTPRoute:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gwctl describe httproutes -n example-ns backendName:backendNamespace:example-ns...Status:parents:- conditions:...- lastTransitionTime:"2025-11-28T13:37:55Z"message:| Traffic may be blocked since HTTPRoute has the following invalid policies attached:
(AccessControlPolicy) example-ns/ac-policyobservedGeneration:4reason:InvalidPoliciesstatus:"False"type:AttachedPolicies...
Microgateway exposes the AttachedPolicies condition:
The message lists the affected policies.
The status is True if all attached policies are valid.
The status is False if one or more invalid policies are attached.
Check policy resource conditions
Policies are the last type of resource to analyze for errors or inconsistencies. Errors in policies cause affected requests to fail with HTTP 500.
Getting a status overview
Use gwctl get to list policies.
In the following example output, targets are omitted for readability:
1
2
3
4
5
6
gwctl get policies -o wide -n example-ns
NAMESPACE NAME KIND TARGET(S) POLICY TYPE ACCEPTED AGE
example-ns ac-policy AccessControlPolicy.microgateway.airlock.com ... Direct True 3h36m
example-ns backend-policy BackendTLSPolicy.gateway.networking.k8s.io ... Direct True 3h36m
example-ns cs-policy ContentSecurityPolicy.microgateway.airlock.com ... Direct True 3h36m
example-ns cr-policy CustomResponsePolicy.microgateway.airlock.com ... Direct True 3h36m
The output shows the policies’ names, kinds, targets and types, as well as the statuses of their Accepted conditions.
The policy kind defines the type of attachment (Direct or Inherited) and the target kinds a policy can attach to.
Microgateway currently only supports policies of the Direct type.
To get more details on a policy, use gwctl describe with the correct kind of the policy to get as much detail as possible:
gwctl describe accesscontrolpolicy -n example-ns ac-policyapiVersion:microgateway.airlock.com/v1alpha1kind:AccessControlPolicymetadata:...name:ac-policynamespace:example-ns...status:ancestors:- ancestorRef:group:gateway.networking.k8s.iokind:HTTPRoutename:backendconditions:- lastTransitionTime:"2025-11-28T14:28:47Z"message:AccessControlPolicy is acceptedobservedGeneration:3reason:Acceptedstatus:"True"type:AcceptedcontrollerName:microgateway.airlock.com/gatewayclass-controller...
Notice
A policy may be attached to more than one target.
Policies managed by the Microgateway operator have the attribute controllerName set to microgateway.airlock.com/gatewayclass-controller in the status overview.
Verifying policy attachement
Use gwctl describe to list the specified targets in the specification section and the resolved ancestors in the status section:
As policies may reference one or several targets, perform the following steps to verify that all specified targets are resolved:
Inspect spec.targetRefs for the list of intended targets.
Inspect status.ancestors for the resolved ancestors.
Ensure that each targetRef has a corresponding ancestorRef.
Compare the policy’s generation attribute with at least one condition’s observedGeneration attribute to ensure the Microgateway controller has updated the status.
If more than one policy of the same kind reference the same target, the policies are marked as conflicting and only one of them has the status of its Attached condition set to True and is attached to the target. The other policies have the statuses of their Accepted conditions set to False and are not attached to the target.
Use gwctl get policies to list all policies.
In the following example output, the policy backend-policy-2 is not accepted:
1
2
3
4
5
6
7
gwctl get policies -o wide -n example-ns
NAMESPACE NAME KIND TARGET(S) POLICY TYPE ACCEPTED AGE
example-ns ac-policy AccessControlPolicy.microgateway.airlock.com ... Direct True 3h36m
example-ns backend-policy BackendTLSPolicy.gateway.networking.k8s.io ... Direct True 3h36m
example-ns backend-policy-2 BackendTLSPolicy.gateway.networking.k8s.io ... Direct False 3h36m
example-ns cs-policy ContentSecurityPolicy.microgateway.airlock.com ... Direct True 3h36m
example-ns cr-policy CustomResponsePolicy.microgateway.airlock.com ... Direct True 3h36m
To get more details on a policy, use gwctl describe.
The following example output reveals that the policy conflicts with another BackendTLSPolicy:
gwctl describe backendtlspolicies -n example-ns backend-policy-2apiVersion:gateway.networking.k8s.io/v1kind:BackendTLSPolicymetadata:...name:backend-policy-2namespace:example-ns...status:ancestors:- ancestorRef:group:gateway.networking.k8s.iokind:Gatewayname:airlock-microgatewayconditions:...- lastTransitionTime:"2025-11-28T15:03:10Z"message:'BackendTLSPolicy is conflicting with other policies for this ancestor:[backend-policy]'observedGeneration:1reason:Conflictedstatus:"False"type:Accepted...
Checking faulty references
Policies often contain many references and are therefore particularly susceptible to reference errors. Faulty references cause the status of the Accepted condition to be False, and the status of the ResolvedRefs condition (if present) to be False. The condition message contains details about the problem.
The following example shows an AccessControlPolicy with a faulty reference to an OIDCRelyingParty:
gwctl describe accesscontrolpolicy -n example-ns ac-policyapiVersion:microgateway.airlock.com/v1alpha1kind:AccessControlPolicymetadata:...name:ac-policynamespace:example-ns...status:ancestors:- ancestorRef:group:gateway.networking.k8s.iokind:HTTPRoutename:backendconditions:- lastTransitionTime:"2025-11-28T13:37:55Z"message:|- Resolving AccessControlPolicy failed, traffic to target will be blocked
Missing referenced OIDCRelyingParty 'my-missing-oidc-rp'observedGeneration:2reason:Invalidstatus:"False"type:AcceptedcontrollerName:microgateway.airlock.com/gatewayclass-controller...
Check events
Kubernetes events provide useful context for understanding issues.
Use kubectl with filters to restrict events to specific namespaces, resources, or types:
1
2
3
4
5
# Get all warnings across the clusterkubectl events -A --types Warning
# Get only events for a gateway in a particular namespacekubectl -n example-ns events --for gateway/<my-gateway>
Check logs
Logs from the Operator, the Engine or the Session Agent often reveal the root cause of unexpected behavior. Start with the Operator logs, then inspect the logs of the Gateway pods.
The Gateway and GatewayParameters Custom Resource determine where (namespace) and how many pods are created. Each Gateway pod always contains an airlock-microgateway-engine container. Only when session handling is configured, the Gateway pod additionally contains an airlock-microgateway-session-agent container.
The commands below stream logs for all pods belonging to a Gateway (selected via label), choose the relevant container, and filter/format JSON log lines using jq.