AWS 上的 Kubernetes:使用 nginx-ingress + cert-manager 保留客户端 IP

Kubernetes on AWS: Preserving Client IP with nginx-ingress + cert-manager

我们已经使用 nginx-ingress 结合 cert-manager 设置 Kubernetes,以使用 LetsEncrypt 自动获取和使用入口域的 SSL 证书,使用本指南:https://medium.com/@maninder.bindra/auto-provisioning-of-letsencrypt-tls-certificates-for-kubernetes-services-deployed-to-an-aks-52fd437b06b0。结果是每个 Ingress 都定义了自己的 SSL 证书,该证书由 cert-manager.

自动提供

一切正常,但有一个问题,Pods 中的应用程序丢失了流量的源 IP 地址。

有一个注解建议用于 nginx-ingress 控制器服务 service.beta.kubernetes.io/aws-load-balancer-backend-protocol: '*'。这具有保留源 IP 地址的效果。但是,这样做会破坏 SSL:

An error occurred during a connection to {my.domain.com}. SSL received a record that exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG

我的头开始旋转。有谁知道解决这个问题的任何方法(在我看来这是一个常见的要求)?

入口配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-http-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
  - host: my.host.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-http-service
          servicePort: 80
  tls:
  - hosts:
    - "my.host.com"
    secretName: malcolmqa-tls

正如评论中提到的@dom_watson,在 Helm 安装配置中添加参数 controller.service.externalTrafficPolicy=Local 解决了这个问题,因为 Local 值保留了客户端源 IP,因此网络流量将到达 Kubernetes 集群中的目标 Pod。在官方 Kubernetes guidelines.

中查找更多信息
helm upgrade my-nginx stable/nginx-ingress --set rbac.create=true --set controller.service.externalTrafficPolicy=Local