Skip to content

Commit fd4cc36

Browse files
committed
docs: add Gateway API documentation and install instructions
Add networking/gateway-api.md covering: - Architecture overview with mermaid diagrams - Per-tenant model with Envoy Gateway and mergeGateways - Platform and tenant configuration examples - TLS certificate management (ACME HTTP-01, self-signed, dns01) - Child tenant ACME limitation and workarounds - HTTP-to-HTTPS redirect architecture - ExternalIPs configuration - Supported services tables (HTTPRoute and TLSRoute) - Comparison with ingress-nginx Update install/cozystack/platform.md: - Add Gateway API tabs alongside Ingress in networking setup (MetalLB and Public IP sections) - Add Gateway API tab in root tenant services setup - Add Gateway API link to Next Steps Related: cozystack/cozystack#2213 Assisted-By: Claude AI Signed-off-by: Kirill Ilin <stitch14@yandex.ru>
1 parent b5a4962 commit fd4cc36

2 files changed

Lines changed: 359 additions & 3 deletions

File tree

content/en/docs/v1/install/cozystack/platform.md

Lines changed: 152 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,13 @@ kubectl apply -f metallb-bgp-advertisement.yml
500500
{{< /tabs >}}
501501
<br/>
502502

503-
Now that MetalLB is configured, enable `ingress` in the `tenant-root`:
503+
Now that MetalLB is configured, enable traffic routing for the `tenant-root`.
504+
You can use Ingress (nginx), Gateway API (Envoy Gateway), or both simultaneously.
505+
506+
{{< tabs name="traffic_routing_metallb" >}}
507+
{{% tab name="Ingress (default)" %}}
508+
509+
Enable `ingress` in the `tenant-root`:
504510

505511
```bash
506512
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '
@@ -535,6 +541,66 @@ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(
535541
root-ingress-controller LoadBalancer 10.96.91.83 192.168.100.200 80/TCP,443/TCP 48m
536542
```
537543

544+
{{% /tab %}}
545+
{{% tab name="Gateway API" %}}
546+
547+
First, enable Gateway API on the platform:
548+
549+
```bash
550+
kubectl patch packages.cozystack.io cozystack.cozystack-platform --type=merge -p '{
551+
"spec": {
552+
"components": {
553+
"platform": {
554+
"values": {
555+
"gateway": {
556+
"gatewayAPI": true,
557+
"gatewayClass": "tenant-root"
558+
}
559+
}
560+
}
561+
}
562+
}
563+
}'
564+
```
565+
566+
Then enable `gateway` on the root tenant:
567+
568+
```bash
569+
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '
570+
{"spec":{
571+
"gateway": true
572+
}}'
573+
```
574+
575+
Wait for the gateway HelmRelease to become ready:
576+
577+
```bash
578+
kubectl -n tenant-root get hr gateway
579+
```
580+
581+
Expected output:
582+
```console
583+
NAME AGE READY STATUS
584+
gateway 1m True Helm upgrade succeeded for release tenant-root/gateway.v1 with chart gateway@...
585+
```
586+
587+
Verify the GatewayClass is accepted:
588+
589+
```bash
590+
kubectl get gatewayclass tenant-root
591+
```
592+
593+
Expected output:
594+
```console
595+
NAME CONTROLLER ACCEPTED AGE
596+
tenant-root gateway.envoyproxy.io/gatewayclass-controller True 1m
597+
```
598+
599+
For more details on the Gateway API architecture and configuration, see [Gateway API]({{% ref "/docs/v1/networking/gateway-api" %}}).
600+
601+
{{% /tab %}}
602+
{{< /tabs >}}
603+
538604
### 4.b. Node Public IP Setup
539605

