Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着kubernetes用户的激增,用户场景的不断丰富,又产生了一些新的负载均衡机制。目前,kubernetes中的负载均衡大致可以分为以下几种机制,每种机制都有其特定的应用场景:
- Service:直接用Service提供cluster内部的负载均衡,并借助cloud provider提供的LB提供外部访问
- Ingress Controller:还是用Service提供cluster内部的负载均衡,但是通过自定义LB提供外部访问
- Service Load Balancer:把load balancer直接跑在容器中,实现Bare Metal的Service Load Balancer
- Custom Load Balancer:自定义负载均衡,并替代kube-proxy,一般在物理部署Kubernetes时使用,方便接入公司已有的外部服务
Service
Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保证后端容器的正常运行。
Service有三种类型:
- ClusterIP:默认类型,自动分配一个仅cluster内部可以访问的虚拟IP
- NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过
<NodeIP>:NodePort
来访问改服务 - LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到
<NodeIP>:NodePort
另外,也可以讲已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建Service的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。
Ingress Controller
Service虽然解决了服务发现和负载均衡的问题,但它在使用上还是有一些限制,比如
- 只支持4层负载均衡,没有7层功能
- 对外访问的时候,NodePort类型需要在外部搭建额外的负载均衡,而LoadBalancer要求kubernetes必须跑在支持的cloud provider上面
Ingress就是为了解决这些限制而引入的新资源,主要用来将服务暴露到cluster外面,并且可以自定义服务的访问策略。比如想要通过负载均衡器实现不同子域名到不同服务的访问:
foo.bar.com --| |-> foo.bar.com s1:80
| 178.91.123.132 |
bar.foo.com --| |-> bar.foo.com s2:80
可以这样来定义Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
注意Ingress本身并不会自动创建负载均衡器,cluster中需要运行一个ingress controller来根据Ingress的定义来管理负载均衡器。目前社区提供了nginx和gce的参考实现。
Service Load Balancer
在Ingress出现以前,Service Load Balancer是推荐的解决Service局限性的方式。Service Load Balancer将haproxy跑在容器中,并监控service和endpoint的变化,通过容器IP对外提供4层和7层负载均衡服务。
社区提供的Service Load Balancer支持四种负载均衡协议:TCP、HTTP、HTTPS和SSL TERMINATION,并支持ACL访问控制。
Custom Load Balancer
虽然Kubernetes提供了丰富的负载均衡机制,但在实际使用的时候,还是会碰到一些复杂的场景是它不能支持的,比如
- 接入已有的负载均衡设备
- 多租户网络情况下,容器网络和主机网络是隔离的,这样
kube-proxy
就不能正常工作
这个时候就可以自定义组件,并代替kube-proxy来做负载均衡。基本的思路是监控kubernetes中service和endpoints的变化,并根据这些变化来配置负载均衡器。比如weave flux、nginx plus、kube2haproxy等
参考资料
- http://kubernetes.io/docs/user-guide/services/
- http://kubernetes.io/docs/user-guide/ingress/
- https://github.com/kubernetes/contrib/tree/master/service-loadbalancer
- https://www.nginx.com/blog/load-balancing-kubernetes-services-nginx-plus/
- https://github.com/weaveworks/flux
- https://github.com/AdoHe/kube2haproxy
https://sanwen8.cn/p/3a6ywXV.html
相关推荐
Kubernetes Service负载均衡性能优化.pdf
Heptio Gimbal是一个入口负载平衡平台,可以将流量路由到多个Kubernetes和OpenStack群集。 由Heptio与Actapio合作建造。
Kubernetes集群中多节点合作博弈负载均衡策略.docx
Porter 是一款适用于物理机部署 Kubernetes 的负载均衡器,该负载均衡器使用物理交换机实现,利用 BGP 和 ECMP 从而达到性能最优和高可用性。我们知道在云上部署的 Kubernetes 环境下,通常云服务厂商会提供 cloud ...
Kubernetes私有集群负载均衡器终极解决方案MetalLB.docx
OpenELB 允许用户在裸机、egde 和虚拟化环境中创建LoadBalancer 服务以供外部访问,并提供与基于云的负载均衡器相同的用户体验。核心功能BGP模式和二层模式下的负载分担ECMP 路由和负载平衡IP地址池管理使用 CRD 的...
它带有一个约250个LOC kubernetes小型客户端,可以找到服务端点。 因此,它不会膨胀您的二进制文件。用法// Import the moduleimport "github....
kube-vip 高可用性和负载平衡概述用于控制平面和 Kubernetes 服务的 Kubernetes 虚拟 IP 和负载均衡器kube-vip背后的想法是一个适用于所有环境的小型独立的高可用性选项,尤其是: 裸机边缘(手臂/树莓派) 虚拟化...
用于控制平面和Kubernetes服务的Kubernetes虚拟IP和负载均衡器 kube-vip背后的想法是一个针对所有环境的小型独立的高度可用选项,尤其是: 裸机 Edge(手臂/ Raspberry PI) 虚拟化 几乎其他任何地方:) 注意现在...
负载均衡和服务发现 跨机器和跨地区的集群调度 自动伸缩 无状态服务和有状态服务 广泛的Volume支持 插件机制保证扩展性 Kubernetes发展非常迅速,已经成为容器编排领域的领导者。Kubernetes的中文资料也非常丰富,但...
Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制/多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复功能、服务滚动升级和在线扩容能力、可扩展...
服务拆分与服务发现:Service Kubernetes提供简单的负载均衡 负载均衡:基于IPVS或者Iptables的简单均衡机制 在原始的时候一个应用跑到集群上,可能会把应用服务治理的逻辑写到代码里面,这样就会
欧昌华-基于 Nginx 的负载均衡器在 K8S 中的实践.pdf 彭超:瓜子云的落地.pdf 如何落地TensorFlow on Kubernetes.pdf 如何用OpenStack和Kubernetes快速搭建一个容器和虚拟机组合服务的云平台.pptx 孙杰:大型企业云...
Kubernetes端点代理用于负载均衡Kubernetes端点的HAProxy。 对于在Mesos / Mesosphere DCOS上运行Kubernetes尤其有用。 这是因为在Kubernetes群集中,服务的端点端口和IP地址可能会更改。 该代理将监视端点中etcd的...
使用该文档可以部署一个高可用的kubernetes集群,并且实现高可用,搭配可视化界面以及监控的部署
08.Kubernetes横空出世背后的秘密 09.Kubernetes架构深度解析 10.Kubernets集群入门 11.Kubernetes集群部署实践 12.Kubernetes的分布式网络实践 13.Kubernetes Service的负载均衡和网络路由秘密 14.Kubernetes API和...
kubernetes的本质是一组...负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本 存储编排:可以根据容器自身的需求自动创建存储卷
Nginx负载均衡器 使用nginx作为负载均衡器的简单配置。 这用于在RKE2 kubernetes群集之前对流量进行负载平衡。 当前端口配置: HTTP入口流量为443 6443用于kubernetes API流量(kubectl等) 9345 for Agent->...
Ingress-controller是在Kubernetes上的一种负载均衡方式,它允许外部流量进入Kubernetes集群,实现对服务的访问和管理。本文将从多个角度详细阐述Ingress-controller,并特别介绍了Ingress-controller与Istio、...