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

时间:2018-12-20 10:42:07

标签: ssl kubernetes amazon-eks

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

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

有一个注释,建议将其应用于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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

helm upgrade my-nginx stable/nginx-ingress --set rbac.create=true --set controller.service.externalTrafficPolicy=Local