https://kubernetes.io/docs/tutorials/services/source-ip/此处说明的IP白名单/黑名单示例使用source.ip属性。但是,在kubernetes(在docker-for-desktop上运行的kubernetes集群)中,source.ip返回kube-proxy的IP。建议的解决方法是使用request.headers["X-Real-IP"]
,但是似乎不起作用,并且在Mac的docker-for-desktop中返回kube-proxy IP。
https://github.com/istio/istio/issues/7328提到了此问题,并指出:
使用代理来终止客户端连接并打开与您的节点/端点的新连接。在这种情况下,源IP将始终是云LB的IP,而不是客户端的IP。
使用数据包转发器,以便从客户端发送到负载平衡器VIP的请求最终在具有客户端源IP而不是中间代理的节点处结束。
第一类负载平衡器必须在负载平衡器和后端之间使用协议达成协议,以传达真实的客户端IP,例如HTTP X-FORWARDED-FOR标头或代理协议。>
有人可以帮助我们如何定义协议以从负载均衡器获取客户端IP吗?
答案 0 :(得分:2)
也许您对kube-proxy和istio感到困惑,默认情况下,Kubernetes使用kube-proxy,但是您可以安装istio,它为每个Pod注入新的代理,以控制双向通信到Pod中的服务。
话虽如此,您可以在群集上安装istio并仅为所需的服务启用它,并使用istio机制将其列入黑名单
https://istio.io/docs/tasks/policy-enforcement/denial-and-list/
要使用源IP列入黑名单,我们必须让istio来管理如何获取源IP地址并使用som配置,如从文档中获取的那样:
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
name: whitelistip
spec:
compiledAdapter: listchecker
params:
# providerUrl: ordinarily black and white lists are maintained
# externally and fetched asynchronously using the providerUrl.
overrides: ["10.57.0.0/16"] # overrides provide a static list
blacklist: false
entryType: IP_ADDRESSES
---
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
name: sourceip
spec:
compiledTemplate: listentry
params:
value: source.ip | ip("0.0.0.0")
---
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
name: checkip
spec:
match: source.labels["istio"] == "ingressgateway"
actions:
- handler: whitelistip
instances: [ sourceip ]
---
您可以使用参数providerURL
来维护外部列表。
还要检查是否在istio的入口网关服务上使用externalTrafficPolicy: Local
。
根据评论,我的最后建议是使用不同的入口控制器以避免使用kube-proxy,我的建议是使用nginx-controller
https://github.com/kubernetes/ingress-nginx
您可以将此入口配置为充当代理的常规nginx