540606
If your cloud provider does not support MetalLB, you can expose ingress controller using external IPs on your nodes.
@@ -566,7 +632,13 @@ kubectl patch packages.cozystack.io cozystack.cozystack-platform --type=merge -p
566632
}'
567633
```
568634

569-
Next, enable `ingress` for the root tenant:
635+
Next, enable traffic routing for the root tenant.
636+
You can use Ingress (nginx), Gateway API (Envoy Gateway), or both.
637+
638+
{{< tabs name="traffic_routing_public_ip" >}}
639+
{{% tab name="Ingress (default)" %}}
640+
641+
Enable `ingress` for the root tenant:
570642

571643
```bash
572644
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '{
@@ -590,21 +662,97 @@ NAME TYPE CLUSTER-IP EXTERNAL-IP
590662
root-ingress-controller ClusterIP 10.96.91.83 192.168.100.11,192.168.100.12,192.168.100.13 80/TCP,443/TCP 48m
591663
```
592664

665+
{{% /tab %}}
666+
{{% tab name="Gateway API" %}}
667+
668+
Enable Gateway API on the platform and `gateway` on the root tenant:
669+
670+
```bash
671+
kubectl patch packages.cozystack.io cozystack.cozystack-platform --type=merge -p '{
672+
"spec": {
673+
"components": {
674+
"platform": {
675+
"values": {
676+
"gateway": {
677+
"gatewayAPI": true,
678+
"gatewayClass": "tenant-root"
679+
}
680+
}
681+
}
682+
}
683+
}
684+
}'
685+
686+
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '{
687+
"spec":{
688+
"gateway": true
689+
}
690+
}'
691+
```
692+
693+
The EnvoyProxy will automatically create a ClusterIP Service with the configured externalIPs. Verify:
694+
695+
```bash
696+
kubectl get svc -n cozy-envoy-gateway
697+
```
698+
699+
Expected output shows the merged Envoy service with externalIPs:
700+
```console
701+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
702+
envoy-tenant-root-... ClusterIP 10.96.83.194 192.168.100.11,192.168.100.12,192.168.100.13 80/TCP,443/TCP 1m
703+
```
704+
705+
For more details, see [Gateway API]({{% ref "/docs/v1/networking/gateway-api" %}}).
706+
707+
{{% /tab %}}
708+
{{< /tabs >}}
709+
593710
## 5. Finalize Installation
594711

595712
### 5.1. Setup Root Tenant Services
596713

597-
Enable `etcd` and `monitoring` for the root tenant:
714+
Enable core services for the root tenant. Choose the tab matching the traffic routing you configured in step 4:
715+
716+
{{< tabs name="root_tenant_services" >}}
717+
{{% tab name="Ingress" %}}
718+
719+
```bash
720+
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '
721+
{"spec":{
722+
"ingress": true,
723+
"monitoring": true,
724+
"etcd": true
725+
}}'
726+
```
727+
728+
{{% /tab %}}
729+
{{% tab name="Gateway API" %}}
730+
731+
```bash
732+
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '
733+
{"spec":{
734+
"gateway": true,
735+
"monitoring": true,
736+
"etcd": true
737+
}}'
738+
```
739+
740+
{{% /tab %}}
741+
{{% tab name="Both" %}}
598742

599743
```bash
600744
kubectl patch -n tenant-root tenants.apps.cozystack.io root --type=merge -p '
601745
{"spec":{
602746
"ingress": true,
747+
"gateway": true,
603748
"monitoring": true,
604749
"etcd": true
605750
}}'
606751
```
607752

753+
{{% /tab %}}
754+
{{< /tabs >}}
755+
608756
### 5.2. Check the Cluster State and composition
609757

610758
Check the provisioned persistent volumes:
@@ -725,3 +873,4 @@ In this example, `grafana.example.org` is located at 192.168.100.200.
725873

726874
- [Configure OIDC]({{% ref "/docs/v1/operations/oidc/" %}}).
727875
- [Create a user tenant]({{% ref "/docs/v1/getting-started/create-tenant" %}}).
876+
- [Set up Gateway API]({{% ref "/docs/v1/networking/gateway-api" %}}) as an alternative to ingress-nginx.

0 commit comments

Comments
 (0)