【发布时间】:2021-01-02 17:35:49
【问题描述】:
我知道 Kubernetes 中的 LoadBalancer 类型服务可以实现客户端关联。问题是这种亲和性并不禁止两个不同的客户端访问同一个 pod。
是否可以将一个 pod 始终以独占方式关联到同一个客户端?
提前致谢,祝您有美好的一天!
【问题讨论】:
我知道 Kubernetes 中的 LoadBalancer 类型服务可以实现客户端关联。问题是这种亲和性并不禁止两个不同的客户端访问同一个 pod。
是否可以将一个 pod 始终以独占方式关联到同一个客户端?
提前致谢,祝您有美好的一天!
【问题讨论】:
要仅允许特定的外部客户端访问特定的 Pod/部署,您可以使用白名单/源范围。限制可以是applied to LoadBalancers 和loadBalancerSourceRanges。您向服务添加一个部分,例如:
loadBalancerSourceRanges:
- 130.211.204.1/32
- 130.211.204.2/32
但是not all cloud providers currently support it。
或者,您可以使用 Ingress 和 apply whitelisting on the Ingress 公开 Pod。对于使用 nginx Ingress 的白名单,您可以向 Ingress 添加注释,例如 nginx.ingress.kubernetes.io/whitelist-source-range: 49.36.X.X/32
【讨论】:
不,这意味着您为每个客户端运行一个服务副本,这是一种非常不标准的做事方式,因此您必须自己构建它。
【讨论】:
不完全是POD。
您可以使用基于客户端 IP 的会话亲和性,当然前提是客户端 IP 是静态的并且每个 IP 只有一个客户端。
apiVersion: v1
kind: Service
metadata:
name: wlp-service
labels:
app: wlp-service
spec:
type: LoadBalancer
sessionAffinity: ClientIP
ports:
- port: 443
targetPort: 7443
name: https
- port: 80
targetPort: 7080
name: http
selector:
app: POD_NAME
第二个选项是基于 Cookie 的会话亲和性。如果有来自同一 IP 的多个客户端,这将起作用,因为 cookie 本地存储在客户端计算机上。
您将需要使用 Ingress 对象并生成 cookie。您的Ingress 部署需要:
Annotations:
affinity: cookie
session-cookie-hash: sha1/md5/index #choose one
session-cookie-name: INGRESSCOOKIE #name used in cookie value
您可以通过 medium.com 在Redirect your users to the same pod by using session affinity on Kubernetes 上阅读有关这两种方式的更多信息
如果我没记错的话,只有在运行 kube-proxy 之前在节点上安装了 IPVS 内核模块时,Session Affinity 才会起作用。
在 IPVS 模式下运行 kube-proxy
目前,local-up 脚本、GCE 脚本和 kubeadm 支持通过导出环境变量 (
KUBE_PROXY_MODE=ipvs) 或指定标志 (--proxy-mode=ipvs) 来切换 IPVS 代理模式。在运行 IPVS 代理之前,请确保已经安装了 IPVS 所需的内核模块。ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4最后,对于 Kubernetes v1.10,功能门
SupportIPVSProxyMode默认设置为true。对于 Kubernetes v1.11,特性门被完全移除。但是,您需要在 v1.10 之前为 Kubernetes 显式启用--feature-gates=SupportIPVSProxyMode=true。
请查看这个 StackOverflow 问题 Is it possible to route traffic to a specific Pod?,也可以在 IPVS-Based In-Cluster Load Balancing Deep Dive 上阅读有关 IPVS 的更多信息
【讨论】: