【问题标题】:Preserve source IP on Kubernetes bare-metal with ingress-nginx, Iptables and MetalLb使用 ingress-nginx、Iptables 和 MetalLb 在 Kubernetes 裸机上保留源 IP
【发布时间】:2020-12-29 08:44:41
【问题描述】:

我有一个 Kubernetes 集群的设置,其中包含一个主节点和一个工作节点。

通过从主机到 LoadBalancer 类型的 ingress-nginx 服务进行 NAT 将流量路由到集群,使用 MetalLb 设置:

#!/bin/bash

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination "$1":80
iptables -A FORWARD -p tcp -d "$1" --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

$1是ingress-nginx的外网IP。

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

此时,如果我查看 ingress-nginx pod 的日志,我可以看到真正的源 IP 地址。

问题是当我检查下游应用程序的日志时,这些应用程序从入口获取流量,源 IP 是入口 pod 的 IP。

kind: Ingress
metadata:
  namespace: laurkyt
  name: laurkyt-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/session-cookie-hash: sha1
    nginx.ingress.kubernetes.io/session-cookie-name: REALTIMESERVERID
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    ingress.kubernetes.io/proxy-body-size: 50m
spec:
  tls:
  - hosts:
    - example.com
    - '*.example.com'
    secretName: wildcard-example-com
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: laurkyt
          servicePort: 443
apiVersion: v1
kind: Service
metadata:
  namespace: laurkyt
  name: laurkyt
  labels:
    app: laurkyt
spec:
  externalTrafficPolicy: Local
  ports:
  - port: 80
    targetPort: 80
    name: "http"
  - port: 443
    targetPort: 443
    name: "https"
  selector:
    app: laurkyt
    tier: laurkyt

有谁知道我为了在后端 pod 中保留源 IP 而缺少什么?

【问题讨论】:

  • 问题解决了吗?

标签: kubernetes kubernetes-ingress metallb


【解决方案1】:

由于入口在第 4 层代理之上。您无法在第 3 层 IP 协议中保留 SRC IP。最好的是,我认为 Nginx Ingress 已经默认设置为他们将“X-Forwarded-For”标头放在任何 HTTP 转发中。

您的应用应该记录 X-Forwarded-For 标头。

【讨论】:

  • 我正在使用 X-Forwarded 标头获取 IP。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多