diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index 4c0da2eb9..1f3f0ee37 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -1481,6 +1481,13 @@ stream { proxy_next_upstream_timeout {{ $location.Proxy.NextUpstreamTimeout }}; proxy_next_upstream_tries {{ $location.Proxy.NextUpstreamTries }}; + # Grpc settings + {{ if or (eq $location.BackendProtocol "GRPC") (eq $location.BackendProtocol "GRPCS")}} + grpc_connect_timeout {{ $location.Proxy.ConnectTimeout }}s; + grpc_send_timeout {{ $location.Proxy.SendTimeout }}s; + grpc_read_timeout {{ $location.Proxy.ReadTimeout }}s; + {{ end }} + {{/* Add any additional configuration defined */}} {{ $location.ConfigurationSnippet }} diff --git a/test/e2e/annotations/grpc.go b/test/e2e/annotations/grpc.go index b3be82c2a..e5aef7971 100644 --- a/test/e2e/annotations/grpc.go +++ b/test/e2e/annotations/grpc.go @@ -35,7 +35,10 @@ import ( "k8s.io/ingress-nginx/test/e2e/framework" ) -const echoHost = "echo" +const ( + echoHost = "echo" + host = "grpc" +) var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { f := framework.NewDefaultFramework("grpc", framework.WithHTTPBunEnabled()) @@ -43,8 +46,6 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { ginkgo.It("should use grpc_pass in the configuration file", func() { f.NewGRPCFortuneTellerDeployment() - host := "grpc" - annotations := map[string]string{ "nginx.ingress.kubernetes.io/backend-protocol": "GRPC", } @@ -259,4 +260,48 @@ var _ = framework.DescribeAnnotation("backend-protocol - GRPC", func() { metadata := res.GetMetadata() assert.Equal(ginkgo.GinkgoT(), metadata["content-type"].Values[0], "application/grpc") }) + + ginkgo.It("should set valid grpc timeouts for grpc", func() { + proxyConnectTimeout := "5" + proxySendTimeout := "30" + proxyReadtimeout := "30" + + annotations := make(map[string]string) + annotations["nginx.ingress.kubernetes.io/backend-protocol"] = "grpc" + annotations["nginx.ingress.kubernetes.io/proxy-connect-timeout"] = proxyConnectTimeout + annotations["nginx.ingress.kubernetes.io/proxy-send-timeout"] = proxySendTimeout + annotations["nginx.ingress.kubernetes.io/proxy-read-timeout"] = proxyReadtimeout + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, fmt.Sprintf("grpc_connect_timeout %ss;", proxyConnectTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_send_timeout %ss;", proxySendTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_read_timeout %ss;", proxyReadtimeout)) + }) + }) + + ginkgo.It("should set valid grpc timeouts for grpcs", func() { + proxyConnectTimeout := "5" + proxySendTimeout := "30" + proxyReadtimeout := "30" + + annotations := make(map[string]string) + annotations["nginx.ingress.kubernetes.io/backend-protocol"] = "grpcs" + annotations["nginx.ingress.kubernetes.io/proxy-connect-timeout"] = proxyConnectTimeout + annotations["nginx.ingress.kubernetes.io/proxy-send-timeout"] = proxySendTimeout + annotations["nginx.ingress.kubernetes.io/proxy-read-timeout"] = proxyReadtimeout + + ing := framework.NewSingleIngress(host, "/", host, f.Namespace, framework.EchoService, 80, annotations) + f.EnsureIngress(ing) + + f.WaitForNginxServer(host, + func(server string) bool { + return strings.Contains(server, fmt.Sprintf("grpc_connect_timeout %ss;", proxyConnectTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_send_timeout %ss;", proxySendTimeout)) && + strings.Contains(server, fmt.Sprintf("grpc_read_timeout %ss;", proxyReadtimeout)) + }) + }) })