ok. issue confirmed.
it's because the api.<apex> HTTPRoute and TLSRoute conflicted in the gateway, causing cilium-envoy refuses to accept.
how i found:
i run kubectl get gateway -n tenant-root cozystack -o jsonpath='{range .spec.listeners[*]}{.name}{"\t"}{.hostname}{"\t"}{.protocol}{"\t"}{.port}{"\n"}{end}' | sort -k2
the result:
https-api-019a994c api.xxx.xxx HTTPS 443
tls-api api.xxx.xxx TLS 443
how i resolved this (temporary)
because i don't know how to force TenantGateway not to include HTTPRoute,
so I delete the kubernetes-api in default namespace.
force TenantGateway reconcile the non-conflict Gateway.
and it works!
now i can access my services via Gateway API.