首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K8s有负载平衡吗?

K8s有负载平衡吗?
EN

Stack Overflow用户
提问于 2021-06-20 17:09:00
回答 1查看 394关注 0票数 3

我对k8s的兴趣越来越大,我正在尝试一些关于个人VPS的东西。我已经创建了一个POD部署,它在内部使用另一个服务。我想验证这两个服务是否在某种程度上是负载平衡的。

下面是我创建这个工具的尝试:我有一个简单的服务,我称之为度量--测试,它只有一个端点,可以计数调用它的次数、记录它并返回这些信息。为此,我使用了微框架jooby,因为我熟悉它,并且可以得到一个快速的启动。

这个简单应用程序的代码可以是在github上发现

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

采取的步骤:

  1. 使用此cmd将码头映像编译为minikube:eval $(minikube docker-env)
  2. 我现在用docker build . -t metric-test1构建项目的对接映像
  3. 然后我使用kubectl apply -f deployment.yaml应用部署文件(该文件也位于github链接上)。

这给了我一个ClusterIP类型的服务(这正是我想要的,因为它不应该从外部访问)和包含jooby代码的两个荚。下面是deployment.yaml文件:

代码语言:javascript
复制
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

并使用此脚本在服务中激发大量请求:

代码语言:javascript
复制
#!/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

我现在看到的是所有请求的,这些请求仅由一个豆荚处理,而另一个则处于空闲状态。

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

问题

  1. 有人能帮我吗?
  2. 我遗漏了什么?如何在不通过互联网公开服务的情况下实现这种负载平衡。我只希望它可以用于集群中的其他吊舱。
  3. (奖金)由大会提供的前端服务都应该是负载均衡的(对吗?)

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

编辑1

有关部署的更多信息:kubectl get po的结果

代码语言:javascript
复制
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所说,当我们使用端口转发时,负载平衡不起作用。

为了验证这一点,以及将来我可能想做的任何测试,我做了以下工作:

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

代码语言:javascript
复制
kubectl run -it --rm --restart=Never --image=alpine handytools -n ${1:-default} -- /bin/ash

它创建了一个基于阿尔卑斯的容器,并允许我访问shell。但是,在这一点上,我不能使用curl,因为它没有安装。为此我跑了:

  • apk update
  • apk add curl

有了这些之后,我从上面修改了以前的bash脚本,让它在这个吊舱上运行,并尝试访问我设置的服务:

代码语言:javascript
复制
#!/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为我指明了正确的方向

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 19:13:06

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68058250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档