微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 GKE 使用-http2

如何解决在 GKE 使用-http2

我们已经在 GKE 上配置了一个集群并安装了 nginx-ingress。使用我们的入口规则它可以工作,但我不能让它与 HTTP/2 一起工作。我们在 ConfigMap 上设置数据信息,但它总是回退到 http/1.1。这个确切的设置在 DigitalOcean 上运行良好。谁能提供一些指导?

谢谢

安装 nginx-ingress

kubectl create ns ingress-Nginx
helm repo add Nginx-stable https://helm.Nginx.com/stable
helm repo update
helm install nginx-ingress Nginx-stable/nginx-ingress --namespace ingress-Nginx

我的入口文件

apiVersion: extensions/v1beta1
kind: Ingress
Metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: Nginx
    kubernetes.io/ingress.global-static-ip-name: "mylocalip"
spec:
  rules:
  - host: test.mydomain.com
    http:
      paths:
      - path: /hello
        backend:
          serviceName: hello-server
          servicePort: 80
      - backend:
          serviceName: default-server
          servicePort: 80

我的 ConfigMap 数据应用于 nginx-ingress-nginx-ingress configmap

data:
  use-http2: "true"

编辑(05/11/2021):

我们更改了入口以使用证书,现在我们使用 HTTPS 进行连接。但是,所有连接都是使用 http/1.1

建立的

您好,感谢您的回复。但我已将入口更改为使用 cert-manager 和 LetEncrypt,以下是更新后的入口。

入口

apiVersion: extensions/v1beta1
kind: Ingress
Metadata:
  name: my-ingress
  namespace: mynamespace
  annotations:
    kubernetes.io/ingress.class: Nginx
    kubernetes.io/ingress.global-static-ip-name: "myip"
spec:
  tls:
  - hosts:
    - test.mydomain.com
    secretName: my-cert
  rules:
  - host: test.mydomain.com
    http:
      paths:
      - backend:
          serviceName: myweb
          servicePort: 80

编辑 2 (05/14/2021)

当前版本:1.19.9-gke.1400 使用 curl 和 https://http2.pro/ 进行测试(均表示不可用)

同样的设置在 DigitalOcean 上使用 k8s。

这是我的安装和配置文件

安装 Ingress-Nginx

kubectl create ns ingress-Nginx
helm repo add Nginx-stable https://helm.Nginx.com/stable
helm repo update
helm install nginx-ingress Nginx-stable/nginx-ingress --namespace ingress-Nginx --set controller.service.loadBalancerIP=x.x.x.x

入口

apiVersion: extensions/v1beta1
kind: Ingress
Metadata:
  name: my-ingress
  namespace: mynamespace
  annotations:
    kubernetes.io/ingress.class: Nginx
spec:
  tls:
  - hosts:
    - test.mydomain.com
    secretName: my-cert
  rules:
  - host: test.mydomain.com
    http:
      paths:
      - backend:
          serviceName: myweb
          servicePort: 80

配置图

apiVersion: v1
kind: ConfigMap
Metadata:
  namespace: ingress-Nginx
  name: nginx-ingress-nginx-ingress
data:
  proxy-buffering: "false"
  ssl-ciphers: EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED
  ssl-protocols: TLSv1.2 TLSv1.3
  ssl-redirect: "true"
  use-forward-headers: "true"
  use-http2: "true"
  
  

解决方法

编辑


进一步复制后,我注意到问题中的 NGINX Ingress controllers 之间存在不匹配。

有 2 个类似命名的 Ingress 控制器:

这是 2 个单独的产品,此处解释了差异:

由于这个 Configmap 键:

  • use-http2: "true"

我错误地认为我们在谈论 nginx 而实际上它是 nginx-inc em>(我错过了 $ helm repo add 的链接)。此字段特定于 nginx,不适用于 nginx-inc

我已经设法找到一种方法来启用对 nginx-incHTTP/2 支持。更改:

  • 来自:use-http2: "true"
  • 至:http2: "true"

更多解释可以在这里找到:



下面是使用 HTTP/2GKE 上支持 Ingress 的更多一般方法。

附注!

即使 tls 清单中没有 YAML 部分,也可以使用 HTTPS,因为 Fake Ingress Controller certificate


正如以下 github 问题所指出的:

aledbf 于 2019 年 3 月 28 日发表评论


NGINX 无法在明文(非 TLS)端口上同时支持 HTTP/1.x 和 HTTP/2。 这就是它只有在使用 HTTPS 时才有效的原因。

-- Github.com: Kubernetes: Ingress nginx: Issue: HTTP2 support

如所述启用 HTTP/2,您需要在 Ingress 资源中配置 tls 部分(证书)。

您可以在此处找到帮助您完成流程的文档:


我在 GKE 版本 1.20.5-gke.2000Helm 部分)上使用了您的设置,这是我发现的内容。

使用 Ingress 请求查询 HTTP 控制器的外部 IP 将允许您使用 HTTP/1.1

在我将证书配置为与 Ingress 资源(和域名)一起使用后,我可以得到说明我正在使用 HTTP/2 的响应:

您可以通过各种措施(例如 cURL 或在线 HTTP/2 测试站点)进行检查:

  • curl -v -k https://DOMAIN.NAME
* Trying IP_ADRESS
* TCP_NODELAY set
* Connected to DOMAIN.NAME ( IP_ADRESS) port 443 (#0)
* ALPN,offering h2
* ALPN,offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
< <-- REDACTED --> 
* Using HTTP2,server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fa5b300e800)
> GET / HTTP/2
> Host: DOMAIN.NAME
> User-Agent: curl/7.64.1
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200 
< <-- REDACTED --> 
< 
< <-- NGINX WELCOME SITE --> 
* Connection #0 to host DOMAIN.NAME left intact
* Closing connection 0

您还可以寻求更多的单行解决方案:

  • curl -k -sI https://DOMAIN.NAME -o/dev/null -w '%{http_version}\n'

输出应该是2。更多参考:


此外,在您的 Configmapnginx-ingress 的修改部分添加整个答案:

data:
  use-http2: "true"

使用-http2

安全连接中启用或禁用 HTTP/2 支持。

-- Kubernetes.github.io: Ingress nginx: User guide: Nginx configuration: Configmap: Use HTTP/2

我也不确定这个注解的用法:

  • kubernetes.io/ingress.global-static-ip-name: "mylocalip"

因为它仅对 GKE IngressIngress 资源有效,而不对 ingress-nginx 有效。


其他资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。