我有一个由3个节点组成的Kubernetes集群。
示例部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
我没有入口,但是我有外部负载平衡器,该负载平衡了80.11.12.10
,80.11.12.11
,80.11.12.12
处的流量。所以我这样设置服务。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
externalIPs:
- 80.11.12.10
- 80.11.12.11
- 80.11.12.12
问题是由于现有的kubernetes服务负载平衡器,流量两次获得了负载平衡。除了不必要之外,它破坏了连接的持久性。是否有一种方法可以强制Kubernetes在本地机器Pod上为每个节点转发流量?
答案 0 :(得分:1)
如果将service.spec.externalTrafficPolicy
设置为值Local
,则kube-proxy仅将代理请求代理到本地终结点,而不将流量转发到其他节点。
kubectl patch svc servicename -p '{"spec":{"externalTrafficPolicy":"Local"}}'
如果没有本地终结点,则发送到该节点的数据包将被丢弃。
对于clusterIP
类型的服务,您需要使用Service Topology
服务拓扑使服务能够根据以下情况路由流量 集群的节点拓扑。例如,服务可以指定 流量优先路由到同一端点 作为客户端的节点,或在相同的可用区域中。
这是Kubernetes 1.17中提供的Alpha功能,需要通过enabling the feature flag开启
答案 1 :(得分:0)
kube-proxy
使用ipvs
是为了在最近的k8s版本中平衡负载平衡。可以在节点级别使用ipvsadm
,以便选择您要ipvs
使用的负载均衡算法。根据{{3}},您可以在8种负载平衡算法中进行选择:轮询,加权轮询,最小连接,加权最小连接,基于位置的最小连接,基于位置的具有复制的最小连接,目标哈希和源哈希。有关其他信息,请查看--scheduler
的{{1}}选项的文档。