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
我们已经使用 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