我知道,Kubernetes中的LoadBalancer类型服务可能具有客户端相似性。事实是,这种亲缘关系并不禁止两个不同的客户端访问同一吊舱。
是否有可能总是将pod始终与同一客户端相关联?
提前感谢,祝您有个愉快的一天!
答案 0 :(得分:2)
要仅允许特定的外部客户端访问特定的Pod / Deployment,可以使用白名单/源范围。限制可以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
答案 1 :(得分:1)
否,这意味着您正在为每个客户端运行该服务的一个副本,这是一种非常非标准的操作方式,因此您必须自己构建它。
答案 2 :(得分:0)
与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
当前,本地化脚本,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的更多信息