首页 > 解决方案 > ClusterIP 是否能够负载平衡多个 pod 的流量?

问题描述

ReplicaSetreplicas = 3. 这些 podinternal-pod-a仅用于内部需求internal-pod-binternal-pod-c然后我创建了一个ClusterIP类型为将请求路由到 pod 的服务。

出于测试目的,我试图查看流量将如何分布。端口转发后,我对服务执行了几个请求:

kubectl port-forward svc/internal-service-cip 8081:80 -n prod

所有请求都在同一个 pod 上提供internal-pod-a

所以我很困惑,为什么ClusterIP将所有请求发送到同一个 pod?

k8s 体现:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  namespace: prod
  name: internal-pod
  labels:
    app: internal-pod
    environment: prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: internal-pod
      environment: prod
  template:
    metadata:
      labels:
        app: internal-pod
        environment: prod
    spec:
      containers:
      - name: internal-pod
        image: bla-bla-repo
        ports:
        - containerPort: 8080
-----------------------------
apiVersion: v1
kind: Service
metadata:
  namespace: prod
  name: internal-service-cip
spec:
  type: ClusterIP
  selector:
    app: internal-pod
  ports:
  - name: http
    port: 80
    targetPort: 8080
    protocol: TCP

标签: kubernetes

解决方案


通常,服务 确实提供跨选定 pod 的负载平衡。您可以使用调试 shell 看到这一点:

kubectl run --namespace=prod debug \
            --generator=run-pod/v1 \
            --image=busybox --rm --stdin --tty -- \
            /bin/sh
wget -O- http://internal-service-cip/

(第一个命令是 Kubernetes 等效的docker run --rm -it busybox sh,但在您的 Kubernetes 命名空间中启动它。)

在引擎盖下,kubectl port-forward总是连接到某个 pod(强调我的):

将一个或多个本地端口转发到一个 pod。... 如果有多个 pod 符合条件,则会自动选择一个 pod。

因此,如果您kubectl port-forward service/internal-service-cip在内部查看服务的端点,选择一个匹配的 pod,然后将端口转发到该 pod。由于每个连接都指向同一个 pod,因此在这种情况下似乎没有负载平衡。


推荐阅读