给k8s集群添加负载均衡的能力

文章讲述了在自建的Kubernetes集群上,如何通过Ingress-Nginx控制器实现负载均衡。默认的nodeport服务不具备负载均衡能力,安装Ingress-Nginx后,请求可以被路由到不同node上的pod。作者发现浏览器的keepalive特性可能导致连续命中同一pod,而curl不会。通过调整Ingress-Nginx的ConfigMap,特别是load-balance策略(如round-robin、least-connected、ip-hash),可以改变这种行为。最终,使用ip-hash策略确保了多个pod共同处理请求,以适应批量数据运行的场景。

常识: k8s没有自带负载均衡能力, 需云服务提供商来做负载均衡, 或者自己装负载均衡控制器. 负载均衡控制器有很多, 这次装Ingress-Nginx

https://kubernetes.github.io/ingress-nginx/

文档里根据环境有很多安装方式,不要用quick start的,因为那是云环境下的.
我们的k8s是自己的服务器上搭建的, 用

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

然后就发现ok了, 原来的nodeport的服务, 只能指定某个node, 且请求就是在那个node执行的, (没有负载均衡,同node内的多pod应该是网络层的负载均衡 见下面的文章 )
装了之后请求到某个node后,请求会被路由到其他node, 就像docker swarm做的一样,至此基本能力已经具备.

有个小问题, 因为浏览器访问会带keepalive的header, 所以会连续命中某个pod, 而 curl就不会, 因为curl是不带keepalive的.正如下面文章的解释:

https://itnext.io/inspecting-and-understanding-service-network-dfd8c16ff2c5

这会是个问题,因为我们是会某个机器发出很多请求到集群.
那就要试试修改 Ingress-Nginx 的Config Map ,调整负载均衡策略, 看能不能达到想要的效果.(姑且不管这个需求合不合理)
如何修改config map:

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/configmap.md

其中找到了
在这里插入图片描述
要改的就是这个字段, 第三列的默认值, 确实轮询是基本的
点进去之后
在这里插入图片描述
说的annotation是部署的时候的一些值,
见:

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md

也就是yaml里的 kind: Ingress 那部分的设置 先不看, 先看全局的

ok 验证下来,当前最新版本即registry.k8s.io/ingress-nginx/controller:v1.7.1
虽然文档上说只有两个取值, 要么默认的round_robin 要么还不知道是什么的ewma
但,

https://nginx.org/en/docs/http/load_balancing.html

的三个复杂均衡策略, 是都可以用的,
其中前两个, 即round-robinleast-connected 两个线程一起调用的时候用kubectl top pod 查看是只有一个pod在运行所有请求
在这里插入图片描述

使用第三个即ip-hash 的时候, 会有两个pod一起干活
在这里插入图片描述

ok 至此算是勉强达到我们的目标, 这只是现象,具体原因还有具体调查.

现在的解决方案是, 如果要大批量数据运行, 就用ip-hash策略, 同时启动多线程访问, pod有几个,开几个多线程.

