禁用Kubernetes副本集负载平衡

时间:2020-10-03 14:10:22

标签: kubernetes kubernetes-service

我有一个由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.1080.11.12.1180.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上为每个节点转发流量?

2 个答案:

答案 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}}选项的文档。