- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我越来越喜欢 k8s,我正在我的个人 VPS 上尝试一些东西。我已经创建了一个在内部使用另一个服务的 POD 部署。我很乐意验证这两项服务是否在某种程度上实现了负载平衡。
这是我尝试创建的:我有一项名为 metric-test 的简单服务,它只有一个端点,用于计算它被调用的次数、记录它并返回此信息。为此,我使用了微框架 jooby,因为我熟悉它并且可以快速入门。
这个简单应用的代码可以是found on github
我还在存储库中添加了 deployment.yaml 文件,我使用该文件将其推送到本地版本的 minikube(模拟我的 k8s 环境)。
采取的步骤:
eval $(minikube docker-env)
docker build 构建项目的 docker 镜像。 -t 指标测试 1
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 ),但老实说,实际上我提出的问题多于答案。这就是为什么我试图创建一个简化的场景来测试这些东西。
问题
注意:据我所知,使用 LoadBalancer
和 Ingress
您实际上可以实现负载平衡,但是,它也会暴露给外部。
有关部署的更多信息: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
正如 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
创建)我得到了一个很好的均匀负载分布!!!
再次感谢用户 m303945 为我指明了正确的方向
最佳答案
如果我没记错的话,TCP 负载平衡在使用端口转发时不起作用。尝试从 k8s 内的容器运行脚本,而不是进行端口转发。
关于kubernetes - K8s 有任何负载均衡吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68058250/
core@core-1-94 ~ $ kubectl exec -it busybox -- nslookup kubernetesServer: 10.100.0.10Address 1: 1
我有一个节点错误地注册在集群 B 上,而它实际上为集群 A 服务。 这里“在集群 B 上注册”意味着我可以从 kubectl get node 看到节点来自集群 B。 我想从集群 B 中取消注册这个节
据我所知,Kubernetes 是一个用于部署和管理容器的编排框架。另一方面,Kubernetes Engine 负责集群的伸缩,以及管理容器镜像。 从上面看,它们似乎是同一件事或非常相似。从上面的定
我正在学习 Kubernetes 和 Docker,以启动一个简单的 Python 网络应用程序。我对上述所有技术都不熟悉。 下面是我计划的方法: 安装 Kubernetes。 在本地启动并运行集群。
我了解如何在 kubernetes 中设置就绪探测器,但是是否有任何关于在调用就绪探测器时微服务应实际检查哪些内容的最佳实践?两个具体例子: 一个面向数据库的微服务,如果没有有效的数据库连接,几乎所有
Kubernetes 调度程序是仅根据请求的资源和节点在服务器当前快照中的可用资源将 Pod 放置在节点上,还是同时考虑节点的历史资源利用率? 最佳答案 在官方Kubernetes documenta
我们有多个环境,如 dev、qa、prepod 等。我们有基于环境的命名空间。现在我们将服务命名为 environment 作为后缀。例如。, apiVersion: apps/v1
我有一个关于命名空间的问题,并寻求您的专业知识来消除我的疑虑。 我对命名空间的理解是,它们用于在团队和项目之间引入逻辑边界。 当然,我在某处读到命名空间可用于在同一集群中引入/定义不同的环境。 例如测
我知道角色用于授予用户或服务帐户在特定命名空间中执行操作的权限。 一个典型的角色定义可能是这样的 kind: Role apiVersion: rbac.authorization.k8s.io/v1
我正在学习 Kubernetes,目前正在深入研究高可用性,虽然我知道我可以使用本地(或远程)etcd 以及一组高可用性的控制平面(API 服务器、 Controller 、调度程序)来设置minio
两者之间有什么实际区别?我什么时候应该选择一个? 例如,如果我想让我的项目中的开发人员仅查看 pod 的日志。似乎可以通过 RoleBinding 为服务帐户或上下文分配这些权限。 最佳答案 什么是服
根据基于时间的计划执行容器或 Pod 的推荐方法是什么?例如,每天凌晨 2 点运行 10 分钟的任务。 在传统的 linux 服务器上,crontab 很容易工作,而且显然在容器内部仍然是可能的。然而
有人可以帮助我了解服务网格本身是否是一种入口,或者服务网格和入口之间是否有任何区别? 最佳答案 “入口”负责将流量路由到集群中(来自 Docs:管理对集群中服务的外部访问的 API 对象,通常是 HT
我是 kubernetes 集群的新手。我有一个简单的问题。 我在多个 kubernetes 集群中。 kubernetes 中似乎有多个集群可用。所以 kubernetes 中的“多集群”意味着:
我目前正在使用Deployments管理我的K8S集群中的Pod。 我的某些部署需要2个Pod /副本,一些部署需要3个Pod /副本,而有些部署只需要1个Pod /副本。我遇到的问题是只有一个 po
我看过官方文档:https://kubernetes.io/docs/tasks/setup-konnectivity/setup-konnectivity/但我还是没明白它的意思。 我有几个问题:
这里的任何人都有在 kubernetes 上进行批处理(例如 spring 批处理)的经验?这是个好主意吗?如果我们使用 kubernetes 自动缩放功能,如何防止批处理处理相同的数据?谢谢你。 最
我有一个具有 4 个节点和一个主节点的 Kubernetes 集群。我正在尝试在所有节点中运行 5 个 nginx pod。目前,调度程序有时在一台机器上运行所有 pod,有时在不同的机器上运行。 如
我在运行 Raspbian Stretch 的 Raspberry PI 3 上使用以下命令安装最新版本的 Kubernetes。 $ curl -s https://packages.cloud.g
container port 与 Kubernetes 容器中的 targetports 有何不同? 它们是否可以互换使用,如果可以,为什么? 我遇到了下面的代码片段,其中 containerPort
我是一名优秀的程序员,十分优秀!