我正在尝试在Kubernetes中设置一个入口控制器,该控制器将在同一服务中运行的两个(或更多)pod之间进行严格的切换。
我的测试设置是一个Kubernetes节点,部署两个nginx pod。然后使用NodePort服务公开部署。
然后我部署了一个入口控制器(我分别尝试了Kubernetes Nginx入口控制器和Nginx Kubernetes入口控制器),并为NodePort服务创建了一个入口规则。
我在每个nginx pod上编辑了index.html,所以其中一个显示"SERVER a";另一个"SERVER ",然后运行一个脚本,然后curl
运行NodePort服务100次。如果grep
是';SERVER x ';每次将其附加到输出文件中,然后在末尾计算每个文件的数量。
正如预期的那样,通过调用NodePort服务本身(它使用kube-proxy),我得到了完全随机的结果——pod之间的分配从50:50到80:20。
旋转入口控制器,我总是得到50:50和49:51之间的分割,这很好——默认的循环分配工作得很好。
然而,查看结果,我可以看到我已经连续4次卷曲同一个服务器,但我需要强制执行严格的交替a - b - a - b。我花了很多时间研究这个问题,尝试了不同的选项,但我找不到一个能做到这一点的设置。有人有什么建议吗?
我更愿意坚持使用我尝试过的一个入口控制器,但我愿意尝试不同的控制器,如果它能满足我的需要。
Nginx的默认行为类似于轮询只有。你可以使用它在Nginx ingress上执行大多数测试,通过不同的配置调整如果需要。
还有其他选项,例如您可以使用Istio服务网格.
您可以根据需要通过更改配置来负载平衡流量
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
阅读更多:https://istio.io/latest/docs/reference/config/networking/destination-rule/
,https://istio.io/latest/docs/reference/config/networking/destination-rule/LoadBalancerSettings
然而,我建议只有当有一个大型集群实现2-3个服务时才使用service mesh
更好地使用Nginx入口或haproxy-ingress也是个不错的选择。
看起来好像有两个版本的入口控制器
-
K8S社区一直在维护的是https://github.com/kubernetes/ingress-nginx
-
Nginx正在维护(开源&支付):https://github.com/nginxinc/kubernetes-ingress
第二个似乎在添加nginx.org/lb-method: “round_robin”
后做严格的轮询(仍在测试),而第一个在副本的
之间做50:50的聚合负载平衡。在我看来,这是一个重要的区别,但由于名字之间有很多混淆,它们之间的区别可以在这里看到
我在@hiiamelliott的评论帮助下写了这个答案…