Networking#
The RENU and ACE Uganda Network teams are responsible for the overall production and testing network architecture, including:
VLAN and subnet configuration
Network architecture for the Kubernetes control plane and worker nodes
Firewall configuration and IPv4 NAT mappings
CORTEX-meta controls the networking architecture within the Kubernetes cluster to which CORTEX runs as a set of Kubernetes workloads that are reached through a single cluster ingress.
External traffic enters through Emissary-ingress TLS certificates are issued automatically by cert-manager, and public hostnames are published by external-dns. Only the web-facing components are exposed publicly; the directory and database are reachable inside the cluster only.
Ingress and routing#
Each public component is fronted by an Emissary Host and Mapping pair. The
Host declares the external hostname and its TLS secret; the Mapping routes
requests for that hostname to the component’s in-cluster Service. These
routing resources live in the emissary namespace, while the Services they
point at live in the CORTEX release namespace.
Guidance
All HTTP requests are redirected to HTTPS (requestPolicy.insecure: Redirect).
Hostnames are configurable per component under Proxy.hostname,
Discovery.hostname, and Registry.hostname in values.yaml.
TLS certificates#
cert-manager provisions certificates automatically:
Public HTTPS certificates are issued by the
letsencrypt-productionClusterIssuer(configurable via each component’scert-issuervalue) and mounted by the fronting Apache container for TLS termination.Internal SAML signing/encryption certificates (the Shibboleth and SATOSA service-provider certs) are long-lived, self-signed certificates issued by per-component
Issuerresources. They secure federation trust, not browser traffic.
DNS#
The Host resources are annotated so that external-dns publishes their
hostnames to the cluster’s DNS provider. Point the cortex.ug domain (or your
own) at the cluster’s ingress, and the per-component records are managed for
you.
Internal services#
Components talk to each other over standard Kubernetes Service DNS names of
the form <service>.<namespace>.svc.cluster.local.
Service |
Ports |
Purpose |
|---|---|---|
|
80, 443 |
Apache reverse proxy in front of SATOSA |
|
8000 |
Configurable proxy for translating between authentication protocols |
|
80, 443 |
Home-realm discovery |
|
80, 443 |
COmanage Registry |
|
389, 636 |
Directory service (LDAP / LDAPS) |
The satosa service is internal only — it is reached exclusively by the
httpd proxy, never directly from outside the cluster.
Directory service#
The LDAP directory is exposed as a ClusterIP service on 389 (LDAP) and
636 (LDAPS). It is not routed through Emissary and has no public
hostname; clients connect over LDAPS at
ldap.<namespace>.svc.cluster.local:636 using the CA published in the
directory’s TLS secret.
Database#
Registry stores its data in a PostgreSQL cluster managed by
CloudNativePG. Registry connects to the
read-write endpoint registry-db-rw on port 5432 inside the cluster. The
database is never exposed outside the cluster.