【问题标题】:Kubernetes on AWS: Preserving Client IP with nginx-ingress + cert-managerAWS 上的 Kubernetes:使用 nginx-ingress + cert-manager 保留客户端 IP
【发布时间】:2018-12-20 10:42:06
【问题描述】:

我们已经设置 Kubernetes 与 nginx-ingress 结合 cert-manager 使用 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 自动配置。

这一切都很好,但有一个问题,流量的源 IP 地址丢失给 Pod 中的应用程序。

建议使用注释来应用于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

【问题讨论】:

  • 你能分享你的入口资源配置吗?
  • 添加了入口配置。顺便说一句,我将整个集群移至 GCE 并成功地实现了我想要的目标(并且整个体验变得不那么令人不快了)。在 GCE 中,将 controller.service.externalTrafficPolicy=Local 添加到 stable/nginx-ingress 的 Helm 安装/升级命令就可以了。

标签: ssl kubernetes amazon-eks


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    helm upgrade my-nginx stable/nginx-ingress --set rbac.create=true --set controller.service.externalTrafficPolicy=Local
    

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 1970-01-01
      • 2017-02-08
      • 2021-12-02
      • 1970-01-01
      • 2018-09-17
      • 2018-08-05
      • 2020-12-29
      • 2018-11-21
      相关资源
      最近更新 更多