我用ReplicaSet
创建了一个replicas = 3
。这些pod internal-pod-a
,internal-pod-b
,internal-pod-c
仅用于内部需求。然后,我创建了一种ClusterIP
类型的服务,用于将请求路由到Pod。
出于测试目的,我尝试查看流量如何分配。端口转发后,我对服务执行了几个请求:
kubectl port-forward svc/internal-service-cip 8081:80 -n prod
所有请求均在同一吊舱internal-pod-a
上进行。
所以我很困惑,为什么ClusterIP
将所有请求发送到同一吊舱?
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
答案 0 :(得分:4)
通常,Service 确实提供跨所选Pod的负载平衡。您可以使用调试外壳看到此信息:
kubectl run --namespace=prod debug \
--generator=run-pod/v1 \
--image=busybox --rm --stdin --tty -- \
/bin/sh
wget -O- http://internal-service-cip/
(第一个命令是与docker run --rm -it busybox sh
等效的Kubernetes,但在您的Kubernetes命名空间中启动它。)
在引擎盖下,kubectl port-forward
总是连接到某个单一的Pod(重点是我的):
将一个或多个本地端口转发到Pod 。 ...如果有多个符合条件的广告连播,则会自动选择一个广告连播。
因此,如果您kubectl port-forward service/internal-service-cip
在内部查看服务的端点,则选择匹配的Pod之一,然后端口转发到该Pod。由于每个连接都连接到同一个Pod,因此在这种情况下似乎没有负载平衡。