HTTP/2
Configure a service to use HTTP/2.
You might have services in your Kubernetes cluster that use HTTP/2 for communication. Typically these are gRPC services, but it could apply to any service that uses HTTP/2 in its transport layer. To enable HTTP/2 communication, you simply set the app protocol on the service to HTTP/2. This setting instructs Gloo Gateway to use HTTP/2 for communication with the destination.
Before you begin
Follow the Get started guide to install Gloo Gateway, set up a gateway resource, and deploy the httpbin sample app.
Get the external address of the gateway and save it in an environment variable.
Deploy a sample app
To demonstrate the HTTP/2 routing capabilities, deploy a sample nginx server and configure it to only accept HTTP/2 connections.
Deploy a simple nginx server that is configured to use the HTTP/2 protocol. Note that in this example, the
appProtocol
on the nginx service is set tohttp2
. Other supported values to configure the HTTP/2 protocol includegrpc
,grpc-web
, orkubernetes.io/h2c
.kubectl apply -f- <<EOF apiVersion: v1 kind: ConfigMap metadata: name: nginx-conf data: nginx.conf: | user nginx; worker_processes 1; events { worker_connections 10240; } http { server { listen 80 http2; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } } --- apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app.kubernetes.io/name: nginx ports: - protocol: TCP port: 8080 targetPort: http-web-svc appProtocol: http2 --- apiVersion: v1 kind: Pod metadata: name: nginx labels: app.kubernetes.io/name: nginx spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 name: http-web-svc volumeMounts: - name: nginx-conf mountPath: /etc/nginx/nginx.conf subPath: nginx.conf readOnly: true volumes: - name: nginx-conf configMap: name: nginx-conf items: - key: nginx.conf path: nginx.conf EOF
Verify that the nginx server is up and running.
kubectl get pods | grep nginx
Example output:
nginx 1/1 Running 0 15s
Create an HTTPRoute to expose the nginx server on the Gateway.
kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: nginx namespace: default spec: parentRefs: - name: http namespace: gloo-system hostnames: - http2.example.com rules: - backendRefs: - name: nginx port: 8080 EOF
Send a request to the nginx server and include the
--http2-prior-knowledge
to send an HTTP/2 request to the Gateway. Verify that the request succeeds and that you get back a 200 HTTP response code.Example output:
... > GET / HTTP/2 > Host: http2.example.com:8080 > User-Agent: curl/8.7.1 > Accept: */* > * Request completely sent off < HTTP/2 200 HTTP/2 200 ... <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Cleanup
You can optionally remove the resources that you set up as part of this guide.
kubectl delete httproute nginx
kubectl delete pod nginx
kubectl delete service nginx
kubectl delete configmap nginx-conf