如何为在 EKS 中运行的 Grpc 服务设置带有 TLS 终止的 AWS 网络负载均衡器 (NLB)?

问题描述 投票:0回答:0

我正在使用 AWS 负载均衡器控制器为在 EKS 中运行的 Grpc 服务(grpc-dotnet 实现)设置带有 TLS 终止的 AWS NLB。 EKS 中 NLB 和 Pod 之间的流量未加密。我也尝试在 UI 中进行设置,但结果相同。带有 NLB 配置注解的 k8s 服务:

apiVersion: v1
kind: Service
metadata:
    annotations:
        service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
        service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: /health
        service.beta.kubernetes.io/aws-load-balancer-internal: 'true'
        service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip
        service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
        service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS13-1-2-2021-06"
        service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:eu-west-1:account:certificate/my-cert-arn"
        service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "9090"
        # service.beta.kubernetes.io/aws-load-balancer-alpn-policy: HTTP2Preferred
    name: grpc-api-svc
    namespace: default
spec:
    ports:
        - 
            port: 9090
            protocol: TCP
            targetPort: 9090
    selector:
        app: grpc-api
    type: LoadBalancer

配置路由流量从 NLB 到我的 Grpc Api,但请求以错误结束:

{
  "created": "@1678456920.910000000",
  "description": "Failed to pick subchannel",
  "file": "src/core/ext/filters/client_channel/client_channel.cc",
  "file_line": 5391,
  "referenced_errors": [
    {
      "created": "@1678456920.909000000",
      "description": "failed to connect to all addresses",
      "file": "src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc",
      "file_line": 398,
      "grpc_status": 14
    }
  ]
}

当我删除 TLS 终止(SSL 部分)时,它运行良好。

我也试过加ALPN

service.beta.kubernetes.io/aws-load-balancer-alpn-policy: HTTP2Preferred
结果相同。

编辑: Python 服务运行良好,仅当我使用 .Net Grpc Server (grpc-dotnet) 时才会出现此问题

根本原因: NLB 确实会终止 TLS,但会保留在标头 https 架构中。似乎 .net 服务器更严格,Kestrel 忽略了这些请求。

解决方案 您必须在 Kestrel 选项中设置

options.AllowAlternateSchemes = true
grpc amazon-eks http2 tls1.3 aws-nlb
© www.soinside.com 2019 - 2024. All rights reserved.