我对k8s的兴趣越来越大,我正在尝试一些关于个人VPS的东西。我已经创建了一个POD部署,它在内部使用另一个服务。我想验证这两个服务是否在某种程度上是负载平衡的。
下面是我创建这个工具的尝试:我有一个简单的服务,我称之为度量--测试,它只有一个端点,可以计数调用它的次数、记录它并返回这些信息。为此,我使用了微框架jooby,因为我熟悉它,并且可以得到一个快速的启动。
这个简单应用程序的代码可以是在github上发现
在存储库中,我还添加了deployment.yaml文件,用于将其推送到本地版本的minikube (它模拟了的k8s env)。
采取的步骤:
eval $(minikube docker-env)docker build . -t metric-test1构建项目的对接映像kubectl apply -f deployment.yaml应用部署文件(该文件也位于github链接上)。这给了我一个ClusterIP类型的服务(这正是我想要的,因为它不应该从外部访问)和包含jooby代码的两个荚。下面是deployment.yaml文件:
apiVersion: v1
kind: Service
metadata:
name: metric-test
labels:
run: metric-test
spec:
ports:
- port: 3000
protocol: TCP
selector:
run: metric-test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metric-test
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 3
selector:
matchLabels:
run: metric-test
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
run: metric-test
spec:
containers:
- image: metric-test1
imagePullPolicy: Never
name: data-api
ports:
- containerPort: 3000
protocol: TCP
name: 3000tcp
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30好吧,一切正常!我只是设置了一个端口转发,这样我就可以访问服务:kubectl port-forward service/metric-test 3000:3000
并使用此脚本在服务中激发大量请求:
#!/bin/bash
target=${1:-http://localhost:3000}
while true # loop forever, until ctrl+c pressed.
do
for i in $(seq 100) # perfrom the inner command 100 times.
do
curl $target > /dev/null & # send out a curl request, the & indicates not to wait for the response.
done
wait # after 100 requests are sent out, wait for their processes to finish before the next iteration.
done我现在看到的是所有请求的,这些请求仅由一个豆荚处理,而另一个则处于空闲状态。
我查阅了文档(这里),但老实说,实际上我提出的问题多于答案。这就是为什么我试图创建一个简化的场景来测试这些东西。
问题
注意:据我所理解,使用LoadBalancer和Ingress,您实际上可以实现负载平衡,但是,它也暴露在外部。
编辑1
有关部署的更多信息:kubectl get po的结果
NAME READY STATUS RESTARTS AGE
metric-test-f89bfbf86-ccrj8 1/1 Running 0 16h
metric-test-f89bfbf86-kl7qg 1/1 Running 0 16h下面是运行curl脚本一段时间后两种日志的图片:

编辑用于解决方案
正如m303945所说,当我们使用端口转发时,负载平衡不起作用。
为了验证这一点,以及将来我可能想做的任何测试,我做了以下工作:
我在我的终端中运行了以下命令:
kubectl run -it --rm --restart=Never --image=alpine handytools -n ${1:-default} -- /bin/ash它创建了一个基于阿尔卑斯的容器,并允许我访问shell。但是,在这一点上,我不能使用curl,因为它没有安装。为此我跑了:
apk updateapk add curl有了这些之后,我从上面修改了以前的bash脚本,让它在这个吊舱上运行,并尝试访问我设置的服务:
#!/bin/ash
target=${1:-http://metric-test:3000}
for i in $(seq 5) # loop 5 times to generate 500 calls.
do
for i in $(seq 100) # perfrom the inner command 100 times.
do
curl $target > /dev/null & # send out a curl request, the & indicates not to wait for the response.
done
wait # after 100 requests are sent out, wait for their processes to finish before the next iteration.
done修改包括指向服务而不是"localhost“,并且不需要端口。另外,高寒使用的是ash,而不是bash外壳。我还运行了500个请求,而不是无穷大。
正如您所看到的,运行上面的内容(您可以在高山上使用vi创建),我得到了一个很好的均匀加载分布!

再次感谢用户m303945为我指明了正确的方向
发布于 2021-07-02 19:13:06
如果我没记错的话,TCP负载平衡在使用端口转发时不起作用。尝试从k8s内部的容器中运行脚本,而不是进行端口转发。
https://stackoverflow.com/questions/68058250
复制相似问题