<think>好的,我现在需要帮助用户在Kubernetes集群中对部署的微服务进行负载均衡测试。用户提到了配置Service、Ingress或使用外部工具的方法。首先,我得回忆一下Kubernetes负载均衡的相关知识,并结合提供的引用内容来组织回答。 首先,根据引用[1]和[2],Kubernetes的Service资源是实现负载均衡的基础。Service通过选择器(Selector)将流量分发到一组Pod,提供ClusterIP、NodePort、LoadBalancer等类型。用户可能需要先配置Service,确保后端Pod被正确关联,然后进行测试。例如,创建ClusterIP Service后,可以通过kubectl port-forward或临时Pod进行内部访问测试,检查请求是否被均匀分配到各个Pod。 接下来是Ingress,引用[3]和[4]提到Ingress作为全局代理,管理外部访问。用户可能需要部署Ingress Controller,比如Nginx或Traefik,并定义Ingress规则来路由流量。测试时,需要验证不同的URL路径是否正确地路由到对应的Service,同时观察负载均衡效果。例如,使用curl命令多次访问Ingress的入口点,查看后端Pod的日志,确认请求分布是否均衡。 关于外部工具,用户可能想使用像Apache Bench或JMeter进行压力测试。这部分需要指导用户如何部署这些工具到集群中,或者从外部发起请求,监控Service或Ingress的性能。同时,可能需要调整负载均衡算法,比如通过配置Nginx Ingress的注解来实现轮询或最少连接策略。 然后需要考虑性能监控和调优。例如,使用kubectl top查看资源使用情况,或者集成Prometheus和Grafana进行指标收集和可视化。引用[4]中的RBAC启用步骤可能在此处相关,特别是在部署监控工具时需要注意权限设置。 最后,用户可能需要验证高可用性和故障转移。比如,手动终止某个Pod,观察Service是否自动将流量转移到其他健康的Pod,确保负载均衡的稳定性。 在组织回答时,需要分步骤说明,确保结构清晰。每一步都结合引用中的内容,比如Service的配置参考引用[2],Ingress部分参考引用[3]和[4]。同时,提醒用户注意实际测试中的观察点,如日志查看、性能指标监控等。 可能还需要生成相关问题,比如如何选择Service类型、Ingress控制器的比较、性能调优方法等,这些都需要基于现有内容扩展,确保问题与回答内容相关,帮助用户深入理解。</think>在Kubernetes集群中对微服务进行负载均衡测试,需结合Service、Ingress及外部工具分步骤实施。以下是具体方法和调优策略: --- ### 一、通过Service实现基础负载均衡 1. **配置Service类型** - 使用`ClusterIP`(默认内部访问)或`LoadBalancer`(云平台自动分配外部IP)[^2] - 示例YAML: ```yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-microservice ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer ``` 2. **测试方法** - **内部访问**:通过临时Pod发起连续请求 ```bash kubectl run test-pod --image=busybox -- sh -c "while true; do wget -qO- my-service.default.svc.cluster.local; sleep 1; done" ``` - **外部访问**:若为`LoadBalancer`类型,通过云平台提供的IP直接测试 - **观测负载分布**:查看各Pod日志,确认请求是否均匀分配 ```bash kubectl logs -l app=my-microservice --tail=1 ``` --- ### 二、通过Ingress实现高级流量管理 1. **部署Ingress Controller** - 参考引用[4],以Traefik为例启用RBAC并部署: ```bash kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.9/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml ``` 2. **配置Ingress规则** - 定义路径路由与负载均衡策略: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: traefik.ingress.kubernetes.io/load-balancer-method: drr # 动态轮询 spec: rules: - http: paths: - path: /api pathType: Prefix backend: service: name: my-service port: number: 80 ``` 3. **测试方法** - 使用`curl`模拟多请求: ```bash for i in {1..100}; do curl http://<INGRESS_IP>/api; done ``` - 观测后端Pod的请求分布,验证是否实现负载均衡[^3] --- ### 三、使用外部工具进行压力测试 1. **选择工具** - **Apache Bench**:快速发起并发请求 ```bash ab -n 1000 -c 50 http://<SERVICE_IP>/endpoint ``` - **JMeter**:图形化界面配置复杂场景 - **Locust**:支持分布式压测及实时监控 2. **集成Kubernetes监控** - 通过Metrics Server查看实时资源使用: ```bash kubectl top pods -l app=my-microservice ``` - 使用Prometheus+Grafana分析流量分布与延迟[^4] --- ### 四、调优与验证 1. **负载均衡算法调整** - Nginx Ingress:添加注解`nginx.ingress.kubernetes.io/load-balance: ewma`(加权最少连接) - 调整Service的`sessionAffinity: ClientIP`实现会话保持 2. **故障注入测试** - 随机删除Pod验证自愈能力: ```bash kubectl delete pod --random -l app=my-microservice ``` - 观测Service是否自动将流量切换到健康节点[^1] ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值