ClusterIP 是否能够为多个 Pod 负载平衡流量?

Ale*_*ein 0 kubernetes

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

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

kubectl port-forward svc/internal-service-cip 8081:80 -n prod
Run Code Online (Sandbox Code Playgroud)

所有请求都在同一个 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

通常,Service 确实会在选定的 pod 之间提供负载平衡。您可以使用调试外壳看到这一点:

kubectl run --namespace=prod debug \
            --generator=run-pod/v1 \
            --image=busybox --rm --stdin --tty -- \
            /bin/sh
wget -O- http://internal-service-cip/
Run Code Online (Sandbox Code Playgroud)

(第一个命令与 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,因此在这种情况下似乎没有负载平衡。