gpt4 book ai didi

kubernetes - K8s 有任何负载均衡吗?

转载 作者:行者123 更新时间:2023-12-04 13:08:38 25 4
gpt4 key购买 nike

我越来越喜欢 k8s,我正在我的个人 VPS 上尝试一些东西。我已经创建了一个在内部使用另一个服务的 POD 部署。我很乐意验证这两项服务是否在某种程度上实现了负载平衡。

这是我尝试创建的:我有一项名为 metric-test 的简单服务,它只有一个端点,用于计算它被调用的次数、记录它并返回此信息。为此,我使用了微框架 jooby,因为我熟悉它并且可以快速入门。

这个简单应用的代码可以是found on github

我还在存储库中添加了 deployment.yaml 文件,我使用该文件将其推送到本地版本的 minikube(模拟我的 k8s 环境)。

采取的步骤:

  1. 使用此命令将 docker 镜像编译到 minikube 存储库中:eval $(minikube docker-env)
  2. 我现在使用 docker build 构建项目的 docker 镜像。 -t 指标测试 1
  3. 然后我使用 kubectl apply -f deployment.yaml 应用部署文件(该文件也在 github 链接上

这为我提供了 ClusterIP 类型的服务(这是我想要的,因为它不应该从外部访问)和 2 个包含 jooby 代码的 PODS。这是 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 端口转发服务/指标测试 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

我现在看到所有 请求仅由一个 pod 处理,而另一个则只是闲置在那里。

我浏览了文档 ( here ),但老实说,实际上我提出的问题多于答案。这就是为什么我试图创建一个简化的场景来测试这些东西。

问题

  1. 谁能帮帮我?
  2. 我错过了什么?如何在不通过 Internet 公开服务的情况下实现这种负载平衡。我只是希望它可用于集群中的其他 pod。
  3. (奖励)Ingress 提供的前端服务都应该适本地进行负载平衡(对吗?)

注意:据我所知,使用 LoadBalancerIngress 您实际上可以实现负载平衡,但是,它也会暴露给外部。

编辑 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 脚本后两者的日志图片: Logs of both PODS

编辑解决方案

正如 m303945 所说,当我们使用端口转发时,负载平衡不起作用。

为了验证这一点,以及我可能想做的任何 future 测试,我做了以下事情:

我在终端中运行了以下命令:

kubectl run -it --rm --restart=Never --image=alpine handytools -n ${1:-default} -- /bin/ash

它创建了一个基于 alpine 的容器并为我提供了 shell 访问权限。但是,那时我无法使用 curl,因为它尚未安装。所以为此我跑了:

  • apk更新
  • apk 添加 curl

一旦我有了它,我就从上面修改了我以前的 bash 脚本以在这个 pod 上运行并尝试点击我设置的服务:

#!/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

修改包括指向服务而不是“本地主机”,并且不需要端口。此外,alpine 使用 ash 而不是 bash shell。我还运行了 500 个请求而不是无穷大。

如您所见,运行上面的代码(您可以在 alpine 中使用 vi 创建)我得到了一个很好的均匀负载分布!!! even distribution of calls

再次感谢用户 m303945 为我指明了正确的方向

最佳答案

如果我没记错的话,TCP 负载平衡在使用端口转发时不起作用。尝试从 k8s 内的容器运行脚本,而不是进行端口转发。

关于kubernetes - K8s 有任何负载均衡吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68058250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com