kubernetes - ClusterIP 是否能够负载平衡多个 pod 的流量?
问题描述
我ReplicaSet
用replicas = 3
. 这些 podinternal-pod-a
仅用于内部需求internal-pod-b
。internal-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
解决方案
通常,服务 确实提供跨选定 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,因此在这种情况下似乎没有负载平衡。
推荐阅读
- javascript - For循环增加字体大小直到填充正文高度
- c++ - 来自 c++ 特权守护进程的通知给所有用户
- google-apps-script - 如何使用 Appscript 从 Admin SDK >> Reports API 将已删除、存档、暂停的用户数据提取到 Google 工作表
- php - Laravel - ErrorException:未定义的变量:Laravel Passport 登录中的请求
- python - 没有名为“pynput”的模块
- laravel - Laravel - Eloquent 选择并计算一些相关数据
- python - 为什么画布不能滚动?
- node.js - bcrypt.compare 总是返回 false
- swift - Swift 的 FileHandle.read 或 macOS 上的数据缓冲区中的内存泄漏
- python - ROS2 python节点